diff --git a/.changeset/ten-spoons-help.md b/.changeset/ten-spoons-help.md new file mode 100644 index 0000000000..5089154424 --- /dev/null +++ b/.changeset/ten-spoons-help.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-tech-insights-node': minor +--- + +**BREAKING**: The `FactRetrieverContext` type now contains an additional `auth` field. diff --git a/.changeset/thick-pillows-develop.md b/.changeset/thick-pillows-develop.md new file mode 100644 index 0000000000..9be71da55d --- /dev/null +++ b/.changeset/thick-pillows-develop.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-tech-insights-backend': patch +--- + +Added support for the new `AuthService`. diff --git a/plugins/tech-insights-backend/api-report.md b/plugins/tech-insights-backend/api-report.md index 631e792141..c2121bf655 100644 --- a/plugins/tech-insights-backend/api-report.md +++ b/plugins/tech-insights-backend/api-report.md @@ -3,6 +3,7 @@ > Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). ```ts +import { AuthService } from '@backstage/backend-plugin-api'; import { BackendFeature } from '@backstage/backend-plugin-api'; import { CheckResult } from '@backstage/plugin-tech-insights-common'; import { Config } from '@backstage/config'; @@ -110,6 +111,8 @@ export interface TechInsightsOptions< CheckType extends TechInsightCheck, CheckResultType extends CheckResult, > { + // (undocumented) + auth?: AuthService; // (undocumented) config: Config; // (undocumented) diff --git a/plugins/tech-insights-backend/src/plugin/plugin.ts b/plugins/tech-insights-backend/src/plugin/plugin.ts index 6da1ac1637..e97a0c98d8 100644 --- a/plugins/tech-insights-backend/src/plugin/plugin.ts +++ b/plugins/tech-insights-backend/src/plugin/plugin.ts @@ -102,6 +102,7 @@ export const techInsightsPlugin = createBackendPlugin({ logger: coreServices.logger, scheduler: coreServices.scheduler, tokenManager: coreServices.tokenManager, + auth: coreServices.auth, }, async init({ config, @@ -111,6 +112,7 @@ export const techInsightsPlugin = createBackendPlugin({ logger, scheduler, tokenManager, + auth, }) { const winstonLogger = loggerToWinstonLogger(logger); const factRetrievers: FactRetrieverRegistration[] = Object.entries( @@ -136,6 +138,7 @@ export const techInsightsPlugin = createBackendPlugin({ persistenceContext, scheduler, tokenManager, + auth, }); httpRouter.use( diff --git a/plugins/tech-insights-backend/src/service/fact/FactRetrieverEngine.test.ts b/plugins/tech-insights-backend/src/service/fact/FactRetrieverEngine.test.ts index 3bbaf9edf5..a6d485d130 100644 --- a/plugins/tech-insights-backend/src/service/fact/FactRetrieverEngine.test.ts +++ b/plugins/tech-insights-backend/src/service/fact/FactRetrieverEngine.test.ts @@ -32,7 +32,11 @@ import { ServerTokenManager, } from '@backstage/backend-common'; import { ConfigReader } from '@backstage/config'; -import { TestDatabaseId, TestDatabases } from '@backstage/backend-test-utils'; +import { + TestDatabaseId, + TestDatabases, + mockServices, +} from '@backstage/backend-test-utils'; import { TaskScheduler } from '@backstage/backend-tasks'; jest.setTimeout(60_000); @@ -140,6 +144,7 @@ describe('FactRetrieverEngine', () => { logger: getVoidLogger(), config: ConfigReader.fromConfigs([]), tokenManager: ServerTokenManager.noop(), + auth: mockServices.auth(), discovery: { getBaseUrl: (_: string) => Promise.resolve('http://mock.url'), getExternalBaseUrl: (_: string) => Promise.resolve('http://mock.url'), diff --git a/plugins/tech-insights-backend/src/service/fact/factRetrievers/entityMetadataFactRetriever.test.ts b/plugins/tech-insights-backend/src/service/fact/factRetrievers/entityMetadataFactRetriever.test.ts index 31400788b5..7c608f60bc 100644 --- a/plugins/tech-insights-backend/src/service/fact/factRetrievers/entityMetadataFactRetriever.test.ts +++ b/plugins/tech-insights-backend/src/service/fact/factRetrievers/entityMetadataFactRetriever.test.ts @@ -23,6 +23,7 @@ import { import { ConfigReader } from '@backstage/config'; import { GetEntitiesResponse } from '@backstage/catalog-client'; import { entityMetadataFactRetriever } from './entityMetadataFactRetriever'; +import { mockServices } from '@backstage/backend-test-utils'; const getEntitiesMock = jest.fn(); jest.mock('@backstage/catalog-client', () => { @@ -104,6 +105,7 @@ const defaultEntityListResponse: GetEntitiesResponse = { const handlerContext = { discovery, logger: getVoidLogger(), + auth: mockServices.auth(), config: ConfigReader.fromConfigs([]), tokenManager: ServerTokenManager.noop(), }; diff --git a/plugins/tech-insights-backend/src/service/fact/factRetrievers/entityMetadataFactRetriever.ts b/plugins/tech-insights-backend/src/service/fact/factRetrievers/entityMetadataFactRetriever.ts index 3103f9bdd5..cca4911350 100644 --- a/plugins/tech-insights-backend/src/service/fact/factRetrievers/entityMetadataFactRetriever.ts +++ b/plugins/tech-insights-backend/src/service/fact/factRetrievers/entityMetadataFactRetriever.ts @@ -47,12 +47,11 @@ export const entityMetadataFactRetriever: FactRetriever = { description: 'The entity has tags in metadata', }, }, - handler: async ({ - discovery, - entityFilter, - tokenManager, - }: FactRetrieverContext) => { - const { token } = await tokenManager.getToken(); + handler: async ({ discovery, entityFilter, auth }: FactRetrieverContext) => { + const { token } = await auth.getPluginRequestToken({ + onBehalfOf: await auth.getOwnServiceCredentials(), + targetPluginId: 'catalog', + }); const catalogClient = new CatalogClient({ discoveryApi: discovery, }); diff --git a/plugins/tech-insights-backend/src/service/fact/factRetrievers/entityOwnershipFactRetriever.test.ts b/plugins/tech-insights-backend/src/service/fact/factRetrievers/entityOwnershipFactRetriever.test.ts index 7a77ef91c4..1c578486ce 100644 --- a/plugins/tech-insights-backend/src/service/fact/factRetrievers/entityOwnershipFactRetriever.test.ts +++ b/plugins/tech-insights-backend/src/service/fact/factRetrievers/entityOwnershipFactRetriever.test.ts @@ -23,6 +23,7 @@ import { } from '@backstage/backend-common'; import { ConfigReader } from '@backstage/config'; import { GetEntitiesResponse } from '@backstage/catalog-client'; +import { mockServices } from '@backstage/backend-test-utils'; const getEntitiesMock = jest.fn(); jest.mock('@backstage/catalog-client', () => { @@ -104,6 +105,7 @@ const defaultEntityListResponse: GetEntitiesResponse = { const handlerContext = { discovery, logger: getVoidLogger(), + auth: mockServices.auth(), config: ConfigReader.fromConfigs([]), tokenManager: ServerTokenManager.noop(), }; diff --git a/plugins/tech-insights-backend/src/service/fact/factRetrievers/entityOwnershipFactRetriever.ts b/plugins/tech-insights-backend/src/service/fact/factRetrievers/entityOwnershipFactRetriever.ts index 974f1d30cd..367bf42c09 100644 --- a/plugins/tech-insights-backend/src/service/fact/factRetrievers/entityOwnershipFactRetriever.ts +++ b/plugins/tech-insights-backend/src/service/fact/factRetrievers/entityOwnershipFactRetriever.ts @@ -45,12 +45,11 @@ export const entityOwnershipFactRetriever: FactRetriever = { description: 'The spec.owner field is set and refers to a group', }, }, - handler: async ({ - discovery, - entityFilter, - tokenManager, - }: FactRetrieverContext) => { - const { token } = await tokenManager.getToken(); + handler: async ({ discovery, entityFilter, auth }: FactRetrieverContext) => { + const { token } = await auth.getPluginRequestToken({ + onBehalfOf: await auth.getOwnServiceCredentials(), + targetPluginId: 'catalog', + }); const catalogClient = new CatalogClient({ discoveryApi: discovery, }); diff --git a/plugins/tech-insights-backend/src/service/fact/factRetrievers/techdocsFactRetriever.test.ts b/plugins/tech-insights-backend/src/service/fact/factRetrievers/techdocsFactRetriever.test.ts index 0c70f6c9f1..37f82cb4dd 100644 --- a/plugins/tech-insights-backend/src/service/fact/factRetrievers/techdocsFactRetriever.test.ts +++ b/plugins/tech-insights-backend/src/service/fact/factRetrievers/techdocsFactRetriever.test.ts @@ -23,6 +23,7 @@ import { } from '@backstage/backend-common'; import { ConfigReader } from '@backstage/config'; import { GetEntitiesResponse } from '@backstage/catalog-client'; +import { mockServices } from '@backstage/backend-test-utils'; const getEntitiesMock = jest.fn(); jest.mock('@backstage/catalog-client', () => { @@ -104,6 +105,7 @@ const defaultEntityListResponse: GetEntitiesResponse = { const handlerContext = { discovery, logger: getVoidLogger(), + auth: mockServices.auth(), config: ConfigReader.fromConfigs([]), tokenManager: ServerTokenManager.noop(), }; diff --git a/plugins/tech-insights-backend/src/service/fact/factRetrievers/techdocsFactRetriever.ts b/plugins/tech-insights-backend/src/service/fact/factRetrievers/techdocsFactRetriever.ts index bd07bb3ecc..24f2fc4d6f 100644 --- a/plugins/tech-insights-backend/src/service/fact/factRetrievers/techdocsFactRetriever.ts +++ b/plugins/tech-insights-backend/src/service/fact/factRetrievers/techdocsFactRetriever.ts @@ -43,12 +43,11 @@ export const techdocsFactRetriever: FactRetriever = { description: 'The entity has a TechDocs reference annotation', }, }, - handler: async ({ - discovery, - entityFilter, - tokenManager, - }: FactRetrieverContext) => { - const { token } = await tokenManager.getToken(); + handler: async ({ discovery, entityFilter, auth }: FactRetrieverContext) => { + const { token } = await auth.getPluginRequestToken({ + onBehalfOf: await auth.getOwnServiceCredentials(), + targetPluginId: 'catalog', + }); const catalogClient = new CatalogClient({ discoveryApi: discovery, }); diff --git a/plugins/tech-insights-backend/src/service/techInsightsContextBuilder.ts b/plugins/tech-insights-backend/src/service/techInsightsContextBuilder.ts index 4f49e0031b..7b6f04b183 100644 --- a/plugins/tech-insights-backend/src/service/techInsightsContextBuilder.ts +++ b/plugins/tech-insights-backend/src/service/techInsightsContextBuilder.ts @@ -25,6 +25,7 @@ import { PluginDatabaseManager, PluginEndpointDiscovery, TokenManager, + createLegacyAuthAdapters, } from '@backstage/backend-common'; import { FactChecker, @@ -37,6 +38,7 @@ import { import { initializePersistenceContext } from './persistence'; import { CheckResult } from '@backstage/plugin-tech-insights-common'; import { PluginTaskScheduler } from '@backstage/backend-tasks'; +import { AuthService } from '@backstage/backend-plugin-api'; /** * @public @@ -82,6 +84,7 @@ export interface TechInsightsOptions< database: PluginDatabaseManager; scheduler: PluginTaskScheduler; tokenManager: TokenManager; + auth?: AuthService; } /** @@ -147,6 +150,12 @@ export const buildTechInsightsContext = async < logger, })); + const { auth } = createLegacyAuthAdapters({ + auth: options.auth, + tokenManager, + discovery, + }); + const factRetrieverEngine = await DefaultFactRetrieverEngine.create({ scheduler, repository: persistenceContext.techInsightsStore, @@ -156,6 +165,7 @@ export const buildTechInsightsContext = async < discovery, logger, tokenManager, + auth, }, }); diff --git a/plugins/tech-insights-node/api-report.md b/plugins/tech-insights-node/api-report.md index 13056b5eaa..bf4ee10dea 100644 --- a/plugins/tech-insights-node/api-report.md +++ b/plugins/tech-insights-node/api-report.md @@ -3,6 +3,7 @@ > Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). ```ts +import { AuthService } from '@backstage/backend-plugin-api'; import { CheckResult } from '@backstage/plugin-tech-insights-common'; import { Config } from '@backstage/config'; import { DateTime } from 'luxon'; @@ -66,6 +67,7 @@ export type FactRetrieverContext = { discovery: PluginEndpointDiscovery; logger: Logger; tokenManager: TokenManager; + auth: AuthService; entityFilter?: | Record[] | Record; diff --git a/plugins/tech-insights-node/src/facts.ts b/plugins/tech-insights-node/src/facts.ts index 9257ea789e..6d40bf615d 100644 --- a/plugins/tech-insights-node/src/facts.ts +++ b/plugins/tech-insights-node/src/facts.ts @@ -22,6 +22,7 @@ import { } from '@backstage/backend-common'; import { FactSchema } from '@backstage/plugin-tech-insights-common'; import { Logger } from 'winston'; +import { AuthService } from '@backstage/backend-plugin-api'; /** * A container for facts. The shape of the fact records needs to correspond to the FactSchema with same `ref` value. @@ -92,6 +93,7 @@ export type FactRetrieverContext = { discovery: PluginEndpointDiscovery; logger: Logger; tokenManager: TokenManager; + auth: AuthService; entityFilter?: | Record[] | Record;