From b7ef3ec2f619f5fd0ccc7ec0d9cee12c3952852b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 5 Jul 2022 12:23:56 +0000 Subject: [PATCH 1/8] chore(deps): update backstage/actions action to v0.5.0 Signed-off-by: Renovate Bot Signed-off-by: sblausten --- .github/workflows/ci.yml | 6 +++--- .github/workflows/cron.yml | 2 +- .github/workflows/deploy_nightly.yml | 2 +- .github/workflows/deploy_packages.yml | 4 ++-- .github/workflows/issue.yaml | 2 +- .github/workflows/sync_code-formatting.yml | 2 +- .github/workflows/sync_snyk-github-issues.yml | 2 +- .github/workflows/verify_e2e-linux.yml | 2 +- .github/workflows/verify_storybook.yml | 2 +- 9 files changed, 12 insertions(+), 12 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 14e46ca5ce..e38df375b6 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -32,7 +32,7 @@ jobs: registry-url: https://registry.npmjs.org/ # Needed for auth - name: yarn install - uses: backstage/actions/yarn-install@v0.2.2 + uses: backstage/actions/yarn-install@v0.5.0 with: cache-prefix: ${{ runner.os }}-v${{ matrix.node-version }} @@ -61,7 +61,7 @@ jobs: registry-url: https://registry.npmjs.org/ # Needed for auth - name: yarn install - uses: backstage/actions/yarn-install@v0.2.2 + uses: backstage/actions/yarn-install@v0.5.0 with: cache-prefix: ${{ runner.os }}-v${{ matrix.node-version }} @@ -178,7 +178,7 @@ jobs: registry-url: https://registry.npmjs.org/ # Needed for auth - name: yarn install - uses: backstage/actions/yarn-install@v0.4.0 + uses: backstage/actions/yarn-install@v0.5.0 with: cache-prefix: ${{ runner.os }}-v${{ matrix.node-version }} diff --git a/.github/workflows/cron.yml b/.github/workflows/cron.yml index 306f91b637..5b5c8b63c8 100644 --- a/.github/workflows/cron.yml +++ b/.github/workflows/cron.yml @@ -8,7 +8,7 @@ jobs: cron: runs-on: ubuntu-latest steps: - - uses: backstage/actions/cron@v0.4.0 + - uses: backstage/actions/cron@v0.5.0 with: app-id: ${{ secrets.BACKSTAGE_GOALIE_APPLICATION_ID }} private-key: ${{ secrets.BACKSTAGE_GOALIE_PRIVATE_KEY }} diff --git a/.github/workflows/deploy_nightly.yml b/.github/workflows/deploy_nightly.yml index 15d1d48816..427a7139a0 100644 --- a/.github/workflows/deploy_nightly.yml +++ b/.github/workflows/deploy_nightly.yml @@ -26,7 +26,7 @@ jobs: node-version: ${{ matrix.node-version }} registry-url: https://registry.npmjs.org/ # Needed for auth - name: yarn install - uses: backstage/actions/yarn-install@v0.4.0 + uses: backstage/actions/yarn-install@v0.5.0 with: cache-prefix: ${{ runner.os }}-v${{ matrix.node-version }} diff --git a/.github/workflows/deploy_packages.yml b/.github/workflows/deploy_packages.yml index 78a6d3bb8a..30d4bf9ee2 100644 --- a/.github/workflows/deploy_packages.yml +++ b/.github/workflows/deploy_packages.yml @@ -67,7 +67,7 @@ jobs: node-version: ${{ matrix.node-version }} registry-url: https://registry.npmjs.org/ # Needed for auth - name: yarn install - uses: backstage/actions/yarn-install@v0.4.0 + uses: backstage/actions/yarn-install@v0.5.0 with: cache-prefix: ${{ runner.os }}-v${{ matrix.node-version }} @@ -145,7 +145,7 @@ jobs: node-version: ${{ matrix.node-version }} registry-url: https://registry.npmjs.org/ # Needed for auth - name: yarn install - uses: backstage/actions/yarn-install@v0.4.0 + uses: backstage/actions/yarn-install@v0.5.0 with: cache-prefix: ${{ runner.os }}-v${{ matrix.node-version }} diff --git a/.github/workflows/issue.yaml b/.github/workflows/issue.yaml index c6f62a059d..bc0dd15617 100644 --- a/.github/workflows/issue.yaml +++ b/.github/workflows/issue.yaml @@ -10,4 +10,4 @@ jobs: if: github.repository == 'backstage/backstage' steps: - name: Issue sync - uses: backstage/actions/issue-sync@v0.4.0 + uses: backstage/actions/issue-sync@v0.5.0 diff --git a/.github/workflows/sync_code-formatting.yml b/.github/workflows/sync_code-formatting.yml index f4dbc122cc..0d3add5f12 100644 --- a/.github/workflows/sync_code-formatting.yml +++ b/.github/workflows/sync_code-formatting.yml @@ -20,7 +20,7 @@ jobs: node-version: ${{ matrix.node-version }} registry-url: https://registry.npmjs.org/ # Needed for auth - name: yarn install - uses: backstage/actions/yarn-install@v0.4.0 + uses: backstage/actions/yarn-install@v0.5.0 with: cache-prefix: ${{ runner.os }}-v${{ matrix.node-version }} diff --git a/.github/workflows/sync_snyk-github-issues.yml b/.github/workflows/sync_snyk-github-issues.yml index 3d84c18322..9d0726e915 100644 --- a/.github/workflows/sync_snyk-github-issues.yml +++ b/.github/workflows/sync_snyk-github-issues.yml @@ -22,7 +22,7 @@ jobs: node-version: ${{ matrix.node-version }} registry-url: https://registry.npmjs.org/ # Needed for auth - name: yarn install - uses: backstage/actions/yarn-install@v0.4.0 + uses: backstage/actions/yarn-install@v0.5.0 with: cache-prefix: ${{ runner.os }}-v${{ matrix.node-version }} diff --git a/.github/workflows/verify_e2e-linux.yml b/.github/workflows/verify_e2e-linux.yml index 1f7cbb5339..126670b67f 100644 --- a/.github/workflows/verify_e2e-linux.yml +++ b/.github/workflows/verify_e2e-linux.yml @@ -46,7 +46,7 @@ jobs: node-version: ${{ matrix.node-version }} registry-url: https://registry.npmjs.org/ # Needed for auth - name: yarn install - uses: backstage/actions/yarn-install@v0.4.0 + uses: backstage/actions/yarn-install@v0.5.0 with: cache-prefix: ${{ runner.os }}-v${{ matrix.node-version }} diff --git a/.github/workflows/verify_storybook.yml b/.github/workflows/verify_storybook.yml index 9468c9bf68..89679b530a 100644 --- a/.github/workflows/verify_storybook.yml +++ b/.github/workflows/verify_storybook.yml @@ -35,7 +35,7 @@ jobs: node-version: ${{ matrix.node-version }} registry-url: https://registry.npmjs.org/ # Needed for auth - name: yarn install - uses: backstage/actions/yarn-install@v0.4.0 + uses: backstage/actions/yarn-install@v0.5.0 with: cache-prefix: ${{ runner.os }}-v${{ matrix.node-version }} - name: storybook yarn install From 6c194b58eb2987a5196ecfd36d4425f4b613683d Mon Sep 17 00:00:00 2001 From: sblausten Date: Tue, 5 Jul 2022 17:39:26 +0200 Subject: [PATCH 2/8] Make FactRetrieverRegistry async so that a db backed implementation can be used Signed-off-by: sblausten --- .../service/fact/FactRetrieverEngine.test.ts | 4 +- .../src/service/fact/FactRetrieverEngine.ts | 11 ++---- .../src/service/fact/FactRetrieverRegistry.ts | 39 ++++++++++++------- 3 files changed, 29 insertions(+), 25 deletions(-) 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 454711171f..44ffa6587f 100644 --- a/plugins/tech-insights-backend/src/service/fact/FactRetrieverEngine.test.ts +++ b/plugins/tech-insights-backend/src/service/fact/FactRetrieverEngine.test.ts @@ -206,9 +206,7 @@ describe('FactRetrieverEngine', () => { { ...testFactRetriever, handler }, ); await engine.schedule(); - const job: FactRetrieverRegistration = engine.getJobRegistration( - testFactRetriever.id, - ); + const job = await engine.getJobRegistration(testFactRetriever.id); expect(job.cadence!!).toEqual(defaultCadence); await engine.triggerJob(job.factRetriever.id); diff --git a/plugins/tech-insights-backend/src/service/fact/FactRetrieverEngine.ts b/plugins/tech-insights-backend/src/service/fact/FactRetrieverEngine.ts index 25e7610809..f8ff3762dd 100644 --- a/plugins/tech-insights-backend/src/service/fact/FactRetrieverEngine.ts +++ b/plugins/tech-insights-backend/src/service/fact/FactRetrieverEngine.ts @@ -66,11 +66,8 @@ export class FactRetrieverEngine { defaultTimeout, } = options; - await Promise.all( - factRetrieverRegistry - .listRetrievers() - .map(it => repository.insertFactSchema(it)), - ); + const retrievers = await factRetrieverRegistry.listRetrievers(); + await Promise.all(retrievers.map(it => repository.insertFactSchema(it))); return new FactRetrieverEngine( repository, @@ -84,7 +81,7 @@ export class FactRetrieverEngine { } async schedule() { - const registrations = this.factRetrieverRegistry.listRegistrations(); + const registrations = await this.factRetrieverRegistry.listRegistrations(); const newRegs: string[] = []; await Promise.all( @@ -115,7 +112,7 @@ export class FactRetrieverEngine { ); } - getJobRegistration(ref: string): FactRetrieverRegistration { + getJobRegistration(ref: string): Promise { return this.factRetrieverRegistry.get(ref); } diff --git a/plugins/tech-insights-backend/src/service/fact/FactRetrieverRegistry.ts b/plugins/tech-insights-backend/src/service/fact/FactRetrieverRegistry.ts index 504d561f17..1ad7626e8e 100644 --- a/plugins/tech-insights-backend/src/service/fact/FactRetrieverRegistry.ts +++ b/plugins/tech-insights-backend/src/service/fact/FactRetrieverRegistry.ts @@ -26,16 +26,21 @@ import { ConflictError, NotFoundError } from '@backstage/errors'; * */ export interface FactRetrieverRegistry { - readonly retrievers: Map; - register(registration: FactRetrieverRegistration): void; - get(retrieverReference: string): FactRetrieverRegistration; - listRetrievers(): FactRetriever[]; - listRegistrations(): FactRetrieverRegistration[]; - getSchemas(): FactSchema[]; + register(registration: FactRetrieverRegistration): Promise; + get(retrieverReference: string): Promise; + listRetrievers(): Promise; + listRegistrations(): Promise; + getSchemas(): Promise; } +/** + * A basic in memory fact retriever registry. + * + * You can replace this with a persistance based version using the FactRetrieverRegistry interface. + * + */ export class DefaultFactRetrieverRegistry implements FactRetrieverRegistry { - readonly retrievers = new Map(); + private readonly retrievers = new Map(); constructor(retrievers: FactRetrieverRegistration[]) { retrievers.forEach(it => { @@ -50,27 +55,31 @@ export class DefaultFactRetrieverRegistry implements FactRetrieverRegistry { ); } this.retrievers.set(registration.factRetriever.id, registration); + return Promise.resolve(); } - get(retrieverReference: string): FactRetrieverRegistration { + get(retrieverReference: string): Promise { const registration = this.retrievers.get(retrieverReference); if (!registration) { throw new NotFoundError( `Tech insight fact retriever with identifier '${retrieverReference}' is not registered.`, ); } - return registration; + return Promise.resolve(registration); } - listRetrievers(): FactRetriever[] { - return [...this.retrievers.values()].map(it => it.factRetriever); + listRetrievers(): Promise { + return Promise.resolve( + [...this.retrievers.values()].map(it => it.factRetriever), + ); } - listRegistrations(): FactRetrieverRegistration[] { - return [...this.retrievers.values()]; + listRegistrations(): Promise { + return Promise.resolve([...this.retrievers.values()]); } - getSchemas(): FactSchema[] { - return this.listRetrievers().map(it => it.schema); + async getSchemas(): Promise { + const retrievers = await this.listRetrievers(); + return Promise.resolve(retrievers.map(it => it.schema)); } } From 46cfda58aa2a685a2d48a4709f6f8dee0122d7c7 Mon Sep 17 00:00:00 2001 From: sblausten Date: Tue, 5 Jul 2022 17:41:58 +0200 Subject: [PATCH 3/8] Add changeset Signed-off-by: sblausten --- .changeset/rich-goats-breathe.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/rich-goats-breathe.md diff --git a/.changeset/rich-goats-breathe.md b/.changeset/rich-goats-breathe.md new file mode 100644 index 0000000000..6391cad0d1 --- /dev/null +++ b/.changeset/rich-goats-breathe.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-tech-insights-backend': patch +--- + +Update FactRetrieverRegistry interface to be async so that db backed implementations can be passed through to the FactRetrieverEngine. From 7001ee13d846accaa0f6958052ebe6b262a4e71d Mon Sep 17 00:00:00 2001 From: sblausten Date: Tue, 5 Jul 2022 17:59:35 +0200 Subject: [PATCH 4/8] Api report Signed-off-by: sblausten --- plugins/tech-insights-backend/api-report.md | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/plugins/tech-insights-backend/api-report.md b/plugins/tech-insights-backend/api-report.md index 32d45f8afd..dc90d76107 100644 --- a/plugins/tech-insights-backend/api-report.md +++ b/plugins/tech-insights-backend/api-report.md @@ -55,17 +55,15 @@ export type FactRetrieverRegistrationOptions = { // @public (undocumented) export interface FactRetrieverRegistry { // (undocumented) - get(retrieverReference: string): FactRetrieverRegistration; + get(retrieverReference: string): Promise; // (undocumented) - getSchemas(): FactSchema[]; + getSchemas(): Promise; // (undocumented) - listRegistrations(): FactRetrieverRegistration[]; + listRegistrations(): Promise; // (undocumented) - listRetrievers(): FactRetriever[]; + listRetrievers(): Promise; // (undocumented) - register(registration: FactRetrieverRegistration): void; - // (undocumented) - readonly retrievers: Map; + register(registration: FactRetrieverRegistration): Promise; } // @public From c3fe64b2c4035f12c36f41346d8c367187ba6b13 Mon Sep 17 00:00:00 2001 From: sblausten Date: Wed, 6 Jul 2022 10:11:07 +0200 Subject: [PATCH 5/8] PR comments Signed-off-by: sblausten --- .changeset/rich-goats-breathe.md | 4 ++-- .../src/service/fact/FactRetrieverRegistry.ts | 16 ++++++++++------ 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/.changeset/rich-goats-breathe.md b/.changeset/rich-goats-breathe.md index 6391cad0d1..de8942c248 100644 --- a/.changeset/rich-goats-breathe.md +++ b/.changeset/rich-goats-breathe.md @@ -1,5 +1,5 @@ --- -'@backstage/plugin-tech-insights-backend': patch +'@backstage/plugin-tech-insights-backend': minor --- -Update FactRetrieverRegistry interface to be async so that db backed implementations can be passed through to the FactRetrieverEngine. +**BREAKING**: Update FactRetrieverRegistry interface to be async so that db backed implementations can be passed through to the FactRetrieverEngine. diff --git a/plugins/tech-insights-backend/src/service/fact/FactRetrieverRegistry.ts b/plugins/tech-insights-backend/src/service/fact/FactRetrieverRegistry.ts index 1ad7626e8e..4690ef9f09 100644 --- a/plugins/tech-insights-backend/src/service/fact/FactRetrieverRegistry.ts +++ b/plugins/tech-insights-backend/src/service/fact/FactRetrieverRegistry.ts @@ -42,13 +42,17 @@ export interface FactRetrieverRegistry { export class DefaultFactRetrieverRegistry implements FactRetrieverRegistry { private readonly retrievers = new Map(); - constructor(retrievers: FactRetrieverRegistration[]) { + static create( + retrievers: FactRetrieverRegistration[], + ): FactRetrieverRegistry { + const registry = new DefaultFactRetrieverRegistry(); retrievers.forEach(it => { - this.register(it); + registry.register(it); }); + return registry; } - register(registration: FactRetrieverRegistration) { + async register(registration: FactRetrieverRegistration) { if (this.retrievers.has(registration.factRetriever.id)) { throw new ConflictError( `Tech insight fact retriever with identifier '${registration.factRetriever.id}' has already been registered`, @@ -58,7 +62,7 @@ export class DefaultFactRetrieverRegistry implements FactRetrieverRegistry { return Promise.resolve(); } - get(retrieverReference: string): Promise { + async get(retrieverReference: string): Promise { const registration = this.retrievers.get(retrieverReference); if (!registration) { throw new NotFoundError( @@ -68,13 +72,13 @@ export class DefaultFactRetrieverRegistry implements FactRetrieverRegistry { return Promise.resolve(registration); } - listRetrievers(): Promise { + async listRetrievers(): Promise { return Promise.resolve( [...this.retrievers.values()].map(it => it.factRetriever), ); } - listRegistrations(): Promise { + async listRegistrations(): Promise { return Promise.resolve([...this.retrievers.values()]); } From d790943cd9d8a487c5e251d034e8c4c6dfc64830 Mon Sep 17 00:00:00 2001 From: Sam Blausten Date: Wed, 6 Jul 2022 11:44:47 +0200 Subject: [PATCH 6/8] Update .changeset/rich-goats-breathe.md Co-authored-by: Patrik Oldsberg Signed-off-by: sblausten --- .changeset/rich-goats-breathe.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.changeset/rich-goats-breathe.md b/.changeset/rich-goats-breathe.md index de8942c248..2888c2f9a7 100644 --- a/.changeset/rich-goats-breathe.md +++ b/.changeset/rich-goats-breathe.md @@ -3,3 +3,5 @@ --- **BREAKING**: Update FactRetrieverRegistry interface to be async so that db backed implementations can be passed through to the FactRetrieverEngine. + +If you have existing custom `FactRetrieverRegistry` implementations, you'll need to remove the `retrievers` member and make all the methods async. From 37174365ce50756cc76f419714cfe2527526f358 Mon Sep 17 00:00:00 2001 From: sblausten Date: Wed, 6 Jul 2022 13:05:52 +0200 Subject: [PATCH 7/8] Change constructor of default implementation Signed-off-by: sblausten --- .../src/service/fact/FactRetrieverRegistry.ts | 21 +++++++------------ 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/plugins/tech-insights-backend/src/service/fact/FactRetrieverRegistry.ts b/plugins/tech-insights-backend/src/service/fact/FactRetrieverRegistry.ts index 4690ef9f09..2ee5afac04 100644 --- a/plugins/tech-insights-backend/src/service/fact/FactRetrieverRegistry.ts +++ b/plugins/tech-insights-backend/src/service/fact/FactRetrieverRegistry.ts @@ -42,14 +42,10 @@ export interface FactRetrieverRegistry { export class DefaultFactRetrieverRegistry implements FactRetrieverRegistry { private readonly retrievers = new Map(); - static create( - retrievers: FactRetrieverRegistration[], - ): FactRetrieverRegistry { - const registry = new DefaultFactRetrieverRegistry(); - retrievers.forEach(it => { - registry.register(it); + constructor(retrievers: FactRetrieverRegistration[]) { + retrievers.forEach(r => { + this.retrievers.set(r.factRetriever.id, r); }); - return registry; } async register(registration: FactRetrieverRegistration) { @@ -59,7 +55,6 @@ export class DefaultFactRetrieverRegistry implements FactRetrieverRegistry { ); } this.retrievers.set(registration.factRetriever.id, registration); - return Promise.resolve(); } async get(retrieverReference: string): Promise { @@ -69,21 +64,19 @@ export class DefaultFactRetrieverRegistry implements FactRetrieverRegistry { `Tech insight fact retriever with identifier '${retrieverReference}' is not registered.`, ); } - return Promise.resolve(registration); + return registration; } async listRetrievers(): Promise { - return Promise.resolve( - [...this.retrievers.values()].map(it => it.factRetriever), - ); + return [...this.retrievers.values()].map(it => it.factRetriever); } async listRegistrations(): Promise { - return Promise.resolve([...this.retrievers.values()]); + return [...this.retrievers.values()]; } async getSchemas(): Promise { const retrievers = await this.listRetrievers(); - return Promise.resolve(retrievers.map(it => it.schema)); + return retrievers.map(it => it.schema); } } From 339e6ea4ef6a9bd9bd99425eda6cb2520a27f533 Mon Sep 17 00:00:00 2001 From: sblausten Date: Wed, 6 Jul 2022 13:10:04 +0200 Subject: [PATCH 8/8] Register sync Signed-off-by: sblausten --- .../src/service/fact/FactRetrieverRegistry.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/plugins/tech-insights-backend/src/service/fact/FactRetrieverRegistry.ts b/plugins/tech-insights-backend/src/service/fact/FactRetrieverRegistry.ts index 2ee5afac04..9f4be11bec 100644 --- a/plugins/tech-insights-backend/src/service/fact/FactRetrieverRegistry.ts +++ b/plugins/tech-insights-backend/src/service/fact/FactRetrieverRegistry.ts @@ -44,11 +44,11 @@ export class DefaultFactRetrieverRegistry implements FactRetrieverRegistry { constructor(retrievers: FactRetrieverRegistration[]) { retrievers.forEach(r => { - this.retrievers.set(r.factRetriever.id, r); + this.registerSync(r); }); } - async register(registration: FactRetrieverRegistration) { + registerSync(registration: FactRetrieverRegistration) { if (this.retrievers.has(registration.factRetriever.id)) { throw new ConflictError( `Tech insight fact retriever with identifier '${registration.factRetriever.id}' has already been registered`, @@ -57,6 +57,10 @@ export class DefaultFactRetrieverRegistry implements FactRetrieverRegistry { this.retrievers.set(registration.factRetriever.id, registration); } + async register(registration: FactRetrieverRegistration) { + this.registerSync(registration); + } + async get(retrieverReference: string): Promise { const registration = this.retrievers.get(retrieverReference); if (!registration) {