From 1ae69b890a9c051629e039615dc28bd867b682c4 Mon Sep 17 00:00:00 2001 From: Johan Haals Date: Fri, 12 Feb 2021 08:38:20 +0100 Subject: [PATCH] scaffolder: Add registration step MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Fredrik Adelöw Co-authored-by: blam Co-authored-by: Patrik Oldsberg --- packages/backend/src/plugins/scaffolder.ts | 3 ++ .../src/scaffolder/stages/legacy.ts | 29 ++++++++++++++++++- .../src/scaffolder/tasks/TemplateConverter.ts | 9 ++++++ .../scaffolder-backend/src/service/router.ts | 6 ++-- plugins/scaffolder/package.json | 4 +-- 5 files changed, 46 insertions(+), 5 deletions(-) diff --git a/packages/backend/src/plugins/scaffolder.ts b/packages/backend/src/plugins/scaffolder.ts index 723165ff82..ae4b22759b 100644 --- a/packages/backend/src/plugins/scaffolder.ts +++ b/packages/backend/src/plugins/scaffolder.ts @@ -26,6 +26,7 @@ import { import { SingleHostDiscovery } from '@backstage/backend-common'; import type { PluginEnvironment } from '../types'; import Docker from 'dockerode'; +import { CatalogClient } from '@backstage/catalog-client'; export default async function createPlugin({ logger, @@ -46,6 +47,7 @@ export default async function createPlugin({ const discovery = SingleHostDiscovery.fromConfig(config); const entityClient = new CatalogEntityClient({ discovery }); + const catalogClient = new CatalogClient({ discoveryApi: discovery }); return await createRouter({ preparers, @@ -56,5 +58,6 @@ export default async function createPlugin({ dockerClient, entityClient, database, + catalogClient, }); } diff --git a/plugins/scaffolder-backend/src/scaffolder/stages/legacy.ts b/plugins/scaffolder-backend/src/scaffolder/stages/legacy.ts index f151780ba9..5cead565f1 100644 --- a/plugins/scaffolder-backend/src/scaffolder/stages/legacy.ts +++ b/plugins/scaffolder-backend/src/scaffolder/stages/legacy.ts @@ -19,19 +19,28 @@ import { FilePreparer, PreparerBuilder } from './prepare'; import Docker from 'dockerode'; import { TemplaterBuilder, TemplaterValues } from './templater'; import { PublisherBuilder } from './publish'; +import { CatalogApi } from '@backstage/catalog-client'; +import { getEntityName } from '@backstage/catalog-model'; type Options = { dockerClient: Docker; preparers: PreparerBuilder; templaters: TemplaterBuilder; publishers: PublisherBuilder; + catalogClient: CatalogApi; }; export function registerLegacyActions( registry: TemplateActionRegistry, options: Options, ) { - const { dockerClient, preparers, templaters, publishers } = options; + const { + dockerClient, + preparers, + templaters, + publishers, + catalogClient, + } = options; registry.register({ id: 'legacy:prepare', @@ -107,4 +116,22 @@ export function registerLegacyActions( } }, }); + + registry.register({ + id: 'catalog:register', + async handler(ctx) { + const { logger } = ctx; + const { catalogInfoUrl } = ctx.parameters; // TODO update schema + + logger.info(`Registering ${catalogInfoUrl} in the catalog`); + const result = await catalogClient.addLocation({ + type: 'url', + target: catalogInfoUrl as string, + }); + if (result.entities.length === 1) { + const { kind, name, namespace } = getEntityName(result.entities[0]); + ctx.output('entityRef', `${kind}:${namespace}/${name}`); + } + }, + }); } diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/TemplateConverter.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/TemplateConverter.ts index 48f31f73f2..20e8886884 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/TemplateConverter.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/TemplateConverter.ts @@ -76,6 +76,15 @@ export function templateEntityToSpec( }, }); + steps.push({ + id: 'register', + name: 'Register', + action: 'catalog:register', + parameters: { + catalogInfoUrl: '{{ steps.publish.output.catalogInfoUrl }}', + }, + }); + return { steps, output: { diff --git a/plugins/scaffolder-backend/src/service/router.ts b/plugins/scaffolder-backend/src/service/router.ts index 959e9e42c5..26be55d898 100644 --- a/plugins/scaffolder-backend/src/service/router.ts +++ b/plugins/scaffolder-backend/src/service/router.ts @@ -48,6 +48,7 @@ import { NotFoundError, PluginDatabaseManager, } from '@backstage/backend-common'; +import { CatalogClient } from '@backstage/catalog-client'; export interface RouterOptions { preparers: PreparerBuilder; @@ -59,6 +60,7 @@ export interface RouterOptions { dockerClient: Docker; entityClient: CatalogEntityClient; database: PluginDatabaseManager; + catalogClient: CatalogClient; } export async function createRouter( @@ -76,6 +78,7 @@ export async function createRouter( dockerClient, entityClient, database, + catalogClient, } = options; const logger = parentLogger.child({ plugin: 'scaffolder' }); @@ -99,6 +102,7 @@ export async function createRouter( preparers, publishers, templaters, + catalogClient, }); worker.start(); @@ -254,9 +258,7 @@ export async function createRouter( }) .get('/v2/tasks/:taskId', async (req, res) => { const { taskId } = req.params; - console.warn('getting task'); const task = await taskBroker.get(taskId); - console.warn('got task', task); if (!task) { throw new NotFoundError(`task with id ${taskId} does not exist`); } diff --git a/plugins/scaffolder/package.json b/plugins/scaffolder/package.json index 6f55d0114e..f602f01b5b 100644 --- a/plugins/scaffolder/package.json +++ b/plugins/scaffolder/package.json @@ -30,9 +30,10 @@ "clean": "backstage-cli clean" }, "dependencies": { + "@backstage/catalog-client": "^0.3.6", "@backstage/catalog-model": "^0.7.1", - "@backstage/core": "^0.6.1", "@backstage/config": "^0.1.2", + "@backstage/core": "^0.6.1", "@backstage/plugin-catalog-react": "^0.0.3", "@backstage/theme": "^0.2.3", "@material-ui/core": "^4.11.0", @@ -60,7 +61,6 @@ "@backstage/cli": "^0.6.0", "@backstage/dev-utils": "^0.1.10", "@backstage/test-utils": "^0.1.7", - "@backstage/catalog-client": "^0.3.6", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^10.4.1", "@testing-library/user-event": "^12.0.7",