From 7804597717f52cd7cb427e24fb44073e809fd83c Mon Sep 17 00:00:00 2001 From: lshwayne96 Date: Tue, 14 Nov 2023 16:51:42 +0800 Subject: [PATCH 1/6] Enable addition of permission rules for Catalog plugin through CatalogProcessingExtensionPoint Signed-off-by: lshwayne96 --- .changeset/wild-knives-wait.md | 6 ++++++ .../catalog-backend/src/service/CatalogPlugin.ts | 16 +++++++++++++++- plugins/catalog-node/package.json | 1 + plugins/catalog-node/src/extensions.ts | 6 ++++++ yarn.lock | 1 + 5 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 .changeset/wild-knives-wait.md diff --git a/.changeset/wild-knives-wait.md b/.changeset/wild-knives-wait.md new file mode 100644 index 0000000000..460712b5d9 --- /dev/null +++ b/.changeset/wild-knives-wait.md @@ -0,0 +1,6 @@ +--- +'@backstage/plugin-catalog-backend': minor +'@backstage/plugin-catalog-node': minor +--- + +Permission rules can now be added for the Catalog plugin through the `CatalogProcessingExtensionPoint` interface. diff --git a/plugins/catalog-backend/src/service/CatalogPlugin.ts b/plugins/catalog-backend/src/service/CatalogPlugin.ts index fa53ef510b..844f56e766 100644 --- a/plugins/catalog-backend/src/service/CatalogPlugin.ts +++ b/plugins/catalog-backend/src/service/CatalogPlugin.ts @@ -17,7 +17,7 @@ import { createBackendPlugin, coreServices, } from '@backstage/backend-plugin-api'; -import { CatalogBuilder } from './CatalogBuilder'; +import { CatalogBuilder, CatalogPermissionRuleInput } from './CatalogBuilder'; import { CatalogAnalysisExtensionPoint, catalogAnalysisExtensionPoint, @@ -38,6 +38,7 @@ class CatalogProcessingExtensionPointImpl #processors = new Array(); #entityProviders = new Array(); #placeholderResolvers: Record = {}; + #permissionRules = new Array(); addProcessor( ...processors: Array> @@ -59,6 +60,14 @@ class CatalogProcessingExtensionPointImpl this.#placeholderResolvers[key] = resolver; } + addPermissionRules( + ...rules: Array< + CatalogPermissionRuleInput | Array + > + ): void { + this.#permissionRules.push(...rules.flat()); + } + get processors() { return this.#processors; } @@ -70,6 +79,10 @@ class CatalogProcessingExtensionPointImpl get placeholderResolvers() { return this.#placeholderResolvers; } + + get permissionRules() { + return this.#permissionRules; + } } class CatalogAnalysisExtensionPointImpl @@ -142,6 +155,7 @@ export const catalogPlugin = createBackendPlugin({ ([key, resolver]) => builder.setPlaceholderResolver(key, resolver), ); builder.addLocationAnalyzers(...analysisExtensions.locationAnalyzers); + builder.addPermissionRules(...processingExtensions.permissionRules); const { processingEngine, router } = await builder.build(); diff --git a/plugins/catalog-node/package.json b/plugins/catalog-node/package.json index f76fde6ecf..841a7be4a5 100644 --- a/plugins/catalog-node/package.json +++ b/plugins/catalog-node/package.json @@ -46,6 +46,7 @@ "@backstage/catalog-client": "workspace:^", "@backstage/catalog-model": "workspace:^", "@backstage/errors": "workspace:^", + "@backstage/plugin-catalog-backend": "workspace:^", "@backstage/plugin-catalog-common": "workspace:^", "@backstage/types": "workspace:^" }, diff --git a/plugins/catalog-node/src/extensions.ts b/plugins/catalog-node/src/extensions.ts index 247ef142ad..02a18774cd 100644 --- a/plugins/catalog-node/src/extensions.ts +++ b/plugins/catalog-node/src/extensions.ts @@ -14,6 +14,7 @@ * limitations under the License. */ import { createExtensionPoint } from '@backstage/backend-plugin-api'; +import { CatalogPermissionRuleInput } from '@backstage/plugin-catalog-backend'; import { EntityProvider, CatalogProcessor, @@ -32,6 +33,11 @@ export interface CatalogProcessingExtensionPoint { ...providers: Array> ): void; addPlaceholderResolver(key: string, resolver: PlaceholderResolver): void; + addPermissionRules( + ...rules: Array< + CatalogPermissionRuleInput | Array + > + ): void; } /** diff --git a/yarn.lock b/yarn.lock index 19ca7d4edc..1d47eb1e10 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5939,6 +5939,7 @@ __metadata: "@backstage/catalog-model": "workspace:^" "@backstage/cli": "workspace:^" "@backstage/errors": "workspace:^" + "@backstage/plugin-catalog-backend": "workspace:^" "@backstage/plugin-catalog-common": "workspace:^" "@backstage/types": "workspace:^" languageName: unknown From 447a1b8975bbe4a034331038764c82ce86d31704 Mon Sep 17 00:00:00 2001 From: lshwayne96 Date: Tue, 14 Nov 2023 17:42:00 +0800 Subject: [PATCH 2/6] Updated API report for plugins/catalog-node Signed-off-by: lshwayne96 --- plugins/catalog-node/api-report-alpha.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/plugins/catalog-node/api-report-alpha.md b/plugins/catalog-node/api-report-alpha.md index c4dc6b12e1..e4918c93aa 100644 --- a/plugins/catalog-node/api-report-alpha.md +++ b/plugins/catalog-node/api-report-alpha.md @@ -4,6 +4,7 @@ ```ts import { CatalogApi } from '@backstage/catalog-client'; +import { CatalogPermissionRuleInput } from '@backstage/plugin-catalog-backend'; import { CatalogProcessor } from '@backstage/plugin-catalog-node'; import { EntityProvider } from '@backstage/plugin-catalog-node'; import { ExtensionPoint } from '@backstage/backend-plugin-api'; @@ -27,6 +28,12 @@ export interface CatalogProcessingExtensionPoint { ...providers: Array> ): void; // (undocumented) + addPermissionRules( + ...rules: Array< + CatalogPermissionRuleInput | Array + > + ): void; + // (undocumented) addPlaceholderResolver(key: string, resolver: PlaceholderResolver): void; // (undocumented) addProcessor( From 2815828be53645d7dda95e8f591061d5cf54dd9d Mon Sep 17 00:00:00 2001 From: lshwayne96 Date: Wed, 15 Nov 2023 11:32:55 +0800 Subject: [PATCH 3/6] Remove catalog-backend dependency from catalog-node plugin Signed-off-by: lshwayne96 --- plugins/catalog-node/package.json | 1 - yarn.lock | 1 - 2 files changed, 2 deletions(-) diff --git a/plugins/catalog-node/package.json b/plugins/catalog-node/package.json index 841a7be4a5..f76fde6ecf 100644 --- a/plugins/catalog-node/package.json +++ b/plugins/catalog-node/package.json @@ -46,7 +46,6 @@ "@backstage/catalog-client": "workspace:^", "@backstage/catalog-model": "workspace:^", "@backstage/errors": "workspace:^", - "@backstage/plugin-catalog-backend": "workspace:^", "@backstage/plugin-catalog-common": "workspace:^", "@backstage/types": "workspace:^" }, diff --git a/yarn.lock b/yarn.lock index 1d47eb1e10..19ca7d4edc 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5939,7 +5939,6 @@ __metadata: "@backstage/catalog-model": "workspace:^" "@backstage/cli": "workspace:^" "@backstage/errors": "workspace:^" - "@backstage/plugin-catalog-backend": "workspace:^" "@backstage/plugin-catalog-common": "workspace:^" "@backstage/types": "workspace:^" languageName: unknown From c94ed08d16cc10a1fb8e47ef2c3665688b1a1512 Mon Sep 17 00:00:00 2001 From: lshwayne96 Date: Thu, 16 Nov 2023 13:27:16 +0800 Subject: [PATCH 4/6] Define CatalogPermissionRuleInput type in catalog-node plugin Signed-off-by: lshwayne96 --- plugins/catalog-node/package.json | 2 ++ plugins/catalog-node/src/extensions.ts | 12 +++++++++++- yarn.lock | 2 ++ 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/plugins/catalog-node/package.json b/plugins/catalog-node/package.json index f76fde6ecf..85ca35831c 100644 --- a/plugins/catalog-node/package.json +++ b/plugins/catalog-node/package.json @@ -47,6 +47,8 @@ "@backstage/catalog-model": "workspace:^", "@backstage/errors": "workspace:^", "@backstage/plugin-catalog-common": "workspace:^", + "@backstage/plugin-permission-common": "workspace:^", + "@backstage/plugin-permission-node": "workspace:^", "@backstage/types": "workspace:^" }, "devDependencies": { diff --git a/plugins/catalog-node/src/extensions.ts b/plugins/catalog-node/src/extensions.ts index 02a18774cd..6516653150 100644 --- a/plugins/catalog-node/src/extensions.ts +++ b/plugins/catalog-node/src/extensions.ts @@ -14,7 +14,9 @@ * limitations under the License. */ import { createExtensionPoint } from '@backstage/backend-plugin-api'; -import { CatalogPermissionRuleInput } from '@backstage/plugin-catalog-backend'; +import { Entity } from '@backstage/catalog-model'; +import { PermissionRuleParams } from '@backstage/plugin-permission-common'; +import { PermissionRule } from '@backstage/plugin-permission-node'; import { EntityProvider, CatalogProcessor, @@ -22,6 +24,14 @@ import { ScmLocationAnalyzer, } from '@backstage/plugin-catalog-node'; +type EntitiesSearchFilter = { + key: string; + values?: string[]; +}; +type CatalogPermissionRuleInput< + TParams extends PermissionRuleParams = PermissionRuleParams, +> = PermissionRule; + /** * @alpha */ diff --git a/yarn.lock b/yarn.lock index 19ca7d4edc..35345de358 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5940,6 +5940,8 @@ __metadata: "@backstage/cli": "workspace:^" "@backstage/errors": "workspace:^" "@backstage/plugin-catalog-common": "workspace:^" + "@backstage/plugin-permission-common": "workspace:^" + "@backstage/plugin-permission-node": "workspace:^" "@backstage/types": "workspace:^" languageName: unknown linkType: soft From 24ab4464e70419e3d2a6e30ff9fb03bc53fc0b0d Mon Sep 17 00:00:00 2001 From: lshwayne96 Date: Thu, 16 Nov 2023 14:14:23 +0800 Subject: [PATCH 5/6] Export new types and update API report Signed-off-by: lshwayne96 --- plugins/catalog-node/api-report-alpha.md | 15 ++++++++++++++- plugins/catalog-node/src/alpha.ts | 4 ++++ plugins/catalog-node/src/extensions.ts | 11 +++++++++-- 3 files changed, 27 insertions(+), 3 deletions(-) diff --git a/plugins/catalog-node/api-report-alpha.md b/plugins/catalog-node/api-report-alpha.md index e4918c93aa..676115c4d9 100644 --- a/plugins/catalog-node/api-report-alpha.md +++ b/plugins/catalog-node/api-report-alpha.md @@ -4,10 +4,12 @@ ```ts import { CatalogApi } from '@backstage/catalog-client'; -import { CatalogPermissionRuleInput } from '@backstage/plugin-catalog-backend'; import { CatalogProcessor } from '@backstage/plugin-catalog-node'; +import { Entity } from '@backstage/catalog-model'; import { EntityProvider } from '@backstage/plugin-catalog-node'; import { ExtensionPoint } from '@backstage/backend-plugin-api'; +import { PermissionRule } from '@backstage/plugin-permission-node'; +import { PermissionRuleParams } from '@backstage/plugin-permission-common'; import { PlaceholderResolver } from '@backstage/plugin-catalog-node'; import { ScmLocationAnalyzer } from '@backstage/plugin-catalog-node'; import { ServiceRef } from '@backstage/backend-plugin-api'; @@ -21,6 +23,11 @@ export interface CatalogAnalysisExtensionPoint { // @alpha (undocumented) export const catalogAnalysisExtensionPoint: ExtensionPoint; +// @alpha (undocumented) +export type CatalogPermissionRuleInput< + TParams extends PermissionRuleParams = PermissionRuleParams, +> = PermissionRule; + // @alpha (undocumented) export interface CatalogProcessingExtensionPoint { // (undocumented) @@ -47,5 +54,11 @@ export const catalogProcessingExtensionPoint: ExtensionPoint; +// @alpha (undocumented) +export type EntitiesSearchFilter = { + key: string; + values?: string[]; +}; + // (No @packageDocumentation comment for this package) ``` diff --git a/plugins/catalog-node/src/alpha.ts b/plugins/catalog-node/src/alpha.ts index cec1a0eedb..3d6194f986 100644 --- a/plugins/catalog-node/src/alpha.ts +++ b/plugins/catalog-node/src/alpha.ts @@ -19,3 +19,7 @@ export type { CatalogProcessingExtensionPoint } from './extensions'; export { catalogProcessingExtensionPoint } from './extensions'; export type { CatalogAnalysisExtensionPoint } from './extensions'; export { catalogAnalysisExtensionPoint } from './extensions'; +export type { + EntitiesSearchFilter, + CatalogPermissionRuleInput, +} from './extensions'; diff --git a/plugins/catalog-node/src/extensions.ts b/plugins/catalog-node/src/extensions.ts index 6516653150..a165cd15cc 100644 --- a/plugins/catalog-node/src/extensions.ts +++ b/plugins/catalog-node/src/extensions.ts @@ -24,11 +24,18 @@ import { ScmLocationAnalyzer, } from '@backstage/plugin-catalog-node'; -type EntitiesSearchFilter = { +/** + * @alpha + */ +export type EntitiesSearchFilter = { key: string; values?: string[]; }; -type CatalogPermissionRuleInput< + +/** + * @alpha + */ +export type CatalogPermissionRuleInput< TParams extends PermissionRuleParams = PermissionRuleParams, > = PermissionRule; From 1663303ab8446b008cfd0547af588605248a11ad Mon Sep 17 00:00:00 2001 From: lshwayne96 Date: Thu, 23 Nov 2023 10:50:23 +0800 Subject: [PATCH 6/6] Add new extension point for catalog permissions Signed-off-by: lshwayne96 --- .changeset/wild-knives-wait.md | 2 +- .../src/service/CatalogPlugin.ts | 41 ++++++++----- plugins/catalog-node/api-report-alpha.md | 19 ++++-- plugins/catalog-node/src/alpha.ts | 2 + plugins/catalog-node/src/extensions.ts | 60 ++++++++++++------- 5 files changed, 80 insertions(+), 44 deletions(-) diff --git a/.changeset/wild-knives-wait.md b/.changeset/wild-knives-wait.md index 460712b5d9..6aafbe7acd 100644 --- a/.changeset/wild-knives-wait.md +++ b/.changeset/wild-knives-wait.md @@ -3,4 +3,4 @@ '@backstage/plugin-catalog-node': minor --- -Permission rules can now be added for the Catalog plugin through the `CatalogProcessingExtensionPoint` interface. +Permission rules can now be added for the Catalog plugin through the `CatalogPermissionExtensionPoint` interface. diff --git a/plugins/catalog-backend/src/service/CatalogPlugin.ts b/plugins/catalog-backend/src/service/CatalogPlugin.ts index 844f56e766..0800d41340 100644 --- a/plugins/catalog-backend/src/service/CatalogPlugin.ts +++ b/plugins/catalog-backend/src/service/CatalogPlugin.ts @@ -23,6 +23,8 @@ import { catalogAnalysisExtensionPoint, CatalogProcessingExtensionPoint, catalogProcessingExtensionPoint, + CatalogPermissionExtensionPoint, + catalogPermissionExtensionPoint, } from '@backstage/plugin-catalog-node/alpha'; import { CatalogProcessor, @@ -38,7 +40,6 @@ class CatalogProcessingExtensionPointImpl #processors = new Array(); #entityProviders = new Array(); #placeholderResolvers: Record = {}; - #permissionRules = new Array(); addProcessor( ...processors: Array> @@ -60,14 +61,6 @@ class CatalogProcessingExtensionPointImpl this.#placeholderResolvers[key] = resolver; } - addPermissionRules( - ...rules: Array< - CatalogPermissionRuleInput | Array - > - ): void { - this.#permissionRules.push(...rules.flat()); - } - get processors() { return this.#processors; } @@ -79,10 +72,6 @@ class CatalogProcessingExtensionPointImpl get placeholderResolvers() { return this.#placeholderResolvers; } - - get permissionRules() { - return this.#permissionRules; - } } class CatalogAnalysisExtensionPointImpl @@ -99,6 +88,24 @@ class CatalogAnalysisExtensionPointImpl } } +class CatalogPermissionExtensionPointImpl + implements CatalogPermissionExtensionPoint +{ + #permissionRules = new Array(); + + addPermissionRules( + ...rules: Array< + CatalogPermissionRuleInput | Array + > + ): void { + this.#permissionRules.push(...rules.flat()); + } + + get permissionRules() { + return this.#permissionRules; + } +} + /** * Catalog plugin * @alpha @@ -119,6 +126,12 @@ export const catalogPlugin = createBackendPlugin({ analysisExtensions, ); + const permissionExtensions = new CatalogPermissionExtensionPointImpl(); + env.registerExtensionPoint( + catalogPermissionExtensionPoint, + permissionExtensions, + ); + env.registerInit({ deps: { logger: coreServices.logger, @@ -155,7 +168,7 @@ export const catalogPlugin = createBackendPlugin({ ([key, resolver]) => builder.setPlaceholderResolver(key, resolver), ); builder.addLocationAnalyzers(...analysisExtensions.locationAnalyzers); - builder.addPermissionRules(...processingExtensions.permissionRules); + builder.addPermissionRules(...permissionExtensions.permissionRules); const { processingEngine, router } = await builder.build(); diff --git a/plugins/catalog-node/api-report-alpha.md b/plugins/catalog-node/api-report-alpha.md index 676115c4d9..7350f9262c 100644 --- a/plugins/catalog-node/api-report-alpha.md +++ b/plugins/catalog-node/api-report-alpha.md @@ -23,6 +23,19 @@ export interface CatalogAnalysisExtensionPoint { // @alpha (undocumented) export const catalogAnalysisExtensionPoint: ExtensionPoint; +// @alpha (undocumented) +export interface CatalogPermissionExtensionPoint { + // (undocumented) + addPermissionRules( + ...rules: Array< + CatalogPermissionRuleInput | Array + > + ): void; +} + +// @alpha (undocumented) +export const catalogPermissionExtensionPoint: ExtensionPoint; + // @alpha (undocumented) export type CatalogPermissionRuleInput< TParams extends PermissionRuleParams = PermissionRuleParams, @@ -35,12 +48,6 @@ export interface CatalogProcessingExtensionPoint { ...providers: Array> ): void; // (undocumented) - addPermissionRules( - ...rules: Array< - CatalogPermissionRuleInput | Array - > - ): void; - // (undocumented) addPlaceholderResolver(key: string, resolver: PlaceholderResolver): void; // (undocumented) addProcessor( diff --git a/plugins/catalog-node/src/alpha.ts b/plugins/catalog-node/src/alpha.ts index 3d6194f986..f7b2ceac12 100644 --- a/plugins/catalog-node/src/alpha.ts +++ b/plugins/catalog-node/src/alpha.ts @@ -23,3 +23,5 @@ export type { EntitiesSearchFilter, CatalogPermissionRuleInput, } from './extensions'; +export type { CatalogPermissionExtensionPoint } from './extensions'; +export { catalogPermissionExtensionPoint } from './extensions'; diff --git a/plugins/catalog-node/src/extensions.ts b/plugins/catalog-node/src/extensions.ts index a165cd15cc..2dd0915ccf 100644 --- a/plugins/catalog-node/src/extensions.ts +++ b/plugins/catalog-node/src/extensions.ts @@ -14,30 +14,15 @@ * limitations under the License. */ import { createExtensionPoint } from '@backstage/backend-plugin-api'; -import { Entity } from '@backstage/catalog-model'; -import { PermissionRuleParams } from '@backstage/plugin-permission-common'; -import { PermissionRule } from '@backstage/plugin-permission-node'; import { EntityProvider, CatalogProcessor, PlaceholderResolver, ScmLocationAnalyzer, } from '@backstage/plugin-catalog-node'; - -/** - * @alpha - */ -export type EntitiesSearchFilter = { - key: string; - values?: string[]; -}; - -/** - * @alpha - */ -export type CatalogPermissionRuleInput< - TParams extends PermissionRuleParams = PermissionRuleParams, -> = PermissionRule; +import { Entity } from '@backstage/catalog-model'; +import { PermissionRuleParams } from '@backstage/plugin-permission-common'; +import { PermissionRule } from '@backstage/plugin-permission-node'; /** * @alpha @@ -50,11 +35,6 @@ export interface CatalogProcessingExtensionPoint { ...providers: Array> ): void; addPlaceholderResolver(key: string, resolver: PlaceholderResolver): void; - addPermissionRules( - ...rules: Array< - CatalogPermissionRuleInput | Array - > - ): void; } /** @@ -79,3 +59,37 @@ export const catalogAnalysisExtensionPoint = createExtensionPoint({ id: 'catalog.analysis', }); + +/** + * @alpha + */ +export type EntitiesSearchFilter = { + key: string; + values?: string[]; +}; + +/** + * @alpha + */ +export type CatalogPermissionRuleInput< + TParams extends PermissionRuleParams = PermissionRuleParams, +> = PermissionRule; + +/** + * @alpha + */ +export interface CatalogPermissionExtensionPoint { + addPermissionRules( + ...rules: Array< + CatalogPermissionRuleInput | Array + > + ): void; +} + +/** + * @alpha + */ +export const catalogPermissionExtensionPoint = + createExtensionPoint({ + id: 'catalog.permission', + });