From b8cccd8ee858dbcb69514e7766593f235bf7cfba Mon Sep 17 00:00:00 2001 From: Phil Kuang Date: Wed, 2 Aug 2023 15:42:27 -0400 Subject: [PATCH] feat(AnnotateScmSlughEntityProcessor): support configuring applicable kinds Signed-off-by: Phil Kuang --- .changeset/little-penguins-build.md | 5 ++ plugins/catalog-backend/api-report.md | 12 +++- .../AnnotateScmSlugEntityProcessor.test.ts | 67 +++++++++++++++++++ .../core/AnnotateScmSlugEntityProcessor.ts | 19 +++++- 4 files changed, 98 insertions(+), 5 deletions(-) create mode 100644 .changeset/little-penguins-build.md diff --git a/.changeset/little-penguins-build.md b/.changeset/little-penguins-build.md new file mode 100644 index 0000000000..9e54a566e2 --- /dev/null +++ b/.changeset/little-penguins-build.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-backend': minor +--- + +Support configuring applicable kinds for `AnnotateScmSlugEntityProcessor` diff --git a/plugins/catalog-backend/api-report.md b/plugins/catalog-backend/api-report.md index 84d8de4753..345874d919 100644 --- a/plugins/catalog-backend/api-report.md +++ b/plugins/catalog-backend/api-report.md @@ -91,9 +91,17 @@ export class AnnotateLocationEntityProcessor implements CatalogProcessor_2 { // @public (undocumented) export class AnnotateScmSlugEntityProcessor implements CatalogProcessor_2 { - constructor(opts: { scmIntegrationRegistry: ScmIntegrationRegistry }); + constructor(opts: { + scmIntegrationRegistry: ScmIntegrationRegistry; + kinds?: string[]; + }); // (undocumented) - static fromConfig(config: Config): AnnotateScmSlugEntityProcessor; + static fromConfig( + config: Config, + options?: { + kinds?: string[]; + }, + ): AnnotateScmSlugEntityProcessor; // (undocumented) getProcessorName(): string; // (undocumented) diff --git a/plugins/catalog-backend/src/modules/core/AnnotateScmSlugEntityProcessor.test.ts b/plugins/catalog-backend/src/modules/core/AnnotateScmSlugEntityProcessor.test.ts index bafac6e3ac..0cde9417db 100644 --- a/plugins/catalog-backend/src/modules/core/AnnotateScmSlugEntityProcessor.test.ts +++ b/plugins/catalog-backend/src/modules/core/AnnotateScmSlugEntityProcessor.test.ts @@ -109,6 +109,73 @@ describe('AnnotateScmSlugEntityProcessor', () => { }, }); }); + + it('should only process applicable kinds', async () => { + const component: Entity = { + apiVersion: 'backstage.io/v1alpha1', + kind: 'Component', + metadata: { + name: 'my-component', + }, + }; + + const api: Entity = { + apiVersion: 'backstage.io/v1alpha1', + kind: 'API', + metadata: { + name: 'my-component', + }, + }; + + const system: Entity = { + apiVersion: 'backstage.io/v1alpha1', + kind: 'System', + metadata: { + name: 'my-component', + }, + }; + + const location: LocationSpec = { + type: 'url', + target: + 'https://github.com/backstage/backstage/blob/master/catalog-info.yaml', + }; + + const processor = AnnotateScmSlugEntityProcessor.fromConfig( + new ConfigReader({}), + { kinds: ['API', 'System'] }, + ); + + expect(await processor.preProcessEntity(component, location)).toEqual({ + apiVersion: 'backstage.io/v1alpha1', + kind: 'Component', + metadata: { + name: 'my-component', + }, + }); + + expect(await processor.preProcessEntity(api, location)).toEqual({ + apiVersion: 'backstage.io/v1alpha1', + kind: 'API', + metadata: { + name: 'my-component', + annotations: { + 'github.com/project-slug': 'backstage/backstage', + }, + }, + }); + + expect(await processor.preProcessEntity(system, location)).toEqual({ + apiVersion: 'backstage.io/v1alpha1', + kind: 'System', + metadata: { + name: 'my-component', + annotations: { + 'github.com/project-slug': 'backstage/backstage', + }, + }, + }); + }); }); describe('gitlab', () => { it('adds annotation', async () => { diff --git a/plugins/catalog-backend/src/modules/core/AnnotateScmSlugEntityProcessor.ts b/plugins/catalog-backend/src/modules/core/AnnotateScmSlugEntityProcessor.ts index 2c18ba1d7d..241a27433e 100644 --- a/plugins/catalog-backend/src/modules/core/AnnotateScmSlugEntityProcessor.ts +++ b/plugins/catalog-backend/src/modules/core/AnnotateScmSlugEntityProcessor.ts @@ -31,16 +31,23 @@ const GITLAB_ACTIONS_ANNOTATION = 'gitlab.com/project-slug'; /** @public */ export class AnnotateScmSlugEntityProcessor implements CatalogProcessor { constructor( - private readonly opts: { scmIntegrationRegistry: ScmIntegrationRegistry }, + private readonly opts: { + scmIntegrationRegistry: ScmIntegrationRegistry; + kinds?: string[]; + }, ) {} getProcessorName(): string { return 'AnnotateScmSlugEntityProcessor'; } - static fromConfig(config: Config): AnnotateScmSlugEntityProcessor { + static fromConfig( + config: Config, + options?: { kinds?: string[] }, + ): AnnotateScmSlugEntityProcessor { return new AnnotateScmSlugEntityProcessor({ scmIntegrationRegistry: ScmIntegrations.fromConfig(config), + kinds: options?.kinds, }); } @@ -48,7 +55,13 @@ export class AnnotateScmSlugEntityProcessor implements CatalogProcessor { entity: Entity, location: LocationSpec, ): Promise { - if (entity.kind !== 'Component' || location.type !== 'url') { + const applicableKinds = (this.opts.kinds ?? ['Component']).map(k => + k.toLocaleLowerCase('en-US'), + ); + if ( + !applicableKinds.includes(entity.kind.toLocaleLowerCase('en-US')) || + location.type !== 'url' + ) { return entity; }