Merge pull request #11080 from ctrombley/feat/fact-retriever-token-managers

[TechInsights] Provide FactRetrievers with a TokenManager instance
This commit is contained in:
Johan Haals
2022-04-27 16:14:44 +02:00
committed by GitHub
18 changed files with 102 additions and 11 deletions
+20
View File
@@ -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: [ /* ... */ ],
});
```
+6
View File
@@ -0,0 +1,6 @@
---
'@backstage/plugin-tech-insights-node': minor
---
**BREAKING**: The `FactRetrieverContext` type now contains an additional
field: `tokenManager`.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-tech-insights-backend-module-jsonfc': patch
---
Updated usages of `buildTechInsightsContext` in README.
@@ -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.
@@ -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
});
+11 -3
View File
@@ -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_*_*_*
@@ -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)
@@ -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'),
@@ -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;
@@ -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 {
@@ -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;
@@ -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 {
@@ -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;
@@ -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 {
@@ -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({
@@ -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,
},
});
+2
View File
@@ -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<string, string | symbol | (string | symbol)[]>[]
| Record<string, string | symbol | (string | symbol)[]>;
+5 -1
View File
@@ -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<string, string | symbol | (string | symbol)[]>[]
| Record<string, string | symbol | (string | symbol)[]>;