diff --git a/.changeset/clever-trains-greet.md b/.changeset/clever-trains-greet.md new file mode 100644 index 0000000000..dc75f2f02a --- /dev/null +++ b/.changeset/clever-trains-greet.md @@ -0,0 +1,20 @@ +--- +'@backstage/plugin-tech-insights-backend': minor +--- + +**BREAKING**: The `buildTechInsightsContext` function now takes an additional +field in its options argument: `tokenManager`. This is an instance of +`TokenManager`, which can be found in your backend initialization code's +`env`. + +```diff + const builder = buildTechInsightsContext({ + logger: env.logger, + config: env.config, + database: env.database, + discovery: env.discovery, + scheduler: env.scheduler, ++ tokenManager: env.tokenManager, + factRetrievers: [ /* ... */ ], + }); +``` diff --git a/.changeset/fair-pigs-mate.md b/.changeset/fair-pigs-mate.md new file mode 100644 index 0000000000..ce82e138b8 --- /dev/null +++ b/.changeset/fair-pigs-mate.md @@ -0,0 +1,6 @@ +--- +'@backstage/plugin-tech-insights-node': minor +--- + +**BREAKING**: The `FactRetrieverContext` type now contains an additional +field: `tokenManager`. diff --git a/.changeset/grumpy-panthers-peel.md b/.changeset/grumpy-panthers-peel.md new file mode 100644 index 0000000000..ecf4397554 --- /dev/null +++ b/.changeset/grumpy-panthers-peel.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-tech-insights-backend-module-jsonfc': patch +--- + +Updated usages of `buildTechInsightsContext` in README. diff --git a/packages/backend/src/plugins/techInsights.ts b/packages/backend/src/plugins/techInsights.ts index 94ce27656a..80ac559859 100644 --- a/packages/backend/src/plugins/techInsights.ts +++ b/packages/backend/src/plugins/techInsights.ts @@ -38,6 +38,7 @@ export default async function createPlugin( database: env.database, scheduler: env.scheduler, discovery: env.discovery, + tokenManager: env.tokenManager, factRetrievers: [ createFactRetrieverRegistration({ cadence: '1 1 1 * *', // Example cron, At 01:01 on day-of-month 1. diff --git a/plugins/tech-insights-backend-module-jsonfc/README.md b/plugins/tech-insights-backend-module-jsonfc/README.md index 70b2ef2c40..f61666d671 100644 --- a/plugins/tech-insights-backend-module-jsonfc/README.md +++ b/plugins/tech-insights-backend-module-jsonfc/README.md @@ -28,6 +28,7 @@ and modify the `techInsights.ts` file to contain a reference to the FactCheckers config: env.config, database: env.database, discovery: env.discovery, + tokenManager: env.tokenManager, factRetrievers: [myFactRetrieverRegistration], + factCheckerFactory: myFactCheckerFactory }); diff --git a/plugins/tech-insights-backend/README.md b/plugins/tech-insights-backend/README.md index ee6ef4c0cc..e88d150393 100644 --- a/plugins/tech-insights-backend/README.md +++ b/plugins/tech-insights-backend/README.md @@ -35,6 +35,7 @@ export default async function createPlugin( database: env.database, discovery: env.discovery, scheduler: env.scheduler, + tokenManager: env.tokenManager, factRetrievers: [], // Fact retrievers registrations you want tech insights to use }); @@ -104,6 +105,7 @@ const builder = buildTechInsightsContext({ config: env.config, database: env.database, discovery: env.discovery, + tokenManager: env.tokenManager, - factRetrievers: [], + factRetrievers: [myFactRetrieverRegistration], }); @@ -119,6 +121,7 @@ const builder = buildTechInsightsContext({ config: env.config, database: env.database, discovery: env.discovery, + tokenManager: env.tokenManager, - factRetrievers: [], + factRetrievers: process.env.MAIN_FACT_RETRIEVER_INSTANCE ? [myFactRetrieverRegistration] : [], }); @@ -158,9 +161,12 @@ const myFactRetriever: FactRetriever = { const catalogClient = new CatalogClient({ discoveryApi: discovery, }); - const entities = await catalogClient.getEntities({ - filter: [{ kind: 'component' }], - }); + const entities = await catalogClient.getEntities( + { + filter: [{ kind: 'component' }], + }, + { token }, + ); /** * snip: Do complex logic to retrieve facts from external system or calculate fact values */ @@ -214,6 +220,7 @@ and modify the `techInsights.ts` file to contain a reference to the FactChecker config: env.config, database: env.database, discovery: env.discovery, + tokenManager: env.tokenManager, factRetrievers: [myFactRetrieverRegistration], + factCheckerFactory: myFactCheckerFactory }); @@ -273,6 +280,7 @@ export default async function createPlugin( config: env.config, database: env.database, discovery: env.discovery, + tokenManager: env.tokenManager, factRetrievers: [ createFactRetrieverRegistration({ cadence: '0 */6 * * *', // Run every 6 hours - https://crontab.guru/#0_*/6_*_*_* diff --git a/plugins/tech-insights-backend/api-report.md b/plugins/tech-insights-backend/api-report.md index 210aa50af9..9fee3be281 100644 --- a/plugins/tech-insights-backend/api-report.md +++ b/plugins/tech-insights-backend/api-report.md @@ -17,6 +17,7 @@ import { PluginEndpointDiscovery } from '@backstage/backend-common'; import { PluginTaskScheduler } from '@backstage/backend-tasks'; import { TechInsightCheck } from '@backstage/plugin-tech-insights-node'; import { TechInsightsStore } from '@backstage/plugin-tech-insights-node'; +import { TokenManager } from '@backstage/backend-common'; // @public export const buildTechInsightsContext: < @@ -95,6 +96,8 @@ export interface TechInsightsOptions< logger: Logger; // (undocumented) scheduler: PluginTaskScheduler; + // (undocumented) + tokenManager: TokenManager; } // (No @packageDocumentation comment for this package) 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 0617c0aedd..454711171f 100644 --- a/plugins/tech-insights-backend/src/service/fact/FactRetrieverEngine.test.ts +++ b/plugins/tech-insights-backend/src/service/fact/FactRetrieverEngine.test.ts @@ -22,7 +22,11 @@ import { } from '@backstage/plugin-tech-insights-node'; import { FactRetrieverRegistry } from './FactRetrieverRegistry'; import { FactRetrieverEngine } from './FactRetrieverEngine'; -import { DatabaseManager, getVoidLogger } from '@backstage/backend-common'; +import { + DatabaseManager, + getVoidLogger, + ServerTokenManager, +} from '@backstage/backend-common'; import { ConfigReader } from '@backstage/config'; import { TestDatabaseId, TestDatabases } from '@backstage/backend-test-utils'; import { TaskScheduler } from '@backstage/backend-tasks'; @@ -129,6 +133,7 @@ describe('FactRetrieverEngine', () => { factRetrieverContext: { logger: getVoidLogger(), config: ConfigReader.fromConfigs([]), + tokenManager: ServerTokenManager.noop(), 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 9d5c57637d..31400788b5 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 @@ -18,6 +18,7 @@ import { RELATION_OWNED_BY } from '@backstage/catalog-model'; import { PluginEndpointDiscovery, getVoidLogger, + ServerTokenManager, } from '@backstage/backend-common'; import { ConfigReader } from '@backstage/config'; import { GetEntitiesResponse } from '@backstage/catalog-client'; @@ -104,6 +105,7 @@ const handlerContext = { discovery, logger: getVoidLogger(), config: ConfigReader.fromConfigs([]), + tokenManager: ServerTokenManager.noop(), }; const entityFactRetriever = entityMetadataFactRetriever; 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 26b1e4274b..caa19dbeaf 100644 --- a/plugins/tech-insights-backend/src/service/fact/factRetrievers/entityMetadataFactRetriever.ts +++ b/plugins/tech-insights-backend/src/service/fact/factRetrievers/entityMetadataFactRetriever.ts @@ -44,11 +44,19 @@ export const entityMetadataFactRetriever: FactRetriever = { description: 'The entity has tags in metadata', }, }, - handler: async ({ discovery, entityFilter }: FactRetrieverContext) => { + handler: async ({ + discovery, + entityFilter, + tokenManager, + }: FactRetrieverContext) => { + const { token } = await tokenManager.getToken(); const catalogClient = new CatalogClient({ discoveryApi: discovery, }); - const entities = await catalogClient.getEntities({ filter: entityFilter }); + const entities = await catalogClient.getEntities( + { filter: entityFilter }, + { token }, + ); return entities.items.map((entity: Entity) => { return { 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 555f761ae8..7a77ef91c4 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 @@ -19,6 +19,7 @@ import { RELATION_OWNED_BY } from '@backstage/catalog-model'; import { PluginEndpointDiscovery, getVoidLogger, + ServerTokenManager, } from '@backstage/backend-common'; import { ConfigReader } from '@backstage/config'; import { GetEntitiesResponse } from '@backstage/catalog-client'; @@ -104,6 +105,7 @@ const handlerContext = { discovery, logger: getVoidLogger(), config: ConfigReader.fromConfigs([]), + tokenManager: ServerTokenManager.noop(), }; const entityFactRetriever = entityOwnershipFactRetriever; 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 b9a91e67f7..c1e9b2710e 100644 --- a/plugins/tech-insights-backend/src/service/fact/factRetrievers/entityOwnershipFactRetriever.ts +++ b/plugins/tech-insights-backend/src/service/fact/factRetrievers/entityOwnershipFactRetriever.ts @@ -42,11 +42,19 @@ export const entityOwnershipFactRetriever: FactRetriever = { description: 'The spec.owner field is set and refers to a group', }, }, - handler: async ({ discovery, entityFilter }: FactRetrieverContext) => { + handler: async ({ + discovery, + entityFilter, + tokenManager, + }: FactRetrieverContext) => { + const { token } = await tokenManager.getToken(); const catalogClient = new CatalogClient({ discoveryApi: discovery, }); - const entities = await catalogClient.getEntities({ filter: entityFilter }); + const entities = await catalogClient.getEntities( + { filter: entityFilter }, + { token }, + ); return entities.items.map((entity: Entity) => { return { 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 be9397942d..0c70f6c9f1 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 @@ -19,6 +19,7 @@ import { RELATION_OWNED_BY } from '@backstage/catalog-model'; import { PluginEndpointDiscovery, getVoidLogger, + ServerTokenManager, } from '@backstage/backend-common'; import { ConfigReader } from '@backstage/config'; import { GetEntitiesResponse } from '@backstage/catalog-client'; @@ -104,6 +105,7 @@ const handlerContext = { discovery, logger: getVoidLogger(), config: ConfigReader.fromConfigs([]), + tokenManager: ServerTokenManager.noop(), }; const entityFactRetriever = techdocsFactRetriever; 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 2717f94475..6bc84f4aa9 100644 --- a/plugins/tech-insights-backend/src/service/fact/factRetrievers/techdocsFactRetriever.ts +++ b/plugins/tech-insights-backend/src/service/fact/factRetrievers/techdocsFactRetriever.ts @@ -40,11 +40,19 @@ export const techdocsFactRetriever: FactRetriever = { description: 'The entity has a title in metadata', }, }, - handler: async ({ discovery, entityFilter }: FactRetrieverContext) => { + handler: async ({ + discovery, + entityFilter, + tokenManager, + }: FactRetrieverContext) => { + const { token } = await tokenManager.getToken(); const catalogClient = new CatalogClient({ discoveryApi: discovery, }); - const entities = await catalogClient.getEntities({ filter: entityFilter }); + const entities = await catalogClient.getEntities( + { filter: entityFilter }, + { token }, + ); return entities.items.map((entity: Entity) => { return { diff --git a/plugins/tech-insights-backend/src/service/router.test.ts b/plugins/tech-insights-backend/src/service/router.test.ts index df2d471516..8513973598 100644 --- a/plugins/tech-insights-backend/src/service/router.test.ts +++ b/plugins/tech-insights-backend/src/service/router.test.ts @@ -19,6 +19,7 @@ import { DatabaseManager, getVoidLogger, PluginDatabaseManager, + ServerTokenManager, } from '@backstage/backend-common'; import { ConfigReader } from '@backstage/config'; import request from 'supertest'; @@ -74,6 +75,7 @@ describe('Tech Insights router tests', () => { getBaseUrl: (_: string) => Promise.resolve('http://mock.url'), getExternalBaseUrl: (_: string) => Promise.resolve('http://mock.url'), }, + tokenManager: ServerTokenManager.noop(), }); const router = await createRouter({ diff --git a/plugins/tech-insights-backend/src/service/techInsightsContextBuilder.ts b/plugins/tech-insights-backend/src/service/techInsightsContextBuilder.ts index 4f8f2ed928..e22bfbd253 100644 --- a/plugins/tech-insights-backend/src/service/techInsightsContextBuilder.ts +++ b/plugins/tech-insights-backend/src/service/techInsightsContextBuilder.ts @@ -21,6 +21,7 @@ import { Config } from '@backstage/config'; import { PluginDatabaseManager, PluginEndpointDiscovery, + TokenManager, } from '@backstage/backend-common'; import { FactChecker, @@ -63,6 +64,7 @@ export interface TechInsightsOptions< discovery: PluginEndpointDiscovery; database: PluginDatabaseManager; scheduler: PluginTaskScheduler; + tokenManager: TokenManager; } /** @@ -104,6 +106,7 @@ export const buildTechInsightsContext = async < database, logger, scheduler, + tokenManager, } = options; const factRetrieverRegistry = new FactRetrieverRegistry(factRetrievers); @@ -121,6 +124,7 @@ export const buildTechInsightsContext = async < config, discovery, logger, + tokenManager, }, }); diff --git a/plugins/tech-insights-node/api-report.md b/plugins/tech-insights-node/api-report.md index 7d9f2e00b7..bcccec65b5 100644 --- a/plugins/tech-insights-node/api-report.md +++ b/plugins/tech-insights-node/api-report.md @@ -10,6 +10,7 @@ import { Duration } from 'luxon'; import { DurationLike } from 'luxon'; import { Logger } from 'winston'; import { PluginEndpointDiscovery } from '@backstage/backend-common'; +import { TokenManager } from '@backstage/backend-common'; // @public export type CheckValidationResponse = { @@ -58,6 +59,7 @@ export type FactRetrieverContext = { config: Config; discovery: PluginEndpointDiscovery; logger: Logger; + tokenManager: TokenManager; entityFilter?: | Record[] | Record; diff --git a/plugins/tech-insights-node/src/facts.ts b/plugins/tech-insights-node/src/facts.ts index a5df4bae85..ffd3549bd5 100644 --- a/plugins/tech-insights-node/src/facts.ts +++ b/plugins/tech-insights-node/src/facts.ts @@ -15,7 +15,10 @@ */ import { DateTime, Duration, DurationLike } from 'luxon'; import { Config } from '@backstage/config'; -import { PluginEndpointDiscovery } from '@backstage/backend-common'; +import { + PluginEndpointDiscovery, + TokenManager, +} from '@backstage/backend-common'; import { Logger } from 'winston'; /** @@ -135,6 +138,7 @@ export type FactRetrieverContext = { config: Config; discovery: PluginEndpointDiscovery; logger: Logger; + tokenManager: TokenManager; entityFilter?: | Record[] | Record;