From 8a2d67982214d047deae4be4c57fc4045b7bf135 Mon Sep 17 00:00:00 2001 From: Johan Haals Date: Thu, 20 May 2021 12:08:00 +0200 Subject: [PATCH 01/18] Document GitHub org reader permissions using Github Apps Co-authored-by: Ben Lambert Signed-off-by: Johan Haals --- docs/integrations/github/email.png | Bin 0 -> 74065 bytes docs/integrations/github/org.md | 10 ++++++++++ docs/integrations/github/permissions.png | Bin 0 -> 31558 bytes 3 files changed, 10 insertions(+) create mode 100644 docs/integrations/github/email.png create mode 100644 docs/integrations/github/permissions.png diff --git a/docs/integrations/github/email.png b/docs/integrations/github/email.png new file mode 100644 index 0000000000000000000000000000000000000000..6a39938eec345d9a6d92331032a9d463da851758 GIT binary patch literal 74065 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 A9RL6T literal 0 HcmV?d00001 diff --git a/docs/integrations/github/org.md b/docs/integrations/github/org.md index 4a1bf88932..5ee650e29c 100644 --- a/docs/integrations/github/org.md +++ b/docs/integrations/github/org.md @@ -53,6 +53,16 @@ catalog: token: ${GITHUB_TOKEN} ``` +If Backstage is configured to use GitHub Apps authentication you must grant +`Read-Only` access for `Members` under `Organization` in order to ingest users +correctly. You can modify the app's permissions under the organization settings, +`https://github.com/organizations/{ORG}/settings/apps/{APP_NAME}/permissions`. +![permissions](./permissions.png) + +**Please note that when you change permissions, the app owner will get an email +that must be approved first before the changes are applied.** +![email](./email.png) + Locations point out the specific org(s) you want to import. The `type` of these locations must be `github-org`, and the `target` must point to the exact URL of some organization. You can have several such location entries if you want, but diff --git a/docs/integrations/github/permissions.png b/docs/integrations/github/permissions.png new file mode 100644 index 0000000000000000000000000000000000000000..78883ee2062200967baecf8d628a8a618bf8cd13 GIT binary patch literal 31558 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 Date: Fri, 21 May 2021 04:24:31 +0000 Subject: [PATCH 02/18] chore(deps-dev): bump @types/classnames from 2.2.11 to 2.3.1 Bumps [@types/classnames](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/classnames) from 2.2.11 to 2.3.1. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/classnames) Signed-off-by: dependabot[bot] --- yarn.lock | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/yarn.lock b/yarn.lock index befc88cefa..ffe1133d93 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5734,9 +5734,11 @@ integrity sha512-6ckxMjBBD8URvjB6J3NcnuAn5Pkl7t3TizAg+xdlzzQGSPSmBcXf8KoIH0ua/i+tio+ZRUHEXp0HEmvaR4kt0w== "@types/classnames@^2.2.9": - version "2.2.11" - resolved "https://registry.npmjs.org/@types/classnames/-/classnames-2.2.11.tgz#2521cc86f69d15c5b90664e4829d84566052c1cf" - integrity sha512-2koNhpWm3DgWRp5tpkiJ8JGc1xTn2q0l+jUNUE7oMKXUf5NpI9AIdC4kbjGNFBdHtcxBD18LAksoudAVhFKCjw== + version "2.3.1" + resolved "https://registry.npmjs.org/@types/classnames/-/classnames-2.3.1.tgz#3c2467aa0f1a93f1f021e3b9bcf938bd5dfdc0dd" + integrity sha512-zeOWb0JGBoVmlQoznvqXbE0tEC/HONsnoUNH19Hc96NFsTAwTXbTqb8FMYkru1F/iqp7a18Ws3nWJvtA1sHD1A== + dependencies: + classnames "*" "@types/clean-css@*": version "4.2.1" @@ -9681,7 +9683,7 @@ class-utils@^0.3.5: isobject "^3.0.0" static-extend "^0.1.1" -classnames@^2.2.5, classnames@^2.2.6, classnames@^2.3.1: +classnames@*, classnames@^2.2.5, classnames@^2.2.6, classnames@^2.3.1: version "2.3.1" resolved "https://registry.npmjs.org/classnames/-/classnames-2.3.1.tgz#dfcfa3891e306ec1dad105d0e88f4417b8535e8e" integrity sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA== From 0fd4ea44318d58e7b3c756fe338f7b8758ed9ea0 Mon Sep 17 00:00:00 2001 From: Johan Haals Date: Fri, 21 May 2021 14:21:58 +0200 Subject: [PATCH 03/18] Exclude emails using app auth with `GithubOrgReaderProcessor` Co-authored-by: Ben Lambert Signed-off-by: Johan Haals --- .changeset/giant-rivers-protect.md | 10 + .../github/GithubCredentialsProvider.test.ts | 7 +- .../src/github/GithubCredentialsProvider.ts | 6 + packages/integration/src/github/index.ts | 1 + .../GithubOrgReaderProcessor.test.ts | 171 ++++++++++++------ .../processors/GithubOrgReaderProcessor.ts | 81 ++------- .../processors/github/github.test.ts | 4 +- .../src/ingestion/processors/github/github.ts | 14 +- 8 files changed, 167 insertions(+), 127 deletions(-) create mode 100644 .changeset/giant-rivers-protect.md diff --git a/.changeset/giant-rivers-protect.md b/.changeset/giant-rivers-protect.md new file mode 100644 index 0000000000..cbf11a47c0 --- /dev/null +++ b/.changeset/giant-rivers-protect.md @@ -0,0 +1,10 @@ +--- +'@backstage/integration': patch +'@backstage/plugin-catalog-backend': minor +--- + +Updates the `GithubCredentialsProvider` to return the token type, it can either be `token` or `app` depending on the authentication method. + +Update the `GithubOrgReaderProcessor` NOT to query for email addresses if GitHub Apps is used for authentication, this is due to inconsistencies in the GitHub API when using server to server communications and installation tokens. https://github.community/t/api-v4-unable-to-retrieve-email-resource-not-accessible-by-integration/13831/4 for more info. + +**Removes** deprecated GithubOrgReaderProcessor provider configuration(`catalog.processors.githubOrg`). If you're using the deprecated config section make sure to migrate to [integrations](https://backstage.io/docs/integrations/github/locations) instead. diff --git a/packages/integration/src/github/GithubCredentialsProvider.test.ts b/packages/integration/src/github/GithubCredentialsProvider.test.ts index d295677c55..271d4b9920 100644 --- a/packages/integration/src/github/GithubCredentialsProvider.test.ts +++ b/packages/integration/src/github/GithubCredentialsProvider.test.ts @@ -81,13 +81,13 @@ describe('GithubCredentialsProvider tests', () => { }, } as RestEndpointMethodTypes['apps']['createInstallationAccessToken']['response']); - const { token, headers } = await github.getCredentials({ + const { token, headers, type } = await github.getCredentials({ url: 'https://github.com/backstage/foobar', }); const { token: accessToken2 } = await github.getCredentials({ url: 'https://github.com/backstage/foobar', }); - + expect(type).toEqual('app'); expect(token).toEqual('secret_token'); expect(token).toEqual(accessToken2); expect(headers).toEqual({ Authorization: 'Bearer secret_token' }); @@ -102,6 +102,7 @@ describe('GithubCredentialsProvider tests', () => { Authorization: 'Bearer hardcoded_token', }, token: 'hardcoded_token', + type: 'token', }); }); @@ -260,6 +261,6 @@ describe('GithubCredentialsProvider tests', () => { githubProvider.getCredentials({ url: 'https://github.com/backstage', }), - ).resolves.toEqual({ headers: undefined, token: undefined }); + ).resolves.toEqual({ headers: undefined, token: undefined, type: 'token' }); }); }); diff --git a/packages/integration/src/github/GithubCredentialsProvider.ts b/packages/integration/src/github/GithubCredentialsProvider.ts index 0bf217c824..c9fa6cf4ce 100644 --- a/packages/integration/src/github/GithubCredentialsProvider.ts +++ b/packages/integration/src/github/GithubCredentialsProvider.ts @@ -192,9 +192,12 @@ export class GithubAppCredentialsMux { } } +export type GithubCredentialType = 'app' | 'token'; + export type GithubCredentials = { headers?: { [name: string]: string }; token?: string; + type: GithubCredentialType; }; // TODO: Possibly move this to a backend only package so that it's not used in the frontend by mistake @@ -226,8 +229,10 @@ export class GithubCredentialsProvider { const owner = parsed.owner || parsed.name; const repo = parsed.owner ? parsed.name : undefined; + let type: 'app' | 'token' = 'app'; let token = await this.githubAppCredentialsMux.getAppToken(owner, repo); if (!token) { + type = 'token'; token = this.token; } @@ -238,6 +243,7 @@ export class GithubCredentialsProvider { } : undefined, token, + type, }; } } diff --git a/packages/integration/src/github/index.ts b/packages/integration/src/github/index.ts index 99d2f56d0f..ee92b7d934 100644 --- a/packages/integration/src/github/index.ts +++ b/packages/integration/src/github/index.ts @@ -21,4 +21,5 @@ export { export type { GitHubIntegrationConfig } from './config'; export { getGitHubFileFetchUrl, getGitHubRequestOptions } from './core'; export { GithubCredentialsProvider } from './GithubCredentialsProvider'; +export type { GithubCredentialType } from './GithubCredentialsProvider'; export { GitHubIntegration } from './GitHubIntegration'; diff --git a/plugins/catalog-backend/src/ingestion/processors/GithubOrgReaderProcessor.test.ts b/plugins/catalog-backend/src/ingestion/processors/GithubOrgReaderProcessor.test.ts index 9b724def28..dc6a2e5ec2 100644 --- a/plugins/catalog-backend/src/ingestion/processors/GithubOrgReaderProcessor.test.ts +++ b/plugins/catalog-backend/src/ingestion/processors/GithubOrgReaderProcessor.test.ts @@ -13,15 +13,16 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - +jest.mock('@octokit/graphql'); import { getVoidLogger } from '@backstage/backend-common'; import { LocationSpec } from '@backstage/catalog-model'; import { - GitHubIntegration, ScmIntegrations, - ScmIntegrationsGroup, + GithubCredentialsProvider, } from '@backstage/integration'; import { GithubOrgReaderProcessor, parseUrl } from './GithubOrgReaderProcessor'; +import { graphql } from '@octokit/graphql'; +import { ConfigReader } from '@backstage/config'; describe('GithubOrgReaderProcessor', () => { describe('parseUrl', () => { @@ -34,67 +35,27 @@ describe('GithubOrgReaderProcessor', () => { }); describe('implementation', () => { - let integrations: ScmIntegrations; - let github: jest.Mocked>; + const logger = getVoidLogger(); + const integrations = ScmIntegrations.fromConfig( + new ConfigReader({ + integrations: { + github: [ + { + host: 'github.com', + }, + ], + }, + }), + ); beforeEach(() => { - github = { - byHost: jest.fn(), - byUrl: jest.fn(), - list: jest.fn(), - }; - integrations = ({ - github, - } as Partial) as ScmIntegrations; - }); - - it('rejects unknown types', async () => { - const processor = new GithubOrgReaderProcessor({ - providers: [ - { - target: 'https://github.com', - apiBaseUrl: 'https://api.github.com', - }, - ], - integrations, - logger: getVoidLogger(), - }); - const location: LocationSpec = { - type: 'not-github-org', - target: 'https://github.com', - }; - await expect( - processor.readLocation(location, false, () => {}), - ).resolves.toBeFalsy(); - }); - - it('rejects unknown targets from providers', async () => { - const processor = new GithubOrgReaderProcessor({ - providers: [ - { - target: 'https://github.com', - apiBaseUrl: 'https://api.github.com', - }, - ], - integrations, - logger: getVoidLogger(), - }); - const location: LocationSpec = { - type: 'github-org', - target: 'https://not.github.com/apa', - }; - await expect( - processor.readLocation(location, false, () => {}), - ).rejects.toThrow( - /There is no GitHub Org provider that matches https:\/\/not.github.com\/apa/, - ); + jest.resetAllMocks(); }); it('rejects unknown targets from integrations', async () => { const processor = new GithubOrgReaderProcessor({ - providers: [], integrations, - logger: getVoidLogger(), + logger, }); const location: LocationSpec = { type: 'github-org', @@ -106,5 +67,101 @@ describe('GithubOrgReaderProcessor', () => { /There is no GitHub Org provider that matches https:\/\/not.github.com\/apa/, ); }); + + it('should not query for email addresses when GitHub Apps is used for authentication', async () => { + const mockGetCredentials = jest.fn().mockReturnValue({ + headers: { token: 'blah' }, + type: 'app', + }); + + const mockClient = jest.fn(); + + mockClient + .mockResolvedValueOnce({ + organization: { + membersWithRole: { pageInfo: { hasNextPage: false }, nodes: [{}] }, + }, + }) + .mockResolvedValueOnce({ + organization: { + teams: { + pageInfo: { hasNextPage: false }, + nodes: [ + { members: { pageInfo: { hasNextPage: false }, nodes: [{}] } }, + ], + }, + }, + }); + + (graphql.defaults as jest.Mock).mockReturnValue(mockClient); + + jest.spyOn(GithubCredentialsProvider, 'create').mockReturnValue({ + getCredentials: mockGetCredentials, + } as any); + + const processor = new GithubOrgReaderProcessor({ + integrations, + logger, + }); + const location: LocationSpec = { + type: 'github-org', + target: 'https://github.com/backstage', + }; + + await processor.readLocation(location, false, () => {}); + + expect(mockClient).toHaveBeenCalledWith( + expect.stringContaining('@include(if: $email)'), + expect.objectContaining({ email: false }), + ); + }); + + it('should query for email addresses when token is used for authentication', async () => { + const mockGetCredentials = jest.fn().mockReturnValue({ + headers: { token: 'blah' }, + type: 'token', + }); + + const mockClient = jest.fn(); + + mockClient + .mockResolvedValueOnce({ + organization: { + membersWithRole: { pageInfo: { hasNextPage: false }, nodes: [{}] }, + }, + }) + .mockResolvedValueOnce({ + organization: { + teams: { + pageInfo: { hasNextPage: false }, + nodes: [ + { members: { pageInfo: { hasNextPage: false }, nodes: [{}] } }, + ], + }, + }, + }); + + (graphql.defaults as jest.Mock).mockReturnValue(mockClient); + + jest.spyOn(GithubCredentialsProvider, 'create').mockReturnValue({ + getCredentials: mockGetCredentials, + } as any); + + const processor = new GithubOrgReaderProcessor({ + integrations, + logger, + }); + const location: LocationSpec = { + type: 'github-org', + target: 'https://github.com/backstage', + }; + + await processor.readLocation(location, false, () => {}); + + expect(mockClient).toHaveBeenCalledWith( + expect.stringContaining('@include(if: $email)'), + expect.objectContaining({ email: true }), + ); + }); }); }); diff --git a/plugins/catalog-backend/src/ingestion/processors/GithubOrgReaderProcessor.ts b/plugins/catalog-backend/src/ingestion/processors/GithubOrgReaderProcessor.ts index 14204adde7..6a2b4bd8b1 100644 --- a/plugins/catalog-backend/src/ingestion/processors/GithubOrgReaderProcessor.ts +++ b/plugins/catalog-backend/src/ingestion/processors/GithubOrgReaderProcessor.ts @@ -18,16 +18,12 @@ import { LocationSpec } from '@backstage/catalog-model'; import { Config } from '@backstage/config'; import { GithubCredentialsProvider, + GithubCredentialType, ScmIntegrations, } from '@backstage/integration'; import { graphql } from '@octokit/graphql'; import { Logger } from 'winston'; -import { - getOrganizationTeams, - getOrganizationUsers, - ProviderConfig, - readGithubConfig, -} from './github'; +import { getOrganizationTeams, getOrganizationUsers } from './github'; import * as results from './results'; import { CatalogProcessor, CatalogProcessorEmit } from './types'; import { buildOrgHierarchy } from './util/org'; @@ -38,7 +34,6 @@ type GraphQL = typeof graphql; * Extracts teams and users out of a GitHub org. */ export class GithubOrgReaderProcessor implements CatalogProcessor { - private readonly providers: ProviderConfig[]; private readonly integrations: ScmIntegrations; private readonly logger: Logger; @@ -47,17 +42,11 @@ export class GithubOrgReaderProcessor implements CatalogProcessor { return new GithubOrgReaderProcessor({ ...options, - providers: readGithubConfig(config), integrations, }); } - constructor(options: { - providers: ProviderConfig[]; - integrations: ScmIntegrations; - logger: Logger; - }) { - this.providers = options.providers; + constructor(options: { integrations: ScmIntegrations; logger: Logger }) { this.integrations = options.integrations; this.logger = options.logger; } @@ -71,14 +60,14 @@ export class GithubOrgReaderProcessor implements CatalogProcessor { return false; } - const client = await this.createClient(location.target); + const { client, tokenType } = await this.createClient(location.target); const { org } = parseUrl(location.target); // Read out all of the raw data const startTimestamp = Date.now(); this.logger.info('Reading GitHub users and groups'); - const { users } = await getOrganizationUsers(client, org); + const { users } = await getOrganizationUsers(client, org, tokenType); const { groups, groupMemberUsers } = await getOrganizationTeams( client, org, @@ -112,65 +101,31 @@ export class GithubOrgReaderProcessor implements CatalogProcessor { return true; } - private async createClient(orgUrl: string): Promise { - let client = await this.createClientFromIntegrations(orgUrl); + private async createClient( + orgUrl: string, + ): Promise<{ client: GraphQL; tokenType: GithubCredentialType }> { + const gitHubConfig = this.integrations.github.byUrl(orgUrl)?.config; - if (!client) { - client = await this.createClientFromProvider(orgUrl); - } - - if (!client) { + if (!gitHubConfig) { throw new Error( - `There is no GitHub Org provider that matches ${orgUrl}. Please add a configuration for an integration or add an entry for it under catalog.processors.githubOrg.providers.`, + `There is no GitHub Org provider that matches ${orgUrl}. Please add a configuration for an integration.`, ); } - return client; - } - - private async createClientFromProvider( - orgUrl: string, - ): Promise { - const provider = this.providers.find(p => - orgUrl.startsWith(`${p.target}/`), - ); - - if (!provider) { - return undefined; - } - - this.logger.warn( - 'GithubOrgReaderProcessor uses provider defined in catalog.processors.githubOrg.providers, migrate to integrations instead. See https://backstage.io/docs/integrations/github/locations', - ); - - return !provider.token - ? graphql - : graphql.defaults({ - baseUrl: provider.apiBaseUrl, - headers: { - authorization: `token ${provider.token}`, - }, - }); - } - - private async createClientFromIntegrations( - orgUrl: string, - ): Promise { - const gitHubConfig = this.integrations.github.byUrl(orgUrl)?.config; - if (!gitHubConfig) { - return undefined; - } - const credentialsProvider = GithubCredentialsProvider.create(gitHubConfig); - - const { headers } = await credentialsProvider.getCredentials({ + const { + headers, + type: tokenType, + } = await credentialsProvider.getCredentials({ url: orgUrl, }); - return graphql.defaults({ + const client = graphql.defaults({ baseUrl: gitHubConfig.apiBaseUrl, headers, }); + + return { client, tokenType }; } } diff --git a/plugins/catalog-backend/src/ingestion/processors/github/github.test.ts b/plugins/catalog-backend/src/ingestion/processors/github/github.test.ts index 88bddc93fb..c5094230f8 100644 --- a/plugins/catalog-backend/src/ingestion/processors/github/github.test.ts +++ b/plugins/catalog-backend/src/ingestion/processors/github/github.test.ts @@ -65,7 +65,9 @@ describe('github', () => { graphqlMsw.query('users', (_req, res, ctx) => res(ctx.data(input))), ); - await expect(getOrganizationUsers(graphql, 'a')).resolves.toEqual(output); + await expect( + getOrganizationUsers(graphql, 'a', 'token'), + ).resolves.toEqual(output); }); }); diff --git a/plugins/catalog-backend/src/ingestion/processors/github/github.ts b/plugins/catalog-backend/src/ingestion/processors/github/github.ts index f6cfcb8901..2cc97d2ec5 100644 --- a/plugins/catalog-backend/src/ingestion/processors/github/github.ts +++ b/plugins/catalog-backend/src/ingestion/processors/github/github.ts @@ -15,6 +15,7 @@ */ import { GroupEntity, UserEntity } from '@backstage/catalog-model'; +import { GithubCredentialType } from '@backstage/integration'; import { graphql } from '@octokit/graphql'; // Graphql types @@ -77,13 +78,20 @@ export type Connection = { export async function getOrganizationUsers( client: typeof graphql, org: string, + tokenType: GithubCredentialType, ): Promise<{ users: UserEntity[] }> { const query = ` - query users($org: String!, $cursor: String) { + query users($org: String!, $email: Boolean!, $cursor: String) { organization(login: $org) { membersWithRole(first: 100, after: $cursor) { pageInfo { hasNextPage, endCursor } - nodes { avatarUrl, bio, email, login, name } + nodes { + avatarUrl, + bio, + email @include(if: $email), + login, + name + } } } }`; @@ -119,7 +127,7 @@ export async function getOrganizationUsers( query, r => r.organization?.membersWithRole, mapper, - { org }, + { org, email: tokenType === 'token' }, ); return { users }; From cdda0401293fadf8f3529cd9d53839bcb1a9af13 Mon Sep 17 00:00:00 2001 From: Johan Haals Date: Fri, 21 May 2021 14:28:42 +0200 Subject: [PATCH 04/18] Update api-report Signed-off-by: Johan Haals --- packages/integration/api-report.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/integration/api-report.md b/packages/integration/api-report.md index 5387eb12db..31cbc8b5d8 100644 --- a/packages/integration/api-report.md +++ b/packages/integration/api-report.md @@ -115,6 +115,9 @@ export class GithubCredentialsProvider { }): Promise; } +// @public (undocumented) +export type GithubCredentialType = 'app' | 'token'; + // @public (undocumented) export class GitHubIntegration implements ScmIntegration { constructor(integrationConfig: GitHubIntegrationConfig); From 66fee560e51b5085d3ade369850292a54606a368 Mon Sep 17 00:00:00 2001 From: Johan Haals Date: Fri, 21 May 2021 14:46:51 +0200 Subject: [PATCH 05/18] Update packages/integration/src/github/GithubCredentialsProvider.ts Signed-off-by: Johan Haals Co-authored-by: Ben Lambert <3645856+benjdlambert@users.noreply.github.com> --- packages/integration/src/github/GithubCredentialsProvider.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/integration/src/github/GithubCredentialsProvider.ts b/packages/integration/src/github/GithubCredentialsProvider.ts index c9fa6cf4ce..24f0b13a33 100644 --- a/packages/integration/src/github/GithubCredentialsProvider.ts +++ b/packages/integration/src/github/GithubCredentialsProvider.ts @@ -229,7 +229,7 @@ export class GithubCredentialsProvider { const owner = parsed.owner || parsed.name; const repo = parsed.owner ? parsed.name : undefined; - let type: 'app' | 'token' = 'app'; + let type: GithubCredentialType = 'app'; let token = await this.githubAppCredentialsMux.getAppToken(owner, repo); if (!token) { type = 'token'; From 7417241fcc044abc008132be779ff9cf5a074b06 Mon Sep 17 00:00:00 2001 From: Johan Haals Date: Fri, 21 May 2021 14:52:20 +0200 Subject: [PATCH 06/18] fix format Signed-off-by: Johan Haals --- packages/integration/src/github/GithubCredentialsProvider.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/integration/src/github/GithubCredentialsProvider.ts b/packages/integration/src/github/GithubCredentialsProvider.ts index 24f0b13a33..9bc09deab3 100644 --- a/packages/integration/src/github/GithubCredentialsProvider.ts +++ b/packages/integration/src/github/GithubCredentialsProvider.ts @@ -229,7 +229,7 @@ export class GithubCredentialsProvider { const owner = parsed.owner || parsed.name; const repo = parsed.owner ? parsed.name : undefined; - let type: GithubCredentialType = 'app'; + let type: GithubCredentialType = 'app'; let token = await this.githubAppCredentialsMux.getAppToken(owner, repo); if (!token) { type = 'token'; From 76e6c0b53bec88c9bfd9d8e1e2e20448babc49b3 Mon Sep 17 00:00:00 2001 From: Marcus Eide Date: Fri, 21 May 2021 15:14:37 +0200 Subject: [PATCH 07/18] Add yaml support in jest Signed-off-by: Marcus Eide --- packages/cli/config/jest.js | 1 + packages/cli/package.json | 1 + yarn.lock | 16 ++++++++++++++++ 3 files changed, 18 insertions(+) diff --git a/packages/cli/config/jest.js b/packages/cli/config/jest.js index 94cf059cbd..4a2ae7119c 100644 --- a/packages/cli/config/jest.js +++ b/packages/cli/config/jest.js @@ -89,6 +89,7 @@ async function getConfig() { '\\.(bmp|gif|jpg|jpeg|png|frag|xml|svg)$': require.resolve( './jestFileTransform.js', ), + '\\.(yaml)$': require.resolve('yaml-jest'), }, // A bit more opinionated diff --git a/packages/cli/package.json b/packages/cli/package.json index a72ef48bf3..12d8373ba5 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -113,6 +113,7 @@ "webpack-dev-server": "3.11.0", "webpack-node-externals": "^2.5.0", "yaml": "^1.10.0", + "yaml-jest": "^1.0.5", "yml-loader": "^2.1.0", "yn": "^4.0.0" }, diff --git a/yarn.lock b/yarn.lock index befc88cefa..29efdd5356 100644 --- a/yarn.lock +++ b/yarn.lock @@ -16809,6 +16809,14 @@ js-yaml@^3.13.0, js-yaml@^3.13.1, js-yaml@^3.14.0, js-yaml@^3.6.1, js-yaml@^3.8. argparse "^1.0.7" esprima "^4.0.0" +js-yaml@^3.7.0: + version "3.14.1" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + js-yaml@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.0.0.tgz#f426bc0ff4b4051926cd588c71113183409a121f" @@ -18740,6 +18748,7 @@ minipass-fetch@^1.3.0, minipass-fetch@^1.3.2: resolved "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.3.3.tgz#34c7cea038c817a8658461bf35174551dce17a0a" integrity sha512-akCrLDWfbdAWkMLBxJEeWTdNsjML+dt5YgOI4gJ53vuO0vrmYQkUPxa6j6V65s9CcePIr2SSWqjT2EcrNseryQ== dependencies: + encoding "^0.1.12" minipass "^3.1.0" minipass-sized "^1.0.3" minizlib "^2.0.0" @@ -27119,6 +27128,13 @@ yaml-ast-parser@0.0.43, yaml-ast-parser@^0.0.43: resolved "https://registry.npmjs.org/yaml-ast-parser/-/yaml-ast-parser-0.0.43.tgz#e8a23e6fb4c38076ab92995c5dca33f3d3d7c9bb" integrity sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A== +yaml-jest@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/yaml-jest/-/yaml-jest-1.0.5.tgz#288e541bae1b551d113d4864d6cb8f316e1bd331" + integrity sha1-KI5UG64bVR0RPUhk1suPMW4b0zE= + dependencies: + js-yaml "^3.7.0" + yaml@^1.10.0, yaml@^1.7.2, yaml@^1.9.2: version "1.10.2" resolved "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" From 1cd0cacd9104521a0e18ce0ca0df2d0dcf398f18 Mon Sep 17 00:00:00 2001 From: Marcus Eide Date: Fri, 21 May 2021 15:16:01 +0200 Subject: [PATCH 08/18] Add changeset Signed-off-by: Marcus Eide --- .changeset/shaggy-ligers-run.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/shaggy-ligers-run.md diff --git a/.changeset/shaggy-ligers-run.md b/.changeset/shaggy-ligers-run.md new file mode 100644 index 0000000000..b6ad53e418 --- /dev/null +++ b/.changeset/shaggy-ligers-run.md @@ -0,0 +1,5 @@ +--- +'@backstage/cli': patch +--- + +Add support for transforming yaml files in jest with 'yaml-jest' From 4ea9df9d33336351d8a3296e1c4cab8848c82440 Mon Sep 17 00:00:00 2001 From: Crevil Date: Fri, 21 May 2021 21:52:27 +0200 Subject: [PATCH 09/18] Set techdocs admonition font size to 1rem Currently admonitions in TechDocs are rendered with font size 0.64rem which is much smaller than the rest of the text. This makes admontions hard to read and further "undo"s the attention they are here to provide. This change adds a style overide, like we do with tables that sets the size to 1rem for bot collapsable and expanded admonitions. Some trailing whitespace in the CSS styles is removed as well. Signed-off-by: Crevil --- .changeset/shiny-keys-dream.md | 6 ++++++ .../techdocs/src/reader/components/Reader.tsx | 17 ++++++++++------- 2 files changed, 16 insertions(+), 7 deletions(-) create mode 100644 .changeset/shiny-keys-dream.md diff --git a/.changeset/shiny-keys-dream.md b/.changeset/shiny-keys-dream.md new file mode 100644 index 0000000000..3e28f5d431 --- /dev/null +++ b/.changeset/shiny-keys-dream.md @@ -0,0 +1,6 @@ +--- +'@backstage/plugin-techdocs': patch +--- + +Set admonition font size to 1rem in TechDocs to align with the rest of the document's font sizes. +Fixes #5448 and #5541. diff --git a/plugins/techdocs/src/reader/components/Reader.tsx b/plugins/techdocs/src/reader/components/Reader.tsx index 09cd3abec8..c779985364 100644 --- a/plugins/techdocs/src/reader/components/Reader.tsx +++ b/plugins/techdocs/src/reader/components/Reader.tsx @@ -183,21 +183,24 @@ export const Reader = ({ entityId, onReady }: Props) => { border-bottom: 1px solid ${theme.palette.text.primary}; } .md-typeset table:not([class]) th { font-weight: bold; } + .md-typeset .admonition, .md-typeset details { + font-size: 1rem; + } @media screen and (max-width: 76.1875em) { - .md-nav { - background-color: ${theme.palette.background.default}; + .md-nav { + background-color: ${theme.palette.background.default}; transition: none !important } .md-sidebar--secondary { display: none; } .md-sidebar--primary { left: 72px; width: 10rem } .md-content { margin-left: 10rem; max-width: calc(100% - 10rem); } .md-content__inner { font-size: 0.9rem } - .md-footer { - position: static; - margin-left: 10rem; - width: calc(100% - 10rem); + .md-footer { + position: static; + margin-left: 10rem; + width: calc(100% - 10rem); } - .md-nav--primary .md-nav__title { + .md-nav--primary .md-nav__title { white-space: normal; height: auto; line-height: 1rem; From 0b4c50cba8c449caff1649513a04ec0c7350c33e Mon Sep 17 00:00:00 2001 From: Himanshu Mishra Date: Sun, 23 May 2021 13:17:17 +0200 Subject: [PATCH 10/18] docs: Update GitLab auth environment variable names Sync with the names used in `app-config.yaml` https://github.com/backstage/backstage/blob/f681f408d443fa75ed0de4ee0cde8de03357be72/app-config.yaml#L283-L286 Signed-off-by: Himanshu Mishra --- docs/auth/gitlab/provider.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/auth/gitlab/provider.md b/docs/auth/gitlab/provider.md index 8e9c499dc4..c7ac2cedc9 100644 --- a/docs/auth/gitlab/provider.md +++ b/docs/auth/gitlab/provider.md @@ -31,8 +31,8 @@ auth: providers: gitlab: development: - clientId: ${AUTH_GITLAB_APPLICATION_ID} - clientSecret: ${AUTH_GITLAB_SECRET} + clientId: ${AUTH_GITLAB_CLIENT_ID} + clientSecret: ${AUTH_GITLAB_CLIENT_SECRET} ## uncomment if using self-hosted GitLab # audience: https://gitlab.company.com ``` From b1e08db2f18408a684122f5a5d464be8209dee51 Mon Sep 17 00:00:00 2001 From: Tim Date: Sun, 23 May 2021 11:33:21 -0600 Subject: [PATCH 11/18] Exclude rfc label from stalebot Signed-off-by: Tim Hansen --- .github/stale.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/stale.yml b/.github/stale.yml index 1b3792ab5e..3cd0d53720 100644 --- a/.github/stale.yml +++ b/.github/stale.yml @@ -9,6 +9,7 @@ exemptLabels: - plugin - help wanted - good first issue + - rfc # Label to use when marking an issue as stale staleLabel: stale # Comment to post when marking an issue as stale. Set to `false` to disable From 32925b0d00dd757e034e45352c8cce5379679c47 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Sun, 23 May 2021 19:37:37 +0200 Subject: [PATCH 12/18] docs: remove plugins from createApp examples + clarify app auth tutorial Signed-off-by: Patrik Oldsberg --- docs/auth/index.md | 2 -- docs/tutorials/quickstart-app-auth.md | 4 ++-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/docs/auth/index.md b/docs/auth/index.md index f3783c79f3..000c57a50c 100644 --- a/docs/auth/index.md +++ b/docs/auth/index.md @@ -77,7 +77,6 @@ built-in providers: + const app = createApp({ apis, - plugins: Object.values(plugins), + components: { + SignInPage: props => ( + ( + ( Date: Mon, 24 May 2021 08:12:01 +0000 Subject: [PATCH 13/18] [ImgBot] Optimize images *Total -- 103.15kb -> 64.16kb (37.8%) /docs/integrations/github/permissions.png -- 30.82kb -> 18.69kb (39.37%) /docs/integrations/github/email.png -- 72.33kb -> 45.47kb (37.13%) Signed-off-by: ImgBotApp --- docs/integrations/github/email.png | Bin 74065 -> 46561 bytes docs/integrations/github/permissions.png | Bin 31558 -> 19135 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/integrations/github/email.png b/docs/integrations/github/email.png index 6a39938eec345d9a6d92331032a9d463da851758..763cfbcd58db7f57c4eaf28a4c6a0053267cf204 100644 GIT binary patch literal 46561 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 U&vP0M4mfb@y5Y4#9ml`^8AQ~0_y7O^ literal 74065 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 A9RL6T diff --git a/docs/integrations/github/permissions.png b/docs/integrations/github/permissions.png index 78883ee2062200967baecf8d628a8a618bf8cd13..4928b184ac26909ce8bd226fb755e25863918982 100644 GIT binary patch literal 19135 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 literal 31558 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 Date: Mon, 24 May 2021 09:46:01 +0200 Subject: [PATCH 14/18] Foundation for standard status values MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .changeset/great-ducks-bow.md | 7 +++ packages/catalog-client/api-report.md | 18 ++++++ .../catalog-client/src/CatalogClient.test.ts | 3 +- packages/catalog-client/src/CatalogClient.ts | 4 +- packages/catalog-client/src/index.ts | 8 +-- .../src/{types.ts => types/api.ts} | 9 +-- .../catalog-client/src/types/discovery.ts | 22 +++++++ packages/catalog-client/src/types/index.ts | 28 +++++++++ packages/catalog-client/src/types/status.ts | 63 +++++++++++++++++++ packages/catalog-model/api-report.md | 9 +++ packages/catalog-model/src/entity/index.ts | 6 +- packages/catalog-model/src/entity/status.ts | 32 ++++++++++ plugins/catalog-backend/package.json | 1 + .../next/DefaultCatalogProcessingEngine.ts | 3 +- .../catalog-backend/src/next/Stitcher.test.ts | 5 +- plugins/catalog-backend/src/next/Stitcher.ts | 24 ++++--- 16 files changed, 210 insertions(+), 32 deletions(-) create mode 100644 .changeset/great-ducks-bow.md rename packages/catalog-client/src/{types.ts => types/api.ts} (91%) create mode 100644 packages/catalog-client/src/types/discovery.ts create mode 100644 packages/catalog-client/src/types/index.ts create mode 100644 packages/catalog-client/src/types/status.ts create mode 100644 packages/catalog-model/src/entity/status.ts diff --git a/.changeset/great-ducks-bow.md b/.changeset/great-ducks-bow.md new file mode 100644 index 0000000000..ff5d3a3458 --- /dev/null +++ b/.changeset/great-ducks-bow.md @@ -0,0 +1,7 @@ +--- +'@backstage/catalog-client': patch +'@backstage/catalog-model': patch +'@backstage/plugin-catalog-backend': patch +--- + +Foundation for standard entity status values diff --git a/packages/catalog-client/api-report.md b/packages/catalog-client/api-report.md index 4b489ff2e4..003e585671 100644 --- a/packages/catalog-client/api-report.md +++ b/packages/catalog-client/api-report.md @@ -7,6 +7,9 @@ import { Entity } from '@backstage/catalog-model'; import { EntityName } from '@backstage/catalog-model'; import { Location as Location_2 } from '@backstage/catalog-model'; +import { SerializedError } from '@backstage/errors'; +import { UNSTABLE_EntityStatusLevel } from '@backstage/catalog-model'; +import { UNSTABLE_EntityStatusValue } from '@backstage/catalog-model'; // @public (undocumented) export type AddLocationRequest = { @@ -76,6 +79,21 @@ export type CatalogListResponse = { items: T[]; }; +// @public +export const ENTITY_STATUS_CATALOG_PROCESSING_KEY = "backstage.io/catalog-processing"; + +// @public +export type UNSTABLE_CatalogProcessingStatus = UNSTABLE_EntityStatusValue & { + items?: UNSTABLE_CatalogProcessingStatusItem[]; +}; + +// @public (undocumented) +export type UNSTABLE_CatalogProcessingStatusItem = { + status: UNSTABLE_EntityStatusLevel; + message?: string; + error?: SerializedError; +}; + // (No @packageDocumentation comment for this package) diff --git a/packages/catalog-client/src/CatalogClient.test.ts b/packages/catalog-client/src/CatalogClient.test.ts index 359e3a2c60..98b378f5b0 100644 --- a/packages/catalog-client/src/CatalogClient.test.ts +++ b/packages/catalog-client/src/CatalogClient.test.ts @@ -18,7 +18,8 @@ import { Entity } from '@backstage/catalog-model'; import { rest } from 'msw'; import { setupServer } from 'msw/node'; import { CatalogClient } from './CatalogClient'; -import { CatalogListResponse, DiscoveryApi } from './types'; +import { CatalogListResponse } from './types/api'; +import { DiscoveryApi } from './types/discovery'; const server = setupServer(); const token = 'fake-token'; diff --git a/packages/catalog-client/src/CatalogClient.ts b/packages/catalog-client/src/CatalogClient.ts index 063db5a6a3..7c9b313ce7 100644 --- a/packages/catalog-client/src/CatalogClient.ts +++ b/packages/catalog-client/src/CatalogClient.ts @@ -31,8 +31,8 @@ import { CatalogEntitiesRequest, CatalogListResponse, CatalogRequestOptions, - DiscoveryApi, -} from './types'; +} from './types/api'; +import { DiscoveryApi } from './types/discovery'; export class CatalogClient implements CatalogApi { private readonly discoveryApi: DiscoveryApi; diff --git a/packages/catalog-client/src/index.ts b/packages/catalog-client/src/index.ts index c5a626e25b..59c652f9fd 100644 --- a/packages/catalog-client/src/index.ts +++ b/packages/catalog-client/src/index.ts @@ -15,10 +15,4 @@ */ export { CatalogClient } from './CatalogClient'; -export type { - AddLocationRequest, - AddLocationResponse, - CatalogApi, - CatalogEntitiesRequest, - CatalogListResponse, -} from './types'; +export * from './types'; diff --git a/packages/catalog-client/src/types.ts b/packages/catalog-client/src/types/api.ts similarity index 91% rename from packages/catalog-client/src/types.ts rename to packages/catalog-client/src/types/api.ts index ef907eafa9..f9ba2e9d8d 100644 --- a/packages/catalog-client/src/types.ts +++ b/packages/catalog-client/src/types/api.ts @@ -1,5 +1,5 @@ /* - * Copyright 2020 Spotify AB + * Copyright 2021 Spotify AB * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -81,10 +81,3 @@ export type AddLocationResponse = { location: Location; entities: Entity[]; }; - -/** - * This is a copy of the core DiscoveryApi, to avoid importing core. - */ -export type DiscoveryApi = { - getBaseUrl(pluginId: string): Promise; -}; diff --git a/packages/catalog-client/src/types/discovery.ts b/packages/catalog-client/src/types/discovery.ts new file mode 100644 index 0000000000..90eb748b2f --- /dev/null +++ b/packages/catalog-client/src/types/discovery.ts @@ -0,0 +1,22 @@ +/* + * Copyright 2021 Spotify AB + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * This is a copy of the core DiscoveryApi, to avoid importing core. + */ +export type DiscoveryApi = { + getBaseUrl(pluginId: string): Promise; +}; diff --git a/packages/catalog-client/src/types/index.ts b/packages/catalog-client/src/types/index.ts new file mode 100644 index 0000000000..16850a0fc0 --- /dev/null +++ b/packages/catalog-client/src/types/index.ts @@ -0,0 +1,28 @@ +/* + * Copyright 2021 Spotify AB + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export type { + AddLocationRequest, + AddLocationResponse, + CatalogApi, + CatalogEntitiesRequest, + CatalogListResponse, +} from './api'; +export { ENTITY_STATUS_CATALOG_PROCESSING_KEY } from './status'; +export type { + UNSTABLE_CatalogProcessingStatus, + UNSTABLE_CatalogProcessingStatusItem, +} from './status'; diff --git a/packages/catalog-client/src/types/status.ts b/packages/catalog-client/src/types/status.ts new file mode 100644 index 0000000000..6c39a83ea7 --- /dev/null +++ b/packages/catalog-client/src/types/status.ts @@ -0,0 +1,63 @@ +/* + * Copyright 2021 Spotify AB + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { + UNSTABLE_EntityStatusLevel, + UNSTABLE_EntityStatusValue, +} from '@backstage/catalog-model'; +import { SerializedError } from '@backstage/errors'; + +/* + * This is the entity status field that's emitted by the catalog processing + * engine, to inform about the status of an entity. + * + * Example: + * + * "status": { + * "backstage.io/catalog-processing": { + * "status": "error", + * "items": [ + * { + * "status": "error", + * "error": { + * "name": "InputError", + * "message": "Syntax error: ..." + * } + * } + * ] + * } + * } + */ + +/** + * The entity `status` key for the status of the processing engine in regards + * to entity. + */ +export const ENTITY_STATUS_CATALOG_PROCESSING_KEY = + 'backstage.io/catalog-processing'; + +/** + * The status value for the `backstage.io/catalog-processing` key. + */ +export type UNSTABLE_CatalogProcessingStatus = UNSTABLE_EntityStatusValue & { + items?: UNSTABLE_CatalogProcessingStatusItem[]; +}; + +export type UNSTABLE_CatalogProcessingStatusItem = { + status: UNSTABLE_EntityStatusLevel; + message?: string; + error?: SerializedError; +}; diff --git a/packages/catalog-model/api-report.md b/packages/catalog-model/api-report.md index 890a45b6e7..c9118ce52c 100644 --- a/packages/catalog-model/api-report.md +++ b/packages/catalog-model/api-report.md @@ -528,6 +528,15 @@ export interface TemplateEntityV1beta2 extends Entity { // @public (undocumented) export const templateEntityV1beta2Validator: KindValidator; +// @public +export type UNSTABLE_EntityStatusLevel = 'ok' | 'info' | 'warning' | 'error'; + +// @public +export type UNSTABLE_EntityStatusValue = { + status: UNSTABLE_EntityStatusLevel; + message?: string; +}; + // @public (undocumented) interface UserEntityV1alpha1 extends Entity { // (undocumented) diff --git a/packages/catalog-model/src/entity/index.ts b/packages/catalog-model/src/entity/index.ts index 572df63557..330856125e 100644 --- a/packages/catalog-model/src/entity/index.ts +++ b/packages/catalog-model/src/entity/index.ts @@ -15,10 +15,10 @@ */ export { + EDIT_URL_ANNOTATION, ENTITY_DEFAULT_NAMESPACE, ENTITY_META_GENERATED_FIELDS, VIEW_URL_ANNOTATION, - EDIT_URL_ANNOTATION, } from './constants'; export type { Entity, @@ -36,6 +36,10 @@ export { serializeEntityRef, stringifyEntityRef, } from './ref'; +export type { + UNSTABLE_EntityStatusLevel, + UNSTABLE_EntityStatusValue, +} from './status'; export { entityHasChanges, generateEntityEtag, diff --git a/packages/catalog-model/src/entity/status.ts b/packages/catalog-model/src/entity/status.ts new file mode 100644 index 0000000000..a819bea8f6 --- /dev/null +++ b/packages/catalog-model/src/entity/status.ts @@ -0,0 +1,32 @@ +/* + * Copyright 2021 Spotify AB + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Each entity status entry has a level, describing its severity. + */ +export type UNSTABLE_EntityStatusLevel = + | 'ok' // Everything is OK + | 'info' // Only informative data + | 'warning' // Warnings were found + | 'error'; // Errors were found + +/** + * Reserved root fields in all `status` object values. + */ +export type UNSTABLE_EntityStatusValue = { + status: UNSTABLE_EntityStatusLevel; + message?: string; +}; diff --git a/plugins/catalog-backend/package.json b/plugins/catalog-backend/package.json index f55ca2c13f..2f0164ace5 100644 --- a/plugins/catalog-backend/package.json +++ b/plugins/catalog-backend/package.json @@ -31,6 +31,7 @@ "dependencies": { "@azure/msal-node": "^1.0.0-beta.3", "@backstage/backend-common": "^0.8.1", + "@backstage/catalog-client": "^0.3.11", "@backstage/catalog-model": "^0.7.10", "@backstage/config": "^0.1.5", "@backstage/errors": "^0.1.1", diff --git a/plugins/catalog-backend/src/next/DefaultCatalogProcessingEngine.ts b/plugins/catalog-backend/src/next/DefaultCatalogProcessingEngine.ts index 55cb8e2029..657c331a25 100644 --- a/plugins/catalog-backend/src/next/DefaultCatalogProcessingEngine.ts +++ b/plugins/catalog-backend/src/next/DefaultCatalogProcessingEngine.ts @@ -15,6 +15,7 @@ */ import { stringifyEntityRef } from '@backstage/catalog-model'; +import { serializeError } from '@backstage/errors'; import { Logger } from 'winston'; import { ProcessingDatabase } from './database/types'; import { Stitcher } from './Stitcher'; @@ -128,7 +129,7 @@ export class DefaultCatalogProcessingEngine implements CatalogProcessingEngine { id, processedEntity: result.completedEntity, state: result.state, - errors: JSON.stringify(result.errors), + errors: JSON.stringify(result.errors.map(e => serializeError(e))), relations: result.relations, deferredEntities: result.deferredEntities, }); diff --git a/plugins/catalog-backend/src/next/Stitcher.test.ts b/plugins/catalog-backend/src/next/Stitcher.test.ts index 644284f3e4..75286743c3 100644 --- a/plugins/catalog-backend/src/next/Stitcher.test.ts +++ b/plugins/catalog-backend/src/next/Stitcher.test.ts @@ -16,6 +16,7 @@ import { getVoidLogger } from '@backstage/backend-common'; import { Knex } from 'knex'; +import { ENTITY_STATUS_CATALOG_PROCESSING_KEY } from '@backstage/catalog-client'; import { DatabaseManager } from './database/DatabaseManager'; import { DbRefreshStateReferencesRow, @@ -92,7 +93,7 @@ describe('Stitcher', () => { }, ], status: { - 'backstage.io/catalog-processing': {}, + [ENTITY_STATUS_CATALOG_PROCESSING_KEY]: { status: 'ok' }, }, apiVersion: 'a', kind: 'k', @@ -175,7 +176,7 @@ describe('Stitcher', () => { }, ]), status: { - 'backstage.io/catalog-processing': {}, + [ENTITY_STATUS_CATALOG_PROCESSING_KEY]: { status: 'ok' }, }, apiVersion: 'a', kind: 'k', diff --git a/plugins/catalog-backend/src/next/Stitcher.ts b/plugins/catalog-backend/src/next/Stitcher.ts index d7d4325ad0..36ead7d817 100644 --- a/plugins/catalog-backend/src/next/Stitcher.ts +++ b/plugins/catalog-backend/src/next/Stitcher.ts @@ -14,9 +14,12 @@ * limitations under the License. */ +import { + ENTITY_STATUS_CATALOG_PROCESSING_KEY, + UNSTABLE_CatalogProcessingStatusItem, +} from '@backstage/catalog-client'; import { Entity, parseEntityRef } from '@backstage/catalog-model'; -import { JsonObject } from '@backstage/config'; -import { ConflictError } from '@backstage/errors'; +import { ConflictError, SerializedError } from '@backstage/errors'; import { createHash } from 'crypto'; import stableStringify from 'fast-json-stable-stringify'; import { Knex } from 'knex'; @@ -36,10 +39,6 @@ export type DbFinalEntitiesRow = { final_entity: string; }; -type ProcessingStatus = { - errors?: JsonObject[]; -}; - function generateStableHash(entity: Entity) { return createHash('sha1') .update(stableStringify({ ...entity })) @@ -139,7 +138,7 @@ export class Stitcher { // it const entity = JSON.parse(processedEntity) as Entity; const isOrphan = Number(incomingReferenceCount) === 0; - const processingStatus: ProcessingStatus = {}; + let statusItems: UNSTABLE_CatalogProcessingStatusItem[] = []; if (isOrphan) { this.logger.debug(`${entityRef} is an orphan`); @@ -149,9 +148,12 @@ export class Stitcher { }; } if (errors) { - const parsedErrors = JSON.parse(errors); + const parsedErrors = JSON.parse(errors) as SerializedError[]; if (Array.isArray(parsedErrors) && parsedErrors.length) { - processingStatus.errors = parsedErrors; + statusItems = parsedErrors.map(e => ({ + status: 'error', + error: e, + })); } } @@ -165,7 +167,9 @@ export class Stitcher { })); entity.status = { ...entity.status, - 'backstage.io/catalog-processing': processingStatus, + [ENTITY_STATUS_CATALOG_PROCESSING_KEY]: statusItems.length + ? { status: 'error', items: statusItems } + : { status: 'ok' }, }; // If the output entity was actually not changed, just abort From b8fed4073eace0ffdb7a72ad8c2d49947c0aba62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Mon, 24 May 2021 10:41:38 +0200 Subject: [PATCH 15/18] bump caniuse db to get rid of browserslist warning MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- yarn.lock | 18 ++++-------------- 1 file changed, 4 insertions(+), 14 deletions(-) diff --git a/yarn.lock b/yarn.lock index befc88cefa..c51a922dcb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9409,20 +9409,10 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001035, caniuse-lite@^1.0.30001109: - version "1.0.30001113" - resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001113.tgz#22016ab55b5a8b04fa00ca342d9ee1b98df48065" - integrity sha512-qMvjHiKH21zzM/VDZr6oosO6Ri3U0V2tC015jRXjOecwQCJtsU5zklTNTk31jQbIOP8gha0h1ccM/g0ECP+4BA== - -caniuse-lite@^1.0.30001125: - version "1.0.30001198" - resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001198.tgz#ed2d9b5f060322ba2efa42afdc56dee3255473f4" - integrity sha512-r5GGgESqOPZzwvdLVER374FpQu2WluCF1Z2DSiFJ89KSmGjT0LVKjgv4NcAqHmGWF9ihNpqRI9KXO9Ex4sKsgA== - -caniuse-lite@^1.0.30001164: - version "1.0.30001165" - resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001165.tgz#32955490d2f60290bb186bb754f2981917fa744f" - integrity sha512-8cEsSMwXfx7lWSUMA2s08z9dIgsnR5NAqjXP23stdsU3AUWkCr/rr4s4OFtHXn5XXr6+7kam3QFVoYyXNPdJPA== +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001035, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001125, caniuse-lite@^1.0.30001164: + version "1.0.30001228" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001228.tgz" + integrity sha512-QQmLOGJ3DEgokHbMSA8cj2a+geXqmnpyOFT0lhQV6P3/YOJvGDEwoedcwxEQ30gJIwIIunHIicunJ2rzK5gB2A== canvas@^2.6.1: version "2.7.0" From fd381447a5d8dc1508e2429c535e21c7ede99ef4 Mon Sep 17 00:00:00 2001 From: Eric Peterson Date: Mon, 24 May 2021 17:51:53 +0200 Subject: [PATCH 16/18] Fixes WSOD when loading docs with un-parseable URLs that were auto-transformed to links by mkdocs Signed-off-by: Eric Peterson --- .../reader/transformers/rewriteDocLinks.test.ts | 15 +++++++++++++++ .../src/reader/transformers/rewriteDocLinks.ts | 17 ++++++++++++----- 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/plugins/techdocs/src/reader/transformers/rewriteDocLinks.test.ts b/plugins/techdocs/src/reader/transformers/rewriteDocLinks.test.ts index ca85c64fbe..01467f665d 100644 --- a/plugins/techdocs/src/reader/transformers/rewriteDocLinks.test.ts +++ b/plugins/techdocs/src/reader/transformers/rewriteDocLinks.test.ts @@ -56,6 +56,21 @@ describe('rewriteDocLinks', () => { 'http://localhost/example-docs/example-page', ]); }); + + it('should rewrite non-parseable URLs as text', () => { + const expectedText = `www.my-internet.[top-level-domain]/pathname/[URLkey]`; + const shadowDom = createTestShadowDom( + `${expectedText}`, + { + preTransformers: [rewriteDocLinks()], + postTransformers: [], + }, + ); + + // There should be no tags, but the link text should remain. + expect(getSample(shadowDom, 'a', 'href')).toEqual([]); + expect(shadowDom.innerHTML).toContain(expectedText); + }); }); describe('normalizeUrl', () => { diff --git a/plugins/techdocs/src/reader/transformers/rewriteDocLinks.ts b/plugins/techdocs/src/reader/transformers/rewriteDocLinks.ts index 5c4a730963..8c4bc29201 100644 --- a/plugins/techdocs/src/reader/transformers/rewriteDocLinks.ts +++ b/plugins/techdocs/src/reader/transformers/rewriteDocLinks.ts @@ -31,12 +31,19 @@ export const rewriteDocLinks = (): Transformer => { if (elemAttribute.match(/^https?:\/\//i)) { elem.setAttribute('target', '_blank'); } - const normalizedWindowLocation = normalizeUrl(window.location.href); - elem.setAttribute( - attributeName, - new URL(elemAttribute, normalizedWindowLocation).toString(), - ); + try { + const normalizedWindowLocation = normalizeUrl( + window.location.href, + ); + elem.setAttribute( + attributeName, + new URL(elemAttribute, normalizedWindowLocation).toString(), + ); + } catch (_e) { + // Non-parseable links should be re-written as plain text. + elem.replaceWith(elem.textContent || elemAttribute); + } } }); }; From bf805b4679fbe376267eef346b6668e79f79c59f Mon Sep 17 00:00:00 2001 From: Eric Peterson Date: Mon, 24 May 2021 17:56:18 +0200 Subject: [PATCH 17/18] Changeset. Signed-off-by: Eric Peterson --- .changeset/techdocs-are-readable.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/techdocs-are-readable.md diff --git a/.changeset/techdocs-are-readable.md b/.changeset/techdocs-are-readable.md new file mode 100644 index 0000000000..b780d4f2fe --- /dev/null +++ b/.changeset/techdocs-are-readable.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-techdocs': patch +--- + +Fixes #5529, a bug that prevented TechDocs from rendering pages containing malformed links. From aef9fb23997af8b4d920012945ecc5179c29841a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Mon, 24 May 2021 17:03:50 +0200 Subject: [PATCH 18/18] Implement suggested changes after discussions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .../software-catalog/descriptor-format.md | 60 +++++++++++------- .../software-catalog/extending-the-model.md | 43 ++++++++++--- .../software-catalog/well-known-statuses.md | 46 +++++++------- package.json | 2 +- packages/catalog-client/api-report.md | 17 +---- packages/catalog-client/src/types/index.ts | 6 +- packages/catalog-client/src/types/status.ts | 47 +------------- packages/catalog-model/api-report.md | 24 ++++--- packages/catalog-model/package.json | 1 + packages/catalog-model/src/entity/Entity.ts | 3 +- .../catalog-model/src/entity/EntityStatus.ts | 63 +++++++++++++++++++ packages/catalog-model/src/entity/index.ts | 9 +-- packages/catalog-model/src/entity/status.ts | 32 ---------- .../src/schema/Entity.schema.json | 8 +-- .../src/schema/shared/common.schema.json | 49 ++++++++++++++- .../next/DefaultCatalogProcessingEngine.ts | 22 ++++++- .../catalog-backend/src/next/Stitcher.test.ts | 7 --- plugins/catalog-backend/src/next/Stitcher.ts | 27 ++++---- .../database/DefaultProcessingDatabase.ts | 14 +++++ .../src/next/database/types.ts | 15 ++++- 20 files changed, 301 insertions(+), 194 deletions(-) create mode 100644 packages/catalog-model/src/entity/EntityStatus.ts delete mode 100644 packages/catalog-model/src/entity/status.ts diff --git a/docs/features/software-catalog/descriptor-format.md b/docs/features/software-catalog/descriptor-format.md index aab2af3145..c8449dd351 100644 --- a/docs/features/software-catalog/descriptor-format.md +++ b/docs/features/software-catalog/descriptor-format.md @@ -399,16 +399,17 @@ well-known / common relations and their semantics. ## Common to All Kinds: Status -The `status` root field is a read-only set of statuses, pertaining to the +The `status` root object is a read-only set of statuses, pertaining to the current state or health of the entity, described in the -[well-known statuses section](well-known-statuses.md). Each status field -contains a specific blob of data that describes some aspect of the state of the -entity, as seen from the point of view of some specific system. Different -systems may contribute to this status object, under their own respective keys. +[well-known statuses section](well-known-statuses.md). + +Currently, the only defined field is the `items` array. Each of its items +contains a specific data structure that describes some aspect of the state of +the entity, as seen from the point of view of some specific system. Different +systems may contribute to this array, under their own respective `type` keys. The current main use case for this field is for the ingestion processes of the -catalog itself to convey information about failures and warnings back to the -user. +catalog itself to convey information about errors and warnings back to the user. A status field as part of a single entity that's read out of the API may look as follows. @@ -417,9 +418,18 @@ follows. { // ... "status": { - "backstage.io/catalog-processing": { - "errors": [] - } + "items": [ + { + "type": "backstage.io/catalog-processing", + "level": "error", + "message": "NotFoundError: File not found", + "error": { + "name": "NotFoundError", + "message": "File not found", + "stack": "..." + } + } + ] }, "spec": { // ... @@ -427,23 +437,27 @@ follows. } ``` -The keys of the `status` object are arbitrary strings. We recommend that any -statuses that are not strictly private within the organization be namespaced to -avoid collisions. Statuses emitted by Backstage core processes will for example -be prefixed with `backstage.io/` as in the example above. +The fields of a status item are: -The values of the `status` object are currently left unrestricted, except that -they must be objects. We reserve the right to extend this model in the future, -such that some fields of those value objects gain standardized meaning. We may -for example want to add a standard concept of "severity" or "level" to these. +| Field | Type | Description | +| --------- | ------ | ------------------------------------------------------------------------------------------------ | +| `type` | String | The type of status as a unique key per source. Each type may appear more than once in the array. | +| `level` | String | The level / severity of the status item: 'info', 'warning, or 'error'. | +| `message` | String | A brief message describing the status, intended for human consumption. | +| `error` | Object | An optional serialized error object related to the status. | -Entity descriptor YAML files are not supposed to contain this field. Instead, -catalog processors analyze the entity descriptor data and its surroundings, and -deduce status entries that are then attached onto the entity as read from the -catalog. +The `type` is an arbitrary string, but we recommend that types that are not +strictly private within the organization be namespaced to avoid collisions. +Types emitted by Backstage core processes will for example be prefixed with +`backstage.io/` as in the example above. + +Entity descriptor YAML files are not supposed to contain a `status` root key. +Instead, catalog processors analyze the entity descriptor data and its +surroundings, and deduce status entries that are then attached onto the entity +as read from the catalog. See the [well-known statuses section](well-known-statuses.md) for a list of -well-known / common relations and their semantics. +well-known / common status types. ## Kind: Component diff --git a/docs/features/software-catalog/extending-the-model.md b/docs/features/software-catalog/extending-the-model.md index 4cc1bc1110..aa5aed0540 100644 --- a/docs/features/software-catalog/extending-the-model.md +++ b/docs/features/software-catalog/extending-the-model.md @@ -353,18 +353,43 @@ relation could be considered for addition to the core. ## Adding a New Status field -Example intents: +Example intent: > "We would like to convey entity statuses through the catalog in a generic way, > as an integration layer. Our monitoring and alerting system has a plugin with > Backstage, and it would be useful if the entity's status field contained the -> current alert state close to the actual entity data for anyone to consume. +> current alert state close to the actual entity data for anyone to consume. We +> find the `status.items` semantics a poor fit, so we would prefer to make our +> own custom field under `status` for these purposes." -While we are considering a mechanism for contributing generic statuses to -entities, no such mechanism has yet been built. If you are interested in that -topic, [this issue](https://github.com/backstage/backstage/issues/2292) contains +We have not yet ventured to define any generic semantics for the `status` +object. We recommend sticking with the `status.items` mechanism where possible +(see below), since third party consumers will not be able to consume your status +information otherwise. Please reach out to the maintainers on Discord or by +making a GitHub issue describing your use case if you are interested in this +topic. + +## Adding a New Status Item Type + +Example intent: + +> "The semantics of the entity `status.items` field are fine for our needs, but +> we want to contribute our own type of status into that array instead of the +> catalog specific one." + +This is a simple, low risk way of adding your own status information to +entities. Consumers will be able to easily track and display the status together +with other types / sources. + +We recommend that any status type that are not strictly private within the +organization be namespaced to avoid collisions. Statuses emitted by Backstage +core processes will for example be prefixed with `backstage.io/`, your +organization may prefix with `my-org.net/`, and `pagerduty.com/active-alerts` +could be a sensible complete status item type for that particular external +system. + +The mechanics for how to emit custom statuses is not in place yet, so if this is +of interest to you, you might consider contacting the maintainers on Discord or +my making a GitHub issue describing your use case. +[This issue](https://github.com/backstage/backstage/issues/2292) also contains more context. - -But in general, errors emitted (and exceptions thrown) by any processor -including custom ones, end up in the [well known key](well-known-statuses.md) -for ingestion status. diff --git a/docs/features/software-catalog/well-known-statuses.md b/docs/features/software-catalog/well-known-statuses.md index 7ddf320d26..d293ae5062 100644 --- a/docs/features/software-catalog/well-known-statuses.md +++ b/docs/features/software-catalog/well-known-statuses.md @@ -6,35 +6,37 @@ sidebar_label: Well-known Statuses description: Lists a number of well known entity statuses, that have defined semantics. They can be attached to catalog entities and consumed by plugins as needed. --- -This section lists a number of well known -[entity status fields](descriptor-format.md#common-to-all-kinds-status), that -have defined semantics. They can be attached to catalog entities and consumed by +This section lists well known +[entity statuses](descriptor-format.md#common-to-all-kinds-status), that have +defined semantics. They can be attached to catalog entities and consumed by plugins as needed. -If you are looking to extend the set of statuses, see +If you are looking to extend the statuses, see [Extending the model](extending-the-model.md). ## Common Fields -The values of statuses are currently left unrestricted, except that they must be -objects. They therefore currently formally have no common fields. +The `status` object of an entity is currently left unrestricted, except for the +`items` field. Its structure is defined in the +[descriptor format](descriptor-format.md#common-to-all-kinds-status) section. -We reserve the right to extend this model in the future, such that some fields -of those value objects gain standardized meaning. We may for example want to add -a standard concept of "severity" or "level" to these. +We reserve the right to extend this model in the future. This status is in +active development and its format will change unexpectedly. Do not consume it in +your own code until such a time that this documentation has been updated. -## Statuses +## Status Item Types -This is a (non-exhaustive) list of statuses that are known to be in active use. +This is a (non-exhaustive) list of `status.items.[].type` values that are known +to be in active use. ### `backstage.io/catalog-processing` -Contains the current status of the catalog's ingestion of this entity. Errors -that may appear here include inability to read from the remote SCM provider, -syntax errors in the YAML file, and similar. +Expresses an aspect of the current status of the catalog's ingestion of this +entity. Errors that may appear here include inability to read from the remote +SCM provider, syntax errors in the YAML file, and similar. Note that the entity data itself may be of an older version, when errors are -present. The ingestion system keeps the old, valid entity data untouched when +present. The ingestion system keeps the old valid entity data untouched when possible, so the errors described in this state may not seem to align with the rest of the entity, because they pertain to a remote that could not be successfully ingested. This is normal. @@ -42,10 +44,12 @@ successfully ingested. This is normal. ```yaml # Example: status: - backstage.io/catalog-processing: - errors: [] + items: + - type: backstage.io/catalog-processing + level: error + message: 'NotFoundError: File not found' + error: + name: NotFoundError + message: File not found + stack: ... ``` - -This status is in active development and its format will change unexpectedly. Do -not consume it in your own code until such a time that this documentation has -been updated. diff --git a/package.json b/package.json index ed404565e4..ff24cafbd0 100644 --- a/package.json +++ b/package.json @@ -49,8 +49,8 @@ }, "version": "1.0.0", "dependencies": { - "@microsoft/api-extractor": "7.13.2-pr1916.0", "@microsoft/api-documenter": "^7.12.16", + "@microsoft/api-extractor": "7.13.2-pr1916.0", "@microsoft/api-extractor-model": "^7.12.5" }, "devDependencies": { diff --git a/packages/catalog-client/api-report.md b/packages/catalog-client/api-report.md index 003e585671..1f911c84e9 100644 --- a/packages/catalog-client/api-report.md +++ b/packages/catalog-client/api-report.md @@ -7,9 +7,6 @@ import { Entity } from '@backstage/catalog-model'; import { EntityName } from '@backstage/catalog-model'; import { Location as Location_2 } from '@backstage/catalog-model'; -import { SerializedError } from '@backstage/errors'; -import { UNSTABLE_EntityStatusLevel } from '@backstage/catalog-model'; -import { UNSTABLE_EntityStatusValue } from '@backstage/catalog-model'; // @public (undocumented) export type AddLocationRequest = { @@ -80,19 +77,7 @@ export type CatalogListResponse = { }; // @public -export const ENTITY_STATUS_CATALOG_PROCESSING_KEY = "backstage.io/catalog-processing"; - -// @public -export type UNSTABLE_CatalogProcessingStatus = UNSTABLE_EntityStatusValue & { - items?: UNSTABLE_CatalogProcessingStatusItem[]; -}; - -// @public (undocumented) -export type UNSTABLE_CatalogProcessingStatusItem = { - status: UNSTABLE_EntityStatusLevel; - message?: string; - error?: SerializedError; -}; +export const ENTITY_STATUS_CATALOG_PROCESSING_TYPE = "backstage.io/catalog-processing"; // (No @packageDocumentation comment for this package) diff --git a/packages/catalog-client/src/types/index.ts b/packages/catalog-client/src/types/index.ts index 16850a0fc0..c1670659ec 100644 --- a/packages/catalog-client/src/types/index.ts +++ b/packages/catalog-client/src/types/index.ts @@ -21,8 +21,4 @@ export type { CatalogEntitiesRequest, CatalogListResponse, } from './api'; -export { ENTITY_STATUS_CATALOG_PROCESSING_KEY } from './status'; -export type { - UNSTABLE_CatalogProcessingStatus, - UNSTABLE_CatalogProcessingStatusItem, -} from './status'; +export { ENTITY_STATUS_CATALOG_PROCESSING_TYPE } from './status'; diff --git a/packages/catalog-client/src/types/status.ts b/packages/catalog-client/src/types/status.ts index 6c39a83ea7..7990c4b121 100644 --- a/packages/catalog-client/src/types/status.ts +++ b/packages/catalog-client/src/types/status.ts @@ -14,50 +14,9 @@ * limitations under the License. */ -import { - UNSTABLE_EntityStatusLevel, - UNSTABLE_EntityStatusValue, -} from '@backstage/catalog-model'; -import { SerializedError } from '@backstage/errors'; - -/* - * This is the entity status field that's emitted by the catalog processing - * engine, to inform about the status of an entity. - * - * Example: - * - * "status": { - * "backstage.io/catalog-processing": { - * "status": "error", - * "items": [ - * { - * "status": "error", - * "error": { - * "name": "InputError", - * "message": "Syntax error: ..." - * } - * } - * ] - * } - * } - */ - /** - * The entity `status` key for the status of the processing engine in regards - * to entity. + * The entity `status.items[].type` for the status of the processing engine in + * regards to an entity. */ -export const ENTITY_STATUS_CATALOG_PROCESSING_KEY = +export const ENTITY_STATUS_CATALOG_PROCESSING_TYPE = 'backstage.io/catalog-processing'; - -/** - * The status value for the `backstage.io/catalog-processing` key. - */ -export type UNSTABLE_CatalogProcessingStatus = UNSTABLE_EntityStatusValue & { - items?: UNSTABLE_CatalogProcessingStatusItem[]; -}; - -export type UNSTABLE_CatalogProcessingStatusItem = { - status: UNSTABLE_EntityStatusLevel; - message?: string; - error?: SerializedError; -}; diff --git a/packages/catalog-model/api-report.md b/packages/catalog-model/api-report.md index c9118ce52c..7b5542fcd6 100644 --- a/packages/catalog-model/api-report.md +++ b/packages/catalog-model/api-report.md @@ -7,6 +7,7 @@ import { JsonObject } from '@backstage/config'; import { JSONSchema7 } from 'json-schema'; import { JsonValue } from '@backstage/config'; +import { SerializedError } from '@backstage/errors'; import * as yup from 'yup'; // @public (undocumented) @@ -112,7 +113,7 @@ export type Entity = { metadata: EntityMeta; spec?: JsonObject; relations?: EntityRelation[]; - status?: Record; + status?: UNSTABLE_EntityStatus; }; // @public @@ -528,15 +529,22 @@ export interface TemplateEntityV1beta2 extends Entity { // @public (undocumented) export const templateEntityV1beta2Validator: KindValidator; -// @public -export type UNSTABLE_EntityStatusLevel = 'ok' | 'info' | 'warning' | 'error'; - -// @public -export type UNSTABLE_EntityStatusValue = { - status: UNSTABLE_EntityStatusLevel; - message?: string; +// @alpha +export type UNSTABLE_EntityStatus = { + items?: UNSTABLE_EntityStatusItem[]; }; +// @alpha +export type UNSTABLE_EntityStatusItem = { + type: string; + level: UNSTABLE_EntityStatusLevel; + message: string; + error?: SerializedError; +}; + +// @alpha +export type UNSTABLE_EntityStatusLevel = 'info' | 'warning' | 'error'; + // @public (undocumented) interface UserEntityV1alpha1 extends Entity { // (undocumented) diff --git a/packages/catalog-model/package.json b/packages/catalog-model/package.json index 7a19be8708..97ce0e6568 100644 --- a/packages/catalog-model/package.json +++ b/packages/catalog-model/package.json @@ -30,6 +30,7 @@ }, "dependencies": { "@backstage/config": "^0.1.5", + "@backstage/errors": "^0.1.1", "@types/json-schema": "^7.0.5", "@types/yup": "^0.29.8", "ajv": "^7.0.3", diff --git a/packages/catalog-model/src/entity/Entity.ts b/packages/catalog-model/src/entity/Entity.ts index 1b5d38dee9..3b5a0621bb 100644 --- a/packages/catalog-model/src/entity/Entity.ts +++ b/packages/catalog-model/src/entity/Entity.ts @@ -16,6 +16,7 @@ import { JsonObject } from '@backstage/config'; import { EntityName } from '../types'; +import { UNSTABLE_EntityStatus } from './EntityStatus'; /** * The format envelope that's common to all versions/kinds of entity. @@ -55,7 +56,7 @@ export type Entity = { * The keys are implementation defined and the values can be any JSON object * with semantics that match that implementation. */ - status?: Record; + status?: UNSTABLE_EntityStatus; }; /** diff --git a/packages/catalog-model/src/entity/EntityStatus.ts b/packages/catalog-model/src/entity/EntityStatus.ts new file mode 100644 index 0000000000..67090f2bc2 --- /dev/null +++ b/packages/catalog-model/src/entity/EntityStatus.ts @@ -0,0 +1,63 @@ +/* + * Copyright 2021 Spotify AB + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { SerializedError } from '@backstage/errors'; + +/** + * The current status of the entity, as claimed by various sources. + * @alpha + */ +export type UNSTABLE_EntityStatus = { + /** + * Specific status item on a well known format. + */ + items?: UNSTABLE_EntityStatusItem[]; +}; + +/** + * A specific status item on a well known format. + * @alpha + */ +export type UNSTABLE_EntityStatusItem = { + /** + * The type of status as a unique key per source. + */ + type: string; + /** + * The level / severity of the status item. If the level is "error", the + * processing of the entity may be entirely blocked. In this case the status + * entry may apply to a different, newer version of the data than what is + * being returned in the catalog response. + */ + level: UNSTABLE_EntityStatusLevel; + /** + * A brief message describing the status, intended for human consumption. + */ + message: string; + /** + * An optional serialized error object related to the status. + */ + error?: SerializedError; +}; + +/** + * Each entity status item has a level, describing its severity. + * @alpha + */ +export type UNSTABLE_EntityStatusLevel = + | 'info' // Only informative data + | 'warning' // Warnings were found + | 'error'; // Errors were found diff --git a/packages/catalog-model/src/entity/index.ts b/packages/catalog-model/src/entity/index.ts index 330856125e..2ccd205d85 100644 --- a/packages/catalog-model/src/entity/index.ts +++ b/packages/catalog-model/src/entity/index.ts @@ -27,6 +27,11 @@ export type { EntityRelation, EntityRelationSpec, } from './Entity'; +export type { + UNSTABLE_EntityStatus, + UNSTABLE_EntityStatusItem, + UNSTABLE_EntityStatusLevel, +} from './EntityStatus'; export * from './policies'; export { compareEntityToRef, @@ -36,10 +41,6 @@ export { serializeEntityRef, stringifyEntityRef, } from './ref'; -export type { - UNSTABLE_EntityStatusLevel, - UNSTABLE_EntityStatusValue, -} from './status'; export { entityHasChanges, generateEntityEtag, diff --git a/packages/catalog-model/src/entity/status.ts b/packages/catalog-model/src/entity/status.ts deleted file mode 100644 index a819bea8f6..0000000000 --- a/packages/catalog-model/src/entity/status.ts +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright 2021 Spotify AB - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * Each entity status entry has a level, describing its severity. - */ -export type UNSTABLE_EntityStatusLevel = - | 'ok' // Everything is OK - | 'info' // Only informative data - | 'warning' // Warnings were found - | 'error'; // Errors were found - -/** - * Reserved root fields in all `status` object values. - */ -export type UNSTABLE_EntityStatusValue = { - status: UNSTABLE_EntityStatusLevel; - message?: string; -}; diff --git a/packages/catalog-model/src/schema/Entity.schema.json b/packages/catalog-model/src/schema/Entity.schema.json index e6b004dfd0..b8c43dda9e 100644 --- a/packages/catalog-model/src/schema/Entity.schema.json +++ b/packages/catalog-model/src/schema/Entity.schema.json @@ -64,13 +64,7 @@ } }, "status": { - "type": "object", - "description": "The current status of the entity, as claimed by various sources.", - "patternProperties": { - "^.+$": { - "$ref": "common#status" - } - } + "$ref": "common#status" } } } diff --git a/packages/catalog-model/src/schema/shared/common.schema.json b/packages/catalog-model/src/schema/shared/common.schema.json index cb4d82cdb9..efb8b6d1bb 100644 --- a/packages/catalog-model/src/schema/shared/common.schema.json +++ b/packages/catalog-model/src/schema/shared/common.schema.json @@ -46,8 +46,53 @@ "status": { "$id": "#status", "type": "object", - "description": "A specific status of an entity.", - "additionalProperties": true + "description": "The current status of the entity, as claimed by various sources.", + "required": [], + "additionalProperties": true, + "properties": { + "items": { + "$ref": "#statusItem" + } + } + }, + "statusItem": { + "$id": "#statusItem", + "type": "object", + "description": "A specific status item on a well known format.", + "required": ["type", "level", "message"], + "additionalProperties": true, + "properties": { + "type": { + "type": "string", + "minLength": 1 + }, + "level": { + "$ref": "#statusLevel", + "description": "The status level / severity of the status item." + }, + "message": { + "type": "string", + "description": "A brief message describing the status, intended for human consumption." + }, + "error": { + "$ref": "#error", + "description": "An optional serialized error object related to the status." + } + } + }, + "statusLevel": { + "$id": "#statusLevel", + "type": "string", + "description": "A status level / severity.", + "enum": ["info", "warning", "error"] + }, + "error": { + "$id": "#error", + "type": "object", + "description": "A serialized error object.", + "required": [], + "additionalProperties": true, + "properties": {} } } } diff --git a/plugins/catalog-backend/src/next/DefaultCatalogProcessingEngine.ts b/plugins/catalog-backend/src/next/DefaultCatalogProcessingEngine.ts index 657c331a25..b7b6dfa297 100644 --- a/plugins/catalog-backend/src/next/DefaultCatalogProcessingEngine.ts +++ b/plugins/catalog-backend/src/next/DefaultCatalogProcessingEngine.ts @@ -119,7 +119,27 @@ export class DefaultCatalogProcessingEngine implements CatalogProcessingEngine { for (const error of result.errors) { this.logger.warn(error.message); } + const errorsString = JSON.stringify( + result.errors.map(e => serializeError(e)), + ); + + // If the result was marked as not OK, it signals that some part of the + // processing pipeline threw an exception. This can happen both as part of + // non-catastrophic things such as due to validation errors, as well as if + // something fatal happens inside the processing for other reasons. In any + // case, this means we can't trust that anything in the output is okay. So + // just store the errors and trigger a stich so that they become visible to + // the outside. if (!result.ok) { + await this.processingDatabase.transaction(async tx => { + await this.processingDatabase.updateProcessedEntityErrors(tx, { + id, + errors: errorsString, + }); + }); + await this.stitcher.stitch( + new Set([stringifyEntityRef(unprocessedEntity)]), + ); return; } @@ -129,7 +149,7 @@ export class DefaultCatalogProcessingEngine implements CatalogProcessingEngine { id, processedEntity: result.completedEntity, state: result.state, - errors: JSON.stringify(result.errors.map(e => serializeError(e))), + errors: errorsString, relations: result.relations, deferredEntities: result.deferredEntities, }); diff --git a/plugins/catalog-backend/src/next/Stitcher.test.ts b/plugins/catalog-backend/src/next/Stitcher.test.ts index 75286743c3..f38af384fa 100644 --- a/plugins/catalog-backend/src/next/Stitcher.test.ts +++ b/plugins/catalog-backend/src/next/Stitcher.test.ts @@ -16,7 +16,6 @@ import { getVoidLogger } from '@backstage/backend-common'; import { Knex } from 'knex'; -import { ENTITY_STATUS_CATALOG_PROCESSING_KEY } from '@backstage/catalog-client'; import { DatabaseManager } from './database/DatabaseManager'; import { DbRefreshStateReferencesRow, @@ -92,9 +91,6 @@ describe('Stitcher', () => { }, }, ], - status: { - [ENTITY_STATUS_CATALOG_PROCESSING_KEY]: { status: 'ok' }, - }, apiVersion: 'a', kind: 'k', metadata: { @@ -175,9 +171,6 @@ describe('Stitcher', () => { }, }, ]), - status: { - [ENTITY_STATUS_CATALOG_PROCESSING_KEY]: { status: 'ok' }, - }, apiVersion: 'a', kind: 'k', metadata: { diff --git a/plugins/catalog-backend/src/next/Stitcher.ts b/plugins/catalog-backend/src/next/Stitcher.ts index 36ead7d817..0281591fb1 100644 --- a/plugins/catalog-backend/src/next/Stitcher.ts +++ b/plugins/catalog-backend/src/next/Stitcher.ts @@ -14,11 +14,12 @@ * limitations under the License. */ +import { ENTITY_STATUS_CATALOG_PROCESSING_TYPE } from '@backstage/catalog-client'; import { - ENTITY_STATUS_CATALOG_PROCESSING_KEY, - UNSTABLE_CatalogProcessingStatusItem, -} from '@backstage/catalog-client'; -import { Entity, parseEntityRef } from '@backstage/catalog-model'; + Entity, + parseEntityRef, + UNSTABLE_EntityStatusItem, +} from '@backstage/catalog-model'; import { ConflictError, SerializedError } from '@backstage/errors'; import { createHash } from 'crypto'; import stableStringify from 'fast-json-stable-stringify'; @@ -138,7 +139,7 @@ export class Stitcher { // it const entity = JSON.parse(processedEntity) as Entity; const isOrphan = Number(incomingReferenceCount) === 0; - let statusItems: UNSTABLE_CatalogProcessingStatusItem[] = []; + let statusItems: UNSTABLE_EntityStatusItem[] = []; if (isOrphan) { this.logger.debug(`${entityRef} is an orphan`); @@ -151,7 +152,9 @@ export class Stitcher { const parsedErrors = JSON.parse(errors) as SerializedError[]; if (Array.isArray(parsedErrors) && parsedErrors.length) { statusItems = parsedErrors.map(e => ({ - status: 'error', + type: ENTITY_STATUS_CATALOG_PROCESSING_TYPE, + level: 'error', + message: e.toString(), error: e, })); } @@ -165,12 +168,12 @@ export class Stitcher { type: row.relationType!, target: parseEntityRef(row.relationTarget!), })); - entity.status = { - ...entity.status, - [ENTITY_STATUS_CATALOG_PROCESSING_KEY]: statusItems.length - ? { status: 'error', items: statusItems } - : { status: 'ok' }, - }; + if (statusItems.length) { + entity.status = { + ...entity.status, + items: [...(entity.status?.items ?? []), ...statusItems], + }; + } // If the output entity was actually not changed, just abort const hash = generateStableHash(entity); diff --git a/plugins/catalog-backend/src/next/database/DefaultProcessingDatabase.ts b/plugins/catalog-backend/src/next/database/DefaultProcessingDatabase.ts index 8588ba5e52..cd3ddf037b 100644 --- a/plugins/catalog-backend/src/next/database/DefaultProcessingDatabase.ts +++ b/plugins/catalog-backend/src/next/database/DefaultProcessingDatabase.ts @@ -123,6 +123,20 @@ export class DefaultProcessingDatabase implements ProcessingDatabase { ); } + async updateProcessedEntityErrors( + txOpaque: Transaction, + options: UpdateProcessedEntityOptions, + ): Promise { + const tx = txOpaque as Knex.Transaction; + const { id, errors } = options; + + await tx('refresh_state') + .update({ + errors, + }) + .where('entity_id', id); + } + private deduplicateRelations(rows: DbRelationsRow[]): DbRelationsRow[] { return lodash.uniqBy( rows, diff --git a/plugins/catalog-backend/src/next/database/types.ts b/plugins/catalog-backend/src/next/database/types.ts index d7a1dcd20b..f65c796a00 100644 --- a/plugins/catalog-backend/src/next/database/types.ts +++ b/plugins/catalog-backend/src/next/database/types.ts @@ -34,6 +34,11 @@ export type UpdateProcessedEntityOptions = { deferredEntities: Entity[]; }; +export type UpdateProcessedEntityErrorsOptions = { + id: string; + errors?: string; +}; + export type RefreshStateItem = { id: string; entityRef: string; @@ -80,10 +85,18 @@ export interface ProcessingDatabase { ): Promise; /** - * Updates the + * Updates a processed entity */ updateProcessedEntity( txOpaque: Transaction, options: UpdateProcessedEntityOptions, ): Promise; + + /** + * Updates only the errors of a processed entity + */ + updateProcessedEntityErrors( + txOpaque: Transaction, + options: UpdateProcessedEntityErrorsOptions, + ): Promise; }