From 4320a59416d50e487e70ce7571d9cc3a557597d3 Mon Sep 17 00:00:00 2001 From: Vincenzo Scamporlino Date: Mon, 10 Feb 2025 17:15:14 +0100 Subject: [PATCH 1/3] catalog: use entitiesBatch when applying conditional conditions Signed-off-by: Vincenzo Scamporlino --- .../src/service/CatalogBuilder.ts | 63 ++++++------------- 1 file changed, 19 insertions(+), 44 deletions(-) diff --git a/plugins/catalog-backend/src/service/CatalogBuilder.ts b/plugins/catalog-backend/src/service/CatalogBuilder.ts index ddf4b5d185..52119e4629 100644 --- a/plugins/catalog-backend/src/service/CatalogBuilder.ts +++ b/plugins/catalog-backend/src/service/CatalogBuilder.ts @@ -34,7 +34,7 @@ import { import { ScmIntegrations } from '@backstage/integration'; import { createHash } from 'crypto'; import { Router } from 'express'; -import lodash from 'lodash'; +import lodash, { keyBy } from 'lodash'; import { AuditorService, @@ -381,7 +381,7 @@ export class CatalogBuilder { return [ new FileReaderProcessor(), - new UrlReaderProcessor({ reader, logger, config }), + new UrlReaderProcessor({ reader, logger }), CodeOwnersProcessor.fromConfig(config, { logger, reader }), new AnnotateLocationEntityProcessor({ integrations }), ]; @@ -559,60 +559,35 @@ export class CatalogBuilder { const entitiesCatalog = new AuthorizedEntitiesCatalog( unauthorizedEntitiesCatalog, permissionsService, - permissionsRegistry - ? createConditionTransformer( - permissionsRegistry.getPermissionRuleset( - catalogEntityPermissionResourceRef, - ), - ) - : createConditionTransformer(this.permissionRules), + createConditionTransformer(this.permissionRules), ); - const catalogPermissionResource = { - resourceType: RESOURCE_TYPE_CATALOG_ENTITY, - getResources: async (resourceRefs: string[]) => { - const { entities } = await unauthorizedEntitiesCatalog.entities({ - credentials: await auth.getOwnServiceCredentials(), - filter: { - anyOf: resourceRefs.map(resourceRef => { - const { kind, namespace, name } = parseEntityRef(resourceRef); + const getResources = async (resourceRefs: string[]) => { + const { items } = await unauthorizedEntitiesCatalog.entitiesBatch({ + credentials: await auth.getOwnServiceCredentials(), + entityRefs: resourceRefs, + }); - return basicEntityFilter({ - kind, - 'metadata.namespace': namespace, - 'metadata.name': name, - }); - }), - }, - }); - - const entitiesByRef = Object.fromEntries( - entitiesResponseToObjects(entities) - .filter((x): x is Entity => Boolean(x)) - .map(entity => [stringifyEntityRef(entity), entity]), - ); - - return resourceRefs.map( - resourceRef => - entitiesByRef[stringifyEntityRef(parseEntityRef(resourceRef))], - ); - }, - permissions: this.permissions, - rules: this.permissionRules, - } as const; + return entitiesResponseToObjects(items).map(e => e || undefined); + }; let permissionIntegrationRouter: | ReturnType | undefined; if (permissionsRegistry) { permissionsRegistry.addResourceType({ - ...catalogPermissionResource, resourceRef: catalogEntityPermissionResourceRef, + getResources, + permissions: this.permissions, + rules: this.permissionRules, }); } else { - permissionIntegrationRouter = createPermissionIntegrationRouter( - catalogPermissionResource, - ); + permissionIntegrationRouter = createPermissionIntegrationRouter({ + resourceType: RESOURCE_TYPE_CATALOG_ENTITY, + getResources, + permissions: this.permissions, + rules: this.permissionRules, + }); } const locationStore = new DefaultLocationStore(dbClient); From cd372e41259f4e0dd79b9717c12fd4f53cf98dba Mon Sep 17 00:00:00 2001 From: Vincenzo Scamporlino Date: Mon, 10 Feb 2025 17:25:59 +0100 Subject: [PATCH 2/3] catalog: changeset Signed-off-by: Vincenzo Scamporlino --- .changeset/funny-ladybugs-pump.md | 5 +++++ plugins/catalog-backend/src/service/CatalogBuilder.ts | 4 +--- 2 files changed, 6 insertions(+), 3 deletions(-) create mode 100644 .changeset/funny-ladybugs-pump.md diff --git a/.changeset/funny-ladybugs-pump.md b/.changeset/funny-ladybugs-pump.md new file mode 100644 index 0000000000..2b3f17e974 --- /dev/null +++ b/.changeset/funny-ladybugs-pump.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-backend': patch +--- + +Improved performance when applying conditional decisions to entities within the permission framework. diff --git a/plugins/catalog-backend/src/service/CatalogBuilder.ts b/plugins/catalog-backend/src/service/CatalogBuilder.ts index 52119e4629..7bf3e377d8 100644 --- a/plugins/catalog-backend/src/service/CatalogBuilder.ts +++ b/plugins/catalog-backend/src/service/CatalogBuilder.ts @@ -26,15 +26,13 @@ import { FieldFormatEntityPolicy, makeValidator, NoForeignRootFieldsEntityPolicy, - parseEntityRef, SchemaValidEntityPolicy, - stringifyEntityRef, Validators, } from '@backstage/catalog-model'; import { ScmIntegrations } from '@backstage/integration'; import { createHash } from 'crypto'; import { Router } from 'express'; -import lodash, { keyBy } from 'lodash'; +import lodash from 'lodash'; import { AuditorService, From 253c912a9c3c3219621c69295602a615330d0270 Mon Sep 17 00:00:00 2001 From: Vincenzo Scamporlino Date: Tue, 11 Feb 2025 16:32:45 +0100 Subject: [PATCH 3/3] catalog: remove unused import Signed-off-by: Vincenzo Scamporlino --- plugins/catalog-backend/src/service/CatalogBuilder.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/plugins/catalog-backend/src/service/CatalogBuilder.ts b/plugins/catalog-backend/src/service/CatalogBuilder.ts index 7bf3e377d8..79121c86c5 100644 --- a/plugins/catalog-backend/src/service/CatalogBuilder.ts +++ b/plugins/catalog-backend/src/service/CatalogBuilder.ts @@ -114,7 +114,6 @@ import { createRouter } from './createRouter'; import { DefaultEntitiesCatalog } from './DefaultEntitiesCatalog'; import { DefaultLocationService } from './DefaultLocationService'; import { DefaultRefreshService } from './DefaultRefreshService'; -import { basicEntityFilter } from './request'; import { entitiesResponseToObjects } from './response'; import { catalogEntityPermissionResourceRef } from '@backstage/plugin-catalog-node/alpha';