Merge branch 'master' of github.com:backstage/backstage into support-bad-request

This commit is contained in:
Adam Harvey
2021-01-14 10:47:23 -05:00
141 changed files with 1460 additions and 472 deletions
-5
View File
@@ -1,5 +0,0 @@
---
'@backstage/plugin-lighthouse': patch
---
Strip trailing slash from url when creating a new audit. This change prevents duplicate audits from being displayed in the audit list.
-5
View File
@@ -1,5 +0,0 @@
---
'@backstage/plugin-catalog-import': patch
---
Improve how URLs are analyzed for add/import
-9
View File
@@ -1,9 +0,0 @@
---
'@backstage/techdocs-common': patch
'@backstage/plugin-techdocs-backend': patch
---
Improve techdocs-common Generator API for it to be used by techdocs-cli. TechDocs generator.run function now takes
an input AND an output directory. Most probably you use techdocs-common via plugin-techdocs-backend, and so there
is no breaking change for you.
But if you use techdocs-common separately, you need to create an output directory and pass into the generator.
-6
View File
@@ -1,6 +0,0 @@
---
'@backstage/plugin-kubernetes': patch
'@backstage/plugin-kubernetes-backend': patch
---
Revamped Kubernetes UI and added error reporting/detection
-5
View File
@@ -1,5 +0,0 @@
---
'@backstage/integration': minor
---
Build out the `ScmIntegrations` class, as well as the individual `*Integration` classes
-5
View File
@@ -1,5 +0,0 @@
---
'@backstage/catalog-model': patch
---
Export the `schemaValidator` helper function.
-5
View File
@@ -1,5 +0,0 @@
---
'@backstage/plugin-jenkins': patch
---
Handle missing ObjectMetadataAction in Jenkins API
@@ -1,5 +0,0 @@
---
'@backstage/plugin-catalog-import': patch
---
Add more generic descriptions for the catalog-import form.
-5
View File
@@ -1,5 +0,0 @@
---
'@backstage/plugin-org': patch
---
Fixed - normalizing strings for comparison when ignoring when one is in low case.
-11
View File
@@ -1,11 +0,0 @@
---
'@backstage/cli': patch
'@backstage/create-app': patch
'@backstage/plugin-catalog-backend': patch
'@backstage/plugin-catalog-import': patch
'@backstage/plugin-cloudbuild': patch
'@backstage/plugin-github-actions': patch
'@backstage/plugin-scaffolder-backend': patch
---
Get rid of all usages of @octokit/types, and bump the rest of the octokit dependencies to the latest version
-5
View File
@@ -1,5 +0,0 @@
---
'@backstage/techdocs-common': patch
---
Fix bug where binary files (`png`, etc.) could not load when using AWS or GCS publisher.
-12
View File
@@ -1,12 +0,0 @@
---
'@backstage/techdocs-common': patch
'@backstage/plugin-techdocs': patch
---
Google Cloud authentication in TechDocs has been improved.
1. `techdocs.publisher.googleGcs.credentials` is now optional. If it is missing, `GOOGLE_APPLICATION_CREDENTIALS`
environment variable (and some other methods) will be used to authenticate.
Read more here https://cloud.google.com/docs/authentication/production
2. `techdocs.publisher.googleGcs.projectId` is no longer used. You can remove it from your `app-config.yaml`.
-5
View File
@@ -1,5 +0,0 @@
---
'@backstage/plugin-graphiql': patch
---
Updated README
-12
View File
@@ -1,12 +0,0 @@
---
'example-backend': patch
'@backstage/create-app': patch
'@backstage/plugin-scaffolder-backend': patch
---
Bump the gitbeaker dependencies to 28.x.
To update your own installation, go through the `package.json` files of all of
your packages, and ensure that all dependencies on `@gitbeaker/node` or
`@gitbeaker/core` are at version `^28.0.2`. Then run `yarn install` at the root
of your repo.
-5
View File
@@ -1,5 +0,0 @@
---
'@backstage/cli': patch
---
Handle no npm info
-5
View File
@@ -1,5 +0,0 @@
---
'@backstage/plugin-catalog-import': patch
---
Remove dependency to `@backstage/plugin-catalog-backend`.
-9
View File
@@ -1,9 +0,0 @@
---
'@backstage/plugin-catalog': patch
---
Enable catalog table actions for all location types.
The edit button has had support for other providers for a while and there is
no specific reason the View in GitHub cannot work for all locations. This
change also replaces the GitHub icon with the OpenInNew icon.
-5
View File
@@ -1,5 +0,0 @@
---
'@backstage/core': patch
---
Fix issue where `SidebarItem` with `onClick` and without `to` renders an inaccessible div. It now renders a button.
-5
View File
@@ -1,5 +0,0 @@
---
'@backstage/techdocs-common': patch
---
AWS SDK version bump for TechDocs.
-5
View File
@@ -1,5 +0,0 @@
---
'@backstage/plugin-catalog-backend': patch
---
AWS SDK version bump for Catalog Backend.
-5
View File
@@ -1,5 +0,0 @@
---
'@backstage/plugin-auth-backend': patch
---
Allow blank certificates and support logout URLs in the SAML provider.
-5
View File
@@ -1,5 +0,0 @@
---
'@backstage/cli': patch
---
Added experimental `create-github-app` command.
-10
View File
@@ -1,10 +0,0 @@
---
'@backstage/techdocs-common': patch
'@backstage/plugin-techdocs': patch
---
AWS S3 authentication in TechDocs has been improved.
1. `techdocs.publisher.awsS3.bucketName` is now the only required config. `techdocs.publisher.awsS3.credentials` and `techdocs.publisher.awsS3.region` are optional.
2. If `techdocs.publisher.awsS3.credentials` and `techdocs.publisher.awsS3.region` are missing, the AWS environment variables `AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY` and `AWS_REGION` will be used. There are more better ways of setting up AWS authentication. Read the guide at https://backstage.io/docs/features/techdocs/using-cloud-storage
@@ -1,5 +0,0 @@
---
'@backstage/plugin-techdocs': patch
---
Use `history.pushState` for hash link navigation.
-6
View File
@@ -1,6 +0,0 @@
---
'@backstage/catalog-model': patch
'@backstage/plugin-catalog-backend': patch
---
Add subcomponentOf to Component kind to represent subsystems of larger components.
-5
View File
@@ -1,5 +0,0 @@
---
'@backstage/plugin-scaffolder-backend': patch
---
Export all preparers and publishers properly
@@ -27,6 +27,9 @@ jobs:
with:
node-version: ${{ matrix.node-version }}
- name: verify doc links
run: node scripts/verify-links.js
# Skip caching of microsite dependencies, it keeps the global cache size
# smaller, which make Windows builds a lot faster for the rest of the project.
- name: yarn install
+19 -1
View File
@@ -127,7 +127,16 @@ integrations:
catalog:
rules:
- allow: [Component, API, Group, User, Template, Location]
- allow:
- Component
- API
- Resource
- Group
- User
- Template
- System
- Domain
- Location
processors:
githubOrg:
@@ -184,6 +193,15 @@ catalog:
# Backstage example APIs
- type: url
target: https://github.com/backstage/backstage/blob/master/packages/catalog-model/examples/all-apis.yaml
# Backstage example resources
- type: url
target: https://github.com/backstage/backstage/blob/master/packages/catalog-model/examples/all-resources.yaml
# Backstage example systems
- type: url
target: https://github.com/backstage/backstage/blob/master/packages/catalog-model/examples/all-systems.yaml
# Backstage example domains
- type: url
target: https://github.com/backstage/backstage/blob/master/packages/catalog-model/examples/all-domains.yaml
# Backstage example templates
- type: url
target: https://github.com/backstage/backstage/blob/master/plugins/scaffolder-backend/sample-templates/all-templates.yaml
@@ -14,8 +14,8 @@ import {
HeaderLabel,
SupportButton,
identityApiRef,
useApi,
} from '@backstage/core';
import { useApi } from '@backstage/core-api';
import ExampleFetchComponent from '../ExampleFetchComponent';
const ExampleComponent = () => {
@@ -11,8 +11,8 @@ import {
TableColumn,
Progress,
githubAuthApiRef,
useApi,
} from '@backstage/core';
import { useApi } from '@backstage/core-api';
import { graphql } from '@octokit/graphql';
const query = `{
+2 -3
View File
@@ -72,8 +72,7 @@ Our first modification will be to extract information from the Identity API.
```tsx
// Add identityApiRef to the list of imported from core
import { identityApiRef } from '@backstage/core';
import { useApi } from '@backstage/core-api';
import { identityApiRef, useApi } from '@backstage/core';
```
3. Adjust the ExampleComponent from inline to block
@@ -143,8 +142,8 @@ import {
TableColumn,
Progress,
githubAuthApiRef,
useApi,
} from '@backstage/core';
import { useApi } from '@backstage/core-api';
import { graphql } from '@octokit/graphql';
const ExampleFetchComponent = () => {
+7
View File
@@ -1,5 +1,12 @@
# @backstage/backend-common
## 0.4.3
### Patch Changes
- Updated dependencies [466354aaa]
- @backstage/integration@0.2.0
## 0.4.2
### Patch Changes
+3 -3
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/backend-common",
"description": "Common functionality library for Backstage backends",
"version": "0.4.2",
"version": "0.4.3",
"main": "src/index.ts",
"types": "src/index.ts",
"private": false,
@@ -32,7 +32,7 @@
"@backstage/cli-common": "^0.1.1",
"@backstage/config": "^0.1.2",
"@backstage/config-loader": "^0.4.1",
"@backstage/integration": "^0.1.5",
"@backstage/integration": "^0.2.0",
"@types/cors": "^2.8.6",
"@types/express": "^4.17.6",
"archiver": "^5.0.2",
@@ -66,7 +66,7 @@
}
},
"devDependencies": {
"@backstage/cli": "^0.4.5",
"@backstage/cli": "^0.4.6",
"@backstage/test-utils": "^0.1.5",
"@types/archiver": "^5.1.0",
"@types/compression": "^1.7.0",
+30
View File
@@ -1,5 +1,35 @@
# example-backend
## 0.2.11
### Patch Changes
- cc068c0d6: Bump the gitbeaker dependencies to 28.x.
To update your own installation, go through the `package.json` files of all of
your packages, and ensure that all dependencies on `@gitbeaker/node` or
`@gitbeaker/core` are at version `^28.0.2`. Then run `yarn install` at the root
of your repo.
- Updated dependencies [68ad5af51]
- Updated dependencies [5a9a7e7c2]
- Updated dependencies [f3b064e1c]
- Updated dependencies [94fdf4955]
- Updated dependencies [cc068c0d6]
- Updated dependencies [ade6b3bdf]
- Updated dependencies [468579734]
- Updated dependencies [cb7af51e7]
- Updated dependencies [abbee6fff]
- Updated dependencies [147fadcb9]
- Updated dependencies [711ba55a2]
- @backstage/plugin-techdocs-backend@0.5.3
- @backstage/plugin-kubernetes-backend@0.2.4
- @backstage/catalog-model@0.6.1
- @backstage/plugin-catalog-backend@0.5.3
- @backstage/plugin-scaffolder-backend@0.4.1
- @backstage/plugin-auth-backend@0.2.10
- @backstage/backend-common@0.4.3
## 0.2.10
### Patch Changes
+9 -9
View File
@@ -1,6 +1,6 @@
{
"name": "example-backend",
"version": "0.2.10",
"version": "0.2.11",
"main": "dist/index.cjs.js",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -27,18 +27,18 @@
"migrate:create": "knex migrate:make -x ts"
},
"dependencies": {
"@backstage/backend-common": "^0.4.1",
"@backstage/catalog-model": "^0.6.0",
"@backstage/backend-common": "^0.4.3",
"@backstage/catalog-model": "^0.6.1",
"@backstage/config": "^0.1.2",
"@backstage/plugin-app-backend": "^0.3.3",
"@backstage/plugin-auth-backend": "^0.2.7",
"@backstage/plugin-catalog-backend": "^0.5.1",
"@backstage/plugin-auth-backend": "^0.2.10",
"@backstage/plugin-catalog-backend": "^0.5.3",
"@backstage/plugin-graphql-backend": "^0.1.4",
"@backstage/plugin-kubernetes-backend": "^0.2.3",
"@backstage/plugin-kubernetes-backend": "^0.2.4",
"@backstage/plugin-proxy-backend": "^0.2.3",
"@backstage/plugin-rollbar-backend": "^0.1.5",
"@backstage/plugin-scaffolder-backend": "^0.4.0",
"@backstage/plugin-techdocs-backend": "^0.5.0",
"@backstage/plugin-scaffolder-backend": "^0.4.1",
"@backstage/plugin-techdocs-backend": "^0.5.3",
"@gitbeaker/node": "^28.0.2",
"@octokit/rest": "^18.0.12",
"azure-devops-node-api": "^10.1.1",
@@ -53,7 +53,7 @@
"winston": "^3.2.1"
},
"devDependencies": {
"@backstage/cli": "^0.4.3",
"@backstage/cli": "^0.4.6",
"@types/dockerode": "^3.2.1",
"@types/express": "^4.17.6",
"@types/express-serve-static-core": "^4.17.5",
+8
View File
@@ -1,5 +1,13 @@
# @backstage/catalog-model
## 0.6.1
### Patch Changes
- f3b064e1c: Export the `schemaValidator` helper function.
- abbee6fff: Implement System, Domain and Resource entity kinds.
- 147fadcb9: Add subcomponentOf to Component kind to represent subsystems of larger components.
## 0.6.0
### Minor Changes
@@ -0,0 +1,9 @@
apiVersion: backstage.io/v1alpha1
kind: Location
metadata:
name: example-domains
description: A collection of all Backstage example domains
spec:
targets:
- ./domains/artists-domain.yaml
- ./domains/playback-domain.yaml
@@ -0,0 +1,8 @@
apiVersion: backstage.io/v1alpha1
kind: Location
metadata:
name: example-resources
description: A collection of all Backstage example resources
spec:
targets:
- ./resources/artists-db-resource.yaml
@@ -0,0 +1,10 @@
apiVersion: backstage.io/v1alpha1
kind: Location
metadata:
name: example-systems
description: A collection of all Backstage example systems
spec:
targets:
- ./systems/artist-engagement-portal-system.yaml
- ./systems/audio-playback-system.yaml
- ./systems/podcast-system.yaml
@@ -10,3 +10,4 @@ spec:
type: service
lifecycle: experimental
owner: team-a
system: artist-engagement-portal
@@ -7,3 +7,4 @@ spec:
type: library
lifecycle: experimental
owner: team-c
system: audio-playback
@@ -10,3 +10,4 @@ spec:
type: service
lifecycle: production
owner: user:guest
system: audio-playback
@@ -9,3 +9,4 @@ spec:
type: service
lifecycle: experimental
owner: team-b
system: podcast
@@ -10,3 +10,4 @@ spec:
type: website
lifecycle: production
owner: team-b
system: podcast
@@ -9,3 +9,4 @@ spec:
type: service
lifecycle: production
owner: user:guest
system: audio-playback
@@ -7,3 +7,4 @@ spec:
type: website
lifecycle: production
owner: team-a
system: artist-engagement-portal
@@ -0,0 +1,7 @@
apiVersion: backstage.io/v1alpha1
kind: Domain
metadata:
name: artists
description: Everything related to artists
spec:
owner: team-a
@@ -0,0 +1,7 @@
apiVersion: backstage.io/v1alpha1
kind: Domain
metadata:
name: playback
description: Everything related to audio playback
spec:
owner: user:frank.tiernan
@@ -0,0 +1,9 @@
apiVersion: backstage.io/v1alpha1
kind: Resource
metadata:
name: artists-db
description: Stores artist details
spec:
type: database
owner: team-a
system: artist-engagement-portal
@@ -0,0 +1,10 @@
apiVersion: backstage.io/v1alpha1
kind: System
metadata:
name: artist-engagement-portal
description: Everything related to artists
tags:
- portal
spec:
owner: team-a
domain: artists
@@ -0,0 +1,8 @@
apiVersion: backstage.io/v1alpha1
kind: System
metadata:
name: audio-playback
description: Audio playback system
spec:
owner: team-c
domain: playback
@@ -0,0 +1,8 @@
apiVersion: backstage.io/v1alpha1
kind: System
metadata:
name: podcast
description: Podcast playback
spec:
owner: team-b
domain: playback
+2 -2
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/catalog-model",
"version": "0.6.0",
"version": "0.6.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -38,7 +38,7 @@
"yup": "^0.29.3"
},
"devDependencies": {
"@backstage/cli": "^0.4.2",
"@backstage/cli": "^0.4.6",
"@types/express": "^4.17.6",
"@types/jest": "^26.0.7",
"@types/lodash": "^4.14.151",
@@ -70,6 +70,7 @@ components:
items:
$ref: "#/components/schemas/Pet"
`,
system: 'system',
},
};
});
@@ -152,4 +153,19 @@ components:
(entity as any).spec.definition = '';
await expect(validator.check(entity)).rejects.toThrow(/definition/);
});
it('accepts missing system', async () => {
delete (entity as any).spec.system;
await expect(validator.check(entity)).resolves.toBe(true);
});
it('rejects wrong system', async () => {
(entity as any).spec.system = 7;
await expect(validator.check(entity)).rejects.toThrow(/system/);
});
it('rejects empty system', async () => {
(entity as any).spec.system = '';
await expect(validator.check(entity)).rejects.toThrow(/system/);
});
});
@@ -30,6 +30,7 @@ const schema = yup.object<Partial<ApiEntityV1alpha1>>({
lifecycle: yup.string().required().min(1),
owner: yup.string().required().min(1),
definition: yup.string().required().min(1),
system: yup.string().notRequired().min(1),
})
.required(),
});
@@ -42,6 +43,7 @@ export interface ApiEntityV1alpha1 extends Entity {
lifecycle: string;
owner: string;
definition: string;
system?: string;
};
}
@@ -36,6 +36,7 @@ describe('ComponentV1alpha1Validator', () => {
subcomponentOf: 'monolith',
providesApis: ['api-0'],
consumesApis: ['api-0'],
system: 'system',
},
};
});
@@ -158,4 +159,19 @@ describe('ComponentV1alpha1Validator', () => {
(entity as any).spec.consumesApis = [];
await expect(validator.check(entity)).resolves.toBe(true);
});
it('accepts missing system', async () => {
delete (entity as any).spec.system;
await expect(validator.check(entity)).resolves.toBe(true);
});
it('rejects wrong system', async () => {
(entity as any).spec.system = 7;
await expect(validator.check(entity)).rejects.toThrow(/system/);
});
it('rejects empty system', async () => {
(entity as any).spec.system = '';
await expect(validator.check(entity)).rejects.toThrow(/system/);
});
});
@@ -32,6 +32,7 @@ const schema = yup.object<Partial<ComponentEntityV1alpha1>>({
subcomponentOf: yup.string().notRequired().min(1),
providesApis: yup.array(yup.string().required()).notRequired(),
consumesApis: yup.array(yup.string().required()).notRequired(),
system: yup.string().notRequired().min(1),
})
.required(),
});
@@ -46,6 +47,7 @@ export interface ComponentEntityV1alpha1 extends Entity {
subcomponentOf?: string;
providesApis?: string[];
consumesApis?: string[];
system?: string;
};
}
@@ -0,0 +1,71 @@
/*
* Copyright 2020 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 {
DomainEntityV1alpha1,
domainEntityV1alpha1Validator as validator,
} from './DomainEntityV1alpha1';
describe('DomainV1alpha1Validator', () => {
let entity: DomainEntityV1alpha1;
beforeEach(() => {
entity = {
apiVersion: 'backstage.io/v1alpha1',
kind: 'Domain',
metadata: {
name: 'test',
},
spec: {
owner: 'me',
},
};
});
it('happy path: accepts valid data', async () => {
await expect(validator.check(entity)).resolves.toBe(true);
});
it('silently accepts v1beta1 as well', async () => {
(entity as any).apiVersion = 'backstage.io/v1beta1';
await expect(validator.check(entity)).resolves.toBe(true);
});
it('ignores unknown apiVersion', async () => {
(entity as any).apiVersion = 'backstage.io/v1beta0';
await expect(validator.check(entity)).resolves.toBe(false);
});
it('ignores unknown kind', async () => {
(entity as any).kind = 'Wizard';
await expect(validator.check(entity)).resolves.toBe(false);
});
it('rejects missing owner', async () => {
delete (entity as any).spec.owner;
await expect(validator.check(entity)).rejects.toThrow(/owner/);
});
it('rejects wrong owner', async () => {
(entity as any).spec.owner = 7;
await expect(validator.check(entity)).rejects.toThrow(/owner/);
});
it('rejects empty owner', async () => {
(entity as any).spec.owner = '';
await expect(validator.check(entity)).rejects.toThrow(/owner/);
});
});
@@ -0,0 +1,46 @@
/*
* Copyright 2020 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 * as yup from 'yup';
import type { Entity } from '../entity/Entity';
import { schemaValidator } from './util';
const API_VERSION = ['backstage.io/v1alpha1', 'backstage.io/v1beta1'] as const;
const KIND = 'Domain' as const;
const schema = yup.object<Partial<DomainEntityV1alpha1>>({
apiVersion: yup.string().required().oneOf(API_VERSION),
kind: yup.string().required().equals([KIND]),
spec: yup
.object({
owner: yup.string().required().min(1),
})
.required(),
});
export interface DomainEntityV1alpha1 extends Entity {
apiVersion: typeof API_VERSION[number];
kind: typeof KIND;
spec: {
owner: string;
};
}
export const domainEntityV1alpha1Validator = schemaValidator(
KIND,
API_VERSION,
schema,
);
@@ -0,0 +1,103 @@
/*
* Copyright 2020 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 {
ResourceEntityV1alpha1,
resourceEntityV1alpha1Validator as validator,
} from './ResourceEntityV1alpha1';
describe('ResourceV1alpha1Validator', () => {
let entity: ResourceEntityV1alpha1;
beforeEach(() => {
entity = {
apiVersion: 'backstage.io/v1alpha1',
kind: 'Resource',
metadata: {
name: 'test',
},
spec: {
type: 'database',
owner: 'me',
system: 'system',
},
};
});
it('happy path: accepts valid data', async () => {
await expect(validator.check(entity)).resolves.toBe(true);
});
it('silently accepts v1beta1 as well', async () => {
(entity as any).apiVersion = 'backstage.io/v1beta1';
await expect(validator.check(entity)).resolves.toBe(true);
});
it('ignores unknown apiVersion', async () => {
(entity as any).apiVersion = 'backstage.io/v1beta0';
await expect(validator.check(entity)).resolves.toBe(false);
});
it('ignores unknown kind', async () => {
(entity as any).kind = 'Wizard';
await expect(validator.check(entity)).resolves.toBe(false);
});
it('rejects missing type', async () => {
delete (entity as any).spec.type;
await expect(validator.check(entity)).rejects.toThrow(/type/);
});
it('rejects wrong type', async () => {
(entity as any).spec.type = 7;
await expect(validator.check(entity)).rejects.toThrow(/type/);
});
it('rejects empty type', async () => {
(entity as any).spec.type = '';
await expect(validator.check(entity)).rejects.toThrow(/type/);
});
it('rejects missing owner', async () => {
delete (entity as any).spec.owner;
await expect(validator.check(entity)).rejects.toThrow(/owner/);
});
it('rejects wrong owner', async () => {
(entity as any).spec.owner = 7;
await expect(validator.check(entity)).rejects.toThrow(/owner/);
});
it('rejects empty owner', async () => {
(entity as any).spec.owner = '';
await expect(validator.check(entity)).rejects.toThrow(/owner/);
});
it('accepts missing system', async () => {
delete (entity as any).spec.system;
await expect(validator.check(entity)).resolves.toBe(true);
});
it('rejects wrong system', async () => {
(entity as any).spec.system = 7;
await expect(validator.check(entity)).rejects.toThrow(/system/);
});
it('rejects empty system', async () => {
(entity as any).spec.system = '';
await expect(validator.check(entity)).rejects.toThrow(/system/);
});
});
@@ -0,0 +1,50 @@
/*
* Copyright 2020 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 * as yup from 'yup';
import type { Entity } from '../entity/Entity';
import { schemaValidator } from './util';
const API_VERSION = ['backstage.io/v1alpha1', 'backstage.io/v1beta1'] as const;
const KIND = 'Resource' as const;
const schema = yup.object<Partial<ResourceEntityV1alpha1>>({
apiVersion: yup.string().required().oneOf(API_VERSION),
kind: yup.string().required().equals([KIND]),
spec: yup
.object({
type: yup.string().required().min(1),
owner: yup.string().required().min(1),
system: yup.string().notRequired().min(1),
})
.required(),
});
export interface ResourceEntityV1alpha1 extends Entity {
apiVersion: typeof API_VERSION[number];
kind: typeof KIND;
spec: {
type: string;
owner: string;
system?: string;
};
}
export const resourceEntityV1alpha1Validator = schemaValidator(
KIND,
API_VERSION,
schema,
);
@@ -0,0 +1,87 @@
/*
* Copyright 2020 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 {
SystemEntityV1alpha1,
systemEntityV1alpha1Validator as validator,
} from './SystemEntityV1alpha1';
describe('SystemV1alpha1Validator', () => {
let entity: SystemEntityV1alpha1;
beforeEach(() => {
entity = {
apiVersion: 'backstage.io/v1alpha1',
kind: 'System',
metadata: {
name: 'test',
},
spec: {
owner: 'me',
domain: 'domain',
},
};
});
it('happy path: accepts valid data', async () => {
await expect(validator.check(entity)).resolves.toBe(true);
});
it('silently accepts v1beta1 as well', async () => {
(entity as any).apiVersion = 'backstage.io/v1beta1';
await expect(validator.check(entity)).resolves.toBe(true);
});
it('ignores unknown apiVersion', async () => {
(entity as any).apiVersion = 'backstage.io/v1beta0';
await expect(validator.check(entity)).resolves.toBe(false);
});
it('ignores unknown kind', async () => {
(entity as any).kind = 'Wizard';
await expect(validator.check(entity)).resolves.toBe(false);
});
it('rejects missing owner', async () => {
delete (entity as any).spec.owner;
await expect(validator.check(entity)).rejects.toThrow(/owner/);
});
it('rejects wrong owner', async () => {
(entity as any).spec.owner = 7;
await expect(validator.check(entity)).rejects.toThrow(/owner/);
});
it('rejects empty owner', async () => {
(entity as any).spec.owner = '';
await expect(validator.check(entity)).rejects.toThrow(/owner/);
});
it('accepts missing domain', async () => {
delete (entity as any).spec.domain;
await expect(validator.check(entity)).resolves.toBe(true);
});
it('rejects wrong domain', async () => {
(entity as any).spec.domain = 7;
await expect(validator.check(entity)).rejects.toThrow(/domain/);
});
it('rejects empty domain', async () => {
(entity as any).spec.domain = '';
await expect(validator.check(entity)).rejects.toThrow(/domain/);
});
});
@@ -0,0 +1,48 @@
/*
* Copyright 2020 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 * as yup from 'yup';
import type { Entity } from '../entity/Entity';
import { schemaValidator } from './util';
const API_VERSION = ['backstage.io/v1alpha1', 'backstage.io/v1beta1'] as const;
const KIND = 'System' as const;
const schema = yup.object<Partial<SystemEntityV1alpha1>>({
apiVersion: yup.string().required().oneOf(API_VERSION),
kind: yup.string().required().equals([KIND]),
spec: yup
.object({
owner: yup.string().required().min(1),
domain: yup.string().notRequired().min(1),
})
.required(),
});
export interface SystemEntityV1alpha1 extends Entity {
apiVersion: typeof API_VERSION[number];
kind: typeof KIND;
spec: {
owner: string;
domain?: string;
};
}
export const systemEntityV1alpha1Validator = schemaValidator(
KIND,
API_VERSION,
schema,
);
+15
View File
@@ -26,6 +26,11 @@ export type {
ComponentEntityV1alpha1 as ComponentEntity,
ComponentEntityV1alpha1,
} from './ComponentEntityV1alpha1';
export { domainEntityV1alpha1Validator } from './DomainEntityV1alpha1';
export type {
DomainEntityV1alpha1 as DomainEntity,
DomainEntityV1alpha1,
} from './DomainEntityV1alpha1';
export { groupEntityV1alpha1Validator } from './GroupEntityV1alpha1';
export type {
GroupEntityV1alpha1 as GroupEntity,
@@ -37,6 +42,16 @@ export type {
LocationEntityV1alpha1,
} from './LocationEntityV1alpha1';
export * from './relations';
export { resourceEntityV1alpha1Validator } from './ResourceEntityV1alpha1';
export type {
ResourceEntityV1alpha1 as ResourceEntity,
ResourceEntityV1alpha1,
} from './ResourceEntityV1alpha1';
export { systemEntityV1alpha1Validator } from './SystemEntityV1alpha1';
export type {
SystemEntityV1alpha1 as SystemEntity,
SystemEntityV1alpha1,
} from './SystemEntityV1alpha1';
export { templateEntityV1alpha1Validator } from './TemplateEntityV1alpha1';
export type {
TemplateEntityV1alpha1 as TemplateEntity,
@@ -30,7 +30,7 @@ export const RELATION_OWNED_BY = 'ownedBy';
export const RELATION_OWNER_OF = 'ownerOf';
/**
* A relation with an API entity, typically from a component or system
* A relation with an API entity, typically from a component
*/
export const RELATION_CONSUMES_API = 'consumesApi';
export const RELATION_API_CONSUMED_BY = 'apiConsumedBy';
+8
View File
@@ -1,5 +1,13 @@
# @backstage/cli
## 0.4.6
### Patch Changes
- 94fdf4955: Get rid of all usages of @octokit/types, and bump the rest of the octokit dependencies to the latest version
- 08e9893d2: Handle no npm info
- 9cf71f8bf: Added experimental `create-github-app` command.
## 0.4.5
### Patch Changes
+3 -3
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/cli",
"description": "CLI for developing Backstage plugins and apps",
"version": "0.4.5",
"version": "0.4.6",
"private": false,
"publishConfig": {
"access": "public"
@@ -113,9 +113,9 @@
"yn": "^4.0.0"
},
"devDependencies": {
"@backstage/backend-common": "^0.4.2",
"@backstage/backend-common": "^0.4.3",
"@backstage/config": "^0.1.2",
"@backstage/core": "^0.4.3",
"@backstage/core": "^0.4.4",
"@backstage/dev-utils": "^0.1.7",
"@backstage/test-utils": "^0.1.6",
"@backstage/theme": "^0.2.2",
@@ -47,7 +47,6 @@ const FORM_PAGE = `
type GithubAppConfig = {
appId: number;
apiUrl: string;
slug?: string;
name?: string;
webhookUrl?: string;
@@ -88,14 +87,11 @@ export class GithubCreateAppServer {
`POST /app-manifests/${encodeURIComponent(
req.query.code as string,
)}/conversions`,
).then(({ data, url }) => {
// url = https://api.github.com/app-manifests/<code>/conversions
const apiUrl = url.replace(/(?:\/[^\/]+){3}$/, '');
).then(({ data }) => {
resolve({
name: data.name,
slug: data.slug,
appId: data.id,
apiUrl,
webhookUrl: this.webhookUrl,
clientId: data.client_id,
clientSecret: data.client_secret,
+6
View File
@@ -1,5 +1,11 @@
# @backstage/core
## 0.4.4
### Patch Changes
- 265a7ab30: Fix issue where `SidebarItem` with `onClick` and without `to` renders an inaccessible div. It now renders a button.
## 0.4.3
### Patch Changes
+2 -2
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/core",
"description": "Core API used by Backstage plugins and apps",
"version": "0.4.3",
"version": "0.4.4",
"private": false,
"publishConfig": {
"access": "public",
@@ -65,7 +65,7 @@
"zen-observable": "^0.8.15"
},
"devDependencies": {
"@backstage/cli": "^0.4.4",
"@backstage/cli": "^0.4.6",
"@backstage/test-utils": "^0.1.6",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^10.4.1",
+12
View File
@@ -1,5 +1,17 @@
# @backstage/create-app
## 0.3.5
### Patch Changes
- 94fdf4955: Get rid of all usages of @octokit/types, and bump the rest of the octokit dependencies to the latest version
- cc068c0d6: Bump the gitbeaker dependencies to 28.x.
To update your own installation, go through the `package.json` files of all of
your packages, and ensure that all dependencies on `@gitbeaker/node` or
`@gitbeaker/core` are at version `^28.0.2`. Then run `yarn install` at the root
of your repo.
## 0.3.4
### Patch Changes
+14 -14
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/create-app",
"description": "Create app package for Backstage",
"version": "0.3.4",
"version": "0.3.5",
"private": false,
"publishConfig": {
"access": "public"
@@ -37,29 +37,29 @@
"recursive-readdir": "^2.2.2"
},
"devDependencies": {
"@backstage/backend-common": "^0.4.2",
"@backstage/catalog-model": "^0.6.0",
"@backstage/cli": "^0.4.5",
"@backstage/backend-common": "^0.4.3",
"@backstage/catalog-model": "^0.6.1",
"@backstage/cli": "^0.4.6",
"@backstage/config": "^0.1.2",
"@backstage/core": "^0.4.3",
"@backstage/core": "^0.4.4",
"@backstage/plugin-api-docs": "^0.4.2",
"@backstage/plugin-app-backend": "^0.3.3",
"@backstage/plugin-auth-backend": "^0.2.9",
"@backstage/plugin-catalog": "^0.2.10",
"@backstage/plugin-catalog-backend": "^0.5.2",
"@backstage/plugin-catalog-import": "^0.3.3",
"@backstage/plugin-auth-backend": "^0.2.10",
"@backstage/plugin-catalog": "^0.2.11",
"@backstage/plugin-catalog-backend": "^0.5.3",
"@backstage/plugin-catalog-import": "^0.3.4",
"@backstage/plugin-circleci": "^0.2.5",
"@backstage/plugin-explore": "^0.2.2",
"@backstage/plugin-github-actions": "^0.2.6",
"@backstage/plugin-lighthouse": "^0.2.6",
"@backstage/plugin-github-actions": "^0.2.7",
"@backstage/plugin-lighthouse": "^0.2.7",
"@backstage/plugin-proxy-backend": "^0.2.3",
"@backstage/plugin-rollbar-backend": "^0.1.6",
"@backstage/plugin-scaffolder": "^0.3.6",
"@backstage/plugin-search": "^0.2.5",
"@backstage/plugin-scaffolder-backend": "^0.4.0",
"@backstage/plugin-scaffolder-backend": "^0.4.1",
"@backstage/plugin-tech-radar": "^0.3.2",
"@backstage/plugin-techdocs": "^0.5.2",
"@backstage/plugin-techdocs-backend": "^0.5.2",
"@backstage/plugin-techdocs": "^0.5.3",
"@backstage/plugin-techdocs-backend": "^0.5.3",
"@backstage/plugin-user-settings": "^0.2.3",
"@backstage/test-utils": "^0.1.6",
"@backstage/theme": "^0.2.2",
+6
View File
@@ -1,5 +1,11 @@
# @backstage/integration
## 0.2.0
### Minor Changes
- 466354aaa: Build out the `ScmIntegrations` class, as well as the individual `*Integration` classes
## 0.1.5
### Patch Changes
+2 -2
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/integration",
"version": "0.1.5",
"version": "0.2.0",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -34,7 +34,7 @@
"git-url-parse": "^11.4.3"
},
"devDependencies": {
"@backstage/cli": "^0.4.5",
"@backstage/cli": "^0.4.6",
"@backstage/test-utils": "^0.1.5",
"@types/jest": "^26.0.7",
"msw": "^0.21.2"
+33
View File
@@ -1,5 +1,38 @@
# @backstage/techdocs-common
## 0.3.3
### Patch Changes
- 68ad5af51: Improve techdocs-common Generator API for it to be used by techdocs-cli. TechDocs generator.run function now takes
an input AND an output directory. Most probably you use techdocs-common via plugin-techdocs-backend, and so there
is no breaking change for you.
But if you use techdocs-common separately, you need to create an output directory and pass into the generator.
- 371f67ecd: fix to-string breakage of binary files
- f1e74777a: Fix bug where binary files (`png`, etc.) could not load when using AWS or GCS publisher.
- dbe4450c3: Google Cloud authentication in TechDocs has been improved.
1. `techdocs.publisher.googleGcs.credentials` is now optional. If it is missing, `GOOGLE_APPLICATION_CREDENTIALS`
environment variable (and some other methods) will be used to authenticate.
Read more here https://cloud.google.com/docs/authentication/production
2. `techdocs.publisher.googleGcs.projectId` is no longer used. You can remove it from your `app-config.yaml`.
- 5826d0973: AWS SDK version bump for TechDocs.
- b3b9445df: AWS S3 authentication in TechDocs has been improved.
1. `techdocs.publisher.awsS3.bucketName` is now the only required config. `techdocs.publisher.awsS3.credentials` and `techdocs.publisher.awsS3.region` are optional.
2. If `techdocs.publisher.awsS3.credentials` and `techdocs.publisher.awsS3.region` are missing, the AWS environment variables `AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY` and `AWS_REGION` will be used. There are more better ways of setting up AWS authentication. Read the guide at https://backstage.io/docs/features/techdocs/using-cloud-storage
- Updated dependencies [466354aaa]
- Updated dependencies [f3b064e1c]
- Updated dependencies [abbee6fff]
- Updated dependencies [147fadcb9]
- @backstage/integration@0.2.0
- @backstage/catalog-model@0.6.1
- @backstage/backend-common@0.4.3
## 0.3.2
### Patch Changes
+5 -5
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/techdocs-common",
"description": "Common functionalities for TechDocs, to be shared between techdocs-backend plugin and techdocs-cli",
"version": "0.3.2",
"version": "0.3.3",
"main": "src/index.ts",
"types": "src/index.ts",
"private": false,
@@ -37,10 +37,10 @@
},
"dependencies": {
"@aws-sdk/client-s3": "^3.1.0",
"@backstage/backend-common": "^0.4.2",
"@backstage/catalog-model": "^0.6.0",
"@backstage/backend-common": "^0.4.3",
"@backstage/catalog-model": "^0.6.1",
"@backstage/config": "^0.1.2",
"@backstage/integration": "^0.1.5",
"@backstage/integration": "^0.2.0",
"@google-cloud/storage": "^5.6.0",
"@types/dockerode": "^3.2.1",
"@types/express": "^4.17.6",
@@ -57,7 +57,7 @@
},
"devDependencies": {
"@aws-sdk/types": "3.1.0",
"@backstage/cli": "^0.4.5",
"@backstage/cli": "^0.4.6",
"@types/fs-extra": "^9.0.5",
"@types/git-url-parse": "^9.0.0",
"@types/js-yaml": "^3.12.5",
@@ -24,13 +24,13 @@ import { PublisherBase, PublishRequest } from './types';
import fs from 'fs-extra';
import { Readable } from 'stream';
const streamToString = (stream: Readable): Promise<string> => {
const streamToBuffer = (stream: Readable): Promise<Buffer> => {
return new Promise((resolve, reject) => {
try {
const chunks: any[] = [];
stream.on('data', chunk => chunks.push(chunk));
stream.on('error', reject);
stream.on('end', () => resolve(Buffer.concat(chunks).toString('utf8')));
stream.on('end', () => resolve(Buffer.concat(chunks)));
} catch (e) {
throw new Error(`Unable to parse the response data, ${e.message}`);
}
@@ -173,7 +173,7 @@ export class AwsS3Publish implements PublisherBase {
Key: `${entityRootDir}/techdocs_metadata.json`,
})
.then(async file => {
const techdocsMetadataJson = await streamToString(
const techdocsMetadataJson = await streamToBuffer(
file.Body as Readable,
);
@@ -183,7 +183,7 @@ export class AwsS3Publish implements PublisherBase {
);
}
resolve(techdocsMetadataJson);
resolve(techdocsMetadataJson.toString('utf-8'));
})
.catch(err => {
this.logger.error(err.message);
@@ -211,7 +211,7 @@ export class AwsS3Publish implements PublisherBase {
this.storageClient
.getObject({ Bucket: this.bucketName, Key: filePath })
.then(async object => {
const fileContent = await streamToString(object.Body as Readable);
const fileContent = await streamToBuffer(object.Body as Readable);
if (!fileContent) {
throw new Error(`Unable to parse the file ${filePath}.`);
}
+2 -2
View File
@@ -30,7 +30,7 @@
},
"dependencies": {
"@backstage/catalog-model": "^0.6.0",
"@backstage/core": "^0.4.3",
"@backstage/core": "^0.4.4",
"@backstage/plugin-catalog": "^0.2.9",
"@backstage/theme": "^0.2.2",
"@kyma-project/asyncapi-react": "^0.14.2",
@@ -49,7 +49,7 @@
"swagger-ui-react": "^3.37.2"
},
"devDependencies": {
"@backstage/cli": "^0.4.5",
"@backstage/cli": "^0.4.6",
"@backstage/dev-utils": "^0.1.7",
"@backstage/test-utils": "^0.1.6",
"@testing-library/jest-dom": "^5.10.1",
+11
View File
@@ -1,5 +1,16 @@
# @backstage/plugin-auth-backend
## 0.2.10
### Patch Changes
- 468579734: Allow blank certificates and support logout URLs in the SAML provider.
- Updated dependencies [f3b064e1c]
- Updated dependencies [abbee6fff]
- Updated dependencies [147fadcb9]
- @backstage/catalog-model@0.6.1
- @backstage/backend-common@0.4.3
## 0.2.9
### Patch Changes
+4 -4
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-auth-backend",
"version": "0.2.9",
"version": "0.2.10",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -29,9 +29,9 @@
"clean": "backstage-cli clean"
},
"dependencies": {
"@backstage/backend-common": "^0.4.2",
"@backstage/backend-common": "^0.4.3",
"@backstage/catalog-client": "^0.3.4",
"@backstage/catalog-model": "^0.6.0",
"@backstage/catalog-model": "^0.6.1",
"@backstage/config": "^0.1.2",
"@types/express": "^4.17.6",
"compression": "^1.7.4",
@@ -64,7 +64,7 @@
"yn": "^4.0.0"
},
"devDependencies": {
"@backstage/cli": "^0.4.5",
"@backstage/cli": "^0.4.6",
"@types/body-parser": "^1.19.0",
"@types/cookie-parser": "^1.4.2",
"@types/express-session": "^1.17.2",
+14
View File
@@ -1,5 +1,19 @@
# @backstage/plugin-catalog-backend
## 0.5.3
### Patch Changes
- 94fdf4955: Get rid of all usages of @octokit/types, and bump the rest of the octokit dependencies to the latest version
- ade6b3bdf: AWS SDK version bump for Catalog Backend.
- abbee6fff: Implement System, Domain and Resource entity kinds.
- 147fadcb9: Add subcomponentOf to Component kind to represent subsystems of larger components.
- Updated dependencies [f3b064e1c]
- Updated dependencies [abbee6fff]
- Updated dependencies [147fadcb9]
- @backstage/catalog-model@0.6.1
- @backstage/backend-common@0.4.3
## 0.5.2
### Patch Changes
+4 -4
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-catalog-backend",
"version": "0.5.2",
"version": "0.5.3",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -31,8 +31,8 @@
"dependencies": {
"@aws-sdk/client-organizations": "^3.2.0",
"@azure/msal-node": "^1.0.0-alpha.8",
"@backstage/backend-common": "^0.4.2",
"@backstage/catalog-model": "^0.6.0",
"@backstage/backend-common": "^0.4.3",
"@backstage/catalog-model": "^0.6.1",
"@backstage/config": "^0.1.2",
"@octokit/graphql": "^4.5.8",
"@types/express": "^4.17.6",
@@ -57,7 +57,7 @@
"yup": "^0.29.3"
},
"devDependencies": {
"@backstage/cli": "^0.4.5",
"@backstage/cli": "^0.4.6",
"@backstage/test-utils": "^0.1.6",
"@types/core-js": "^2.5.4",
"@types/git-url-parse": "^9.0.0",
@@ -17,7 +17,10 @@
import {
ApiEntity,
ComponentEntity,
DomainEntity,
GroupEntity,
ResourceEntity,
SystemEntity,
UserEntity,
} from '@backstage/catalog-model';
import { BuiltinKindsEntityProcessor } from './BuiltinKindsEntityProcessor';
@@ -42,12 +45,13 @@ describe('BuiltinKindsEntityProcessor', () => {
lifecycle: 'l',
providesApis: ['b'],
consumesApis: ['c'],
system: 's',
},
};
await processor.postProcessEntity(entity, location, emit);
expect(emit).toBeCalledTimes(8);
expect(emit).toBeCalledTimes(10);
expect(emit).toBeCalledWith({
type: 'relation',
relation: {
@@ -112,6 +116,22 @@ describe('BuiltinKindsEntityProcessor', () => {
target: { kind: 'Component', namespace: 'default', name: 's' },
},
});
expect(emit).toBeCalledWith({
type: 'relation',
relation: {
source: { kind: 'System', namespace: 'default', name: 's' },
type: 'hasPart',
target: { kind: 'Component', namespace: 'default', name: 'n' },
},
});
expect(emit).toBeCalledWith({
type: 'relation',
relation: {
source: { kind: 'Component', namespace: 'default', name: 'n' },
type: 'partOf',
target: { kind: 'System', namespace: 'default', name: 's' },
},
});
});
it('generates relations for api entities', async () => {
@@ -124,12 +144,13 @@ describe('BuiltinKindsEntityProcessor', () => {
owner: 'o',
lifecycle: 'l',
definition: 'd',
system: 's',
},
};
await processor.postProcessEntity(entity, location, emit);
expect(emit).toBeCalledTimes(2);
expect(emit).toBeCalledTimes(4);
expect(emit).toBeCalledWith({
type: 'relation',
relation: {
@@ -146,6 +167,150 @@ describe('BuiltinKindsEntityProcessor', () => {
target: { kind: 'Group', namespace: 'default', name: 'o' },
},
});
expect(emit).toBeCalledWith({
type: 'relation',
relation: {
source: { kind: 'System', namespace: 'default', name: 's' },
type: 'hasPart',
target: { kind: 'API', namespace: 'default', name: 'n' },
},
});
expect(emit).toBeCalledWith({
type: 'relation',
relation: {
source: { kind: 'API', namespace: 'default', name: 'n' },
type: 'partOf',
target: { kind: 'System', namespace: 'default', name: 's' },
},
});
});
it('generates relations for resource entities', async () => {
const entity: ResourceEntity = {
apiVersion: 'backstage.io/v1alpha1',
kind: 'Resource',
metadata: { name: 'n' },
spec: {
type: 'database',
owner: 'o',
system: 's',
},
};
await processor.postProcessEntity(entity, location, emit);
expect(emit).toBeCalledTimes(4);
expect(emit).toBeCalledWith({
type: 'relation',
relation: {
source: { kind: 'Group', namespace: 'default', name: 'o' },
type: 'ownerOf',
target: { kind: 'Resource', namespace: 'default', name: 'n' },
},
});
expect(emit).toBeCalledWith({
type: 'relation',
relation: {
source: { kind: 'Resource', namespace: 'default', name: 'n' },
type: 'ownedBy',
target: { kind: 'Group', namespace: 'default', name: 'o' },
},
});
expect(emit).toBeCalledWith({
type: 'relation',
relation: {
source: { kind: 'System', namespace: 'default', name: 's' },
type: 'hasPart',
target: { kind: 'Resource', namespace: 'default', name: 'n' },
},
});
expect(emit).toBeCalledWith({
type: 'relation',
relation: {
source: { kind: 'Resource', namespace: 'default', name: 'n' },
type: 'partOf',
target: { kind: 'System', namespace: 'default', name: 's' },
},
});
});
it('generates relations for system entities', async () => {
const entity: SystemEntity = {
apiVersion: 'backstage.io/v1alpha1',
kind: 'System',
metadata: { name: 'n' },
spec: {
owner: 'o',
domain: 'd',
},
};
await processor.postProcessEntity(entity, location, emit);
expect(emit).toBeCalledTimes(4);
expect(emit).toBeCalledWith({
type: 'relation',
relation: {
source: { kind: 'Group', namespace: 'default', name: 'o' },
type: 'ownerOf',
target: { kind: 'System', namespace: 'default', name: 'n' },
},
});
expect(emit).toBeCalledWith({
type: 'relation',
relation: {
source: { kind: 'System', namespace: 'default', name: 'n' },
type: 'ownedBy',
target: { kind: 'Group', namespace: 'default', name: 'o' },
},
});
expect(emit).toBeCalledWith({
type: 'relation',
relation: {
source: { kind: 'Domain', namespace: 'default', name: 'd' },
type: 'hasPart',
target: { kind: 'System', namespace: 'default', name: 'n' },
},
});
expect(emit).toBeCalledWith({
type: 'relation',
relation: {
source: { kind: 'System', namespace: 'default', name: 'n' },
type: 'partOf',
target: { kind: 'Domain', namespace: 'default', name: 'd' },
},
});
});
it('generates relations for domain entities', async () => {
const entity: DomainEntity = {
apiVersion: 'backstage.io/v1alpha1',
kind: 'Domain',
metadata: { name: 'n' },
spec: {
owner: 'o',
},
};
await processor.postProcessEntity(entity, location, emit);
expect(emit).toBeCalledTimes(2);
expect(emit).toBeCalledWith({
type: 'relation',
relation: {
source: { kind: 'Group', namespace: 'default', name: 'o' },
type: 'ownerOf',
target: { kind: 'Domain', namespace: 'default', name: 'n' },
},
});
expect(emit).toBeCalledWith({
type: 'relation',
relation: {
source: { kind: 'Domain', namespace: 'default', name: 'n' },
type: 'ownedBy',
target: { kind: 'Group', namespace: 'default', name: 'o' },
},
});
});
it('generates relations for user entities', async () => {
@@ -19,6 +19,8 @@ import {
apiEntityV1alpha1Validator,
ComponentEntity,
componentEntityV1alpha1Validator,
DomainEntity,
domainEntityV1alpha1Validator,
Entity,
getEntityName,
GroupEntity,
@@ -31,13 +33,17 @@ import {
RELATION_CHILD_OF,
RELATION_CONSUMES_API,
RELATION_HAS_MEMBER,
RELATION_MEMBER_OF,
RELATION_HAS_PART,
RELATION_PART_OF,
RELATION_MEMBER_OF,
RELATION_OWNED_BY,
RELATION_OWNER_OF,
RELATION_PARENT_OF,
RELATION_PART_OF,
RELATION_PROVIDES_API,
ResourceEntity,
resourceEntityV1alpha1Validator,
SystemEntity,
systemEntityV1alpha1Validator,
templateEntityV1alpha1Validator,
UserEntity,
userEntityV1alpha1Validator,
@@ -49,10 +55,13 @@ export class BuiltinKindsEntityProcessor implements CatalogProcessor {
private readonly validators = [
apiEntityV1alpha1Validator,
componentEntityV1alpha1Validator,
resourceEntityV1alpha1Validator,
groupEntityV1alpha1Validator,
locationEntityV1alpha1Validator,
templateEntityV1alpha1Validator,
userEntityV1alpha1Validator,
systemEntityV1alpha1Validator,
domainEntityV1alpha1Validator,
];
async validateEntityKind(entity: Entity): Promise<boolean> {
@@ -135,6 +144,12 @@ export class BuiltinKindsEntityProcessor implements CatalogProcessor {
RELATION_CONSUMES_API,
RELATION_API_CONSUMED_BY,
);
doEmit(
component.spec.system,
{ defaultKind: 'System', defaultNamespace: selfRef.namespace },
RELATION_PART_OF,
RELATION_HAS_PART,
);
}
/*
@@ -149,6 +164,32 @@ export class BuiltinKindsEntityProcessor implements CatalogProcessor {
RELATION_OWNED_BY,
RELATION_OWNER_OF,
);
doEmit(
api.spec.system,
{ defaultKind: 'System', defaultNamespace: selfRef.namespace },
RELATION_PART_OF,
RELATION_HAS_PART,
);
}
/*
* Emit relations for the Resource kind
*/
if (entity.kind === 'Resource') {
const resource = entity as ResourceEntity;
doEmit(
resource.spec.owner,
{ defaultKind: 'Group', defaultNamespace: selfRef.namespace },
RELATION_OWNED_BY,
RELATION_OWNER_OF,
);
doEmit(
resource.spec.system,
{ defaultKind: 'System', defaultNamespace: selfRef.namespace },
RELATION_PART_OF,
RELATION_HAS_PART,
);
}
/*
@@ -185,6 +226,40 @@ export class BuiltinKindsEntityProcessor implements CatalogProcessor {
);
}
/*
* Emit relations for the System kind
*/
if (entity.kind === 'System') {
const system = entity as SystemEntity;
doEmit(
system.spec.owner,
{ defaultKind: 'Group', defaultNamespace: selfRef.namespace },
RELATION_OWNED_BY,
RELATION_OWNER_OF,
);
doEmit(
system.spec.domain,
{ defaultKind: 'Domain', defaultNamespace: selfRef.namespace },
RELATION_PART_OF,
RELATION_HAS_PART,
);
}
/*
* Emit relations for the Domain kind
*/
if (entity.kind === 'Domain') {
const domain = entity as DomainEntity;
doEmit(
domain.spec.owner,
{ defaultKind: 'Group', defaultNamespace: selfRef.namespace },
RELATION_OWNED_BY,
RELATION_OWNER_OF,
);
}
return entity;
}
}
+19
View File
@@ -1,5 +1,24 @@
# @backstage/plugin-catalog-import
## 0.3.4
### Patch Changes
- 34a01a171: Improve how URLs are analyzed for add/import
- bc40ccecf: Add more generic descriptions for the catalog-import form.
- 94fdf4955: Get rid of all usages of @octokit/types, and bump the rest of the octokit dependencies to the latest version
- be5ac7fde: Remove dependency to `@backstage/plugin-catalog-backend`.
- Updated dependencies [466354aaa]
- Updated dependencies [f3b064e1c]
- Updated dependencies [c00488983]
- Updated dependencies [265a7ab30]
- Updated dependencies [abbee6fff]
- Updated dependencies [147fadcb9]
- @backstage/integration@0.2.0
- @backstage/catalog-model@0.6.1
- @backstage/plugin-catalog@0.2.11
- @backstage/core@0.4.4
## 0.3.3
### Patch Changes
+6 -6
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-catalog-import",
"version": "0.3.3",
"version": "0.3.4",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -30,10 +30,10 @@
"clean": "backstage-cli clean"
},
"dependencies": {
"@backstage/catalog-model": "^0.6.0",
"@backstage/core": "^0.4.3",
"@backstage/plugin-catalog": "^0.2.10",
"@backstage/integration": "^0.1.5",
"@backstage/catalog-model": "^0.6.1",
"@backstage/core": "^0.4.4",
"@backstage/plugin-catalog": "^0.2.11",
"@backstage/integration": "^0.2.0",
"@backstage/theme": "^0.2.2",
"@material-ui/core": "^4.11.0",
"@material-ui/icons": "^4.9.1",
@@ -49,7 +49,7 @@
"yaml": "^1.10.0"
},
"devDependencies": {
"@backstage/cli": "^0.4.5",
"@backstage/cli": "^0.4.6",
"@backstage/dev-utils": "^0.1.7",
"@backstage/test-utils": "^0.1.6",
"@testing-library/jest-dom": "^5.10.1",
+17
View File
@@ -1,5 +1,22 @@
# @backstage/plugin-catalog
## 0.2.11
### Patch Changes
- c00488983: Enable catalog table actions for all location types.
The edit button has had support for other providers for a while and there is
no specific reason the View in GitHub cannot work for all locations. This
change also replaces the GitHub icon with the OpenInNew icon.
- Updated dependencies [f3b064e1c]
- Updated dependencies [265a7ab30]
- Updated dependencies [abbee6fff]
- Updated dependencies [147fadcb9]
- @backstage/catalog-model@0.6.1
- @backstage/core@0.4.4
## 0.2.10
### Patch Changes
+4 -4
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-catalog",
"version": "0.2.10",
"version": "0.2.11",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -31,8 +31,8 @@
},
"dependencies": {
"@backstage/catalog-client": "^0.3.4",
"@backstage/catalog-model": "^0.6.0",
"@backstage/core": "^0.4.3",
"@backstage/catalog-model": "^0.6.1",
"@backstage/core": "^0.4.4",
"@backstage/plugin-scaffolder": "^0.3.6",
"@backstage/theme": "^0.2.2",
"@material-ui/core": "^4.11.0",
@@ -51,7 +51,7 @@
"swr": "^0.3.0"
},
"devDependencies": {
"@backstage/cli": "^0.4.5",
"@backstage/cli": "^0.4.6",
"@backstage/dev-utils": "^0.1.7",
"@backstage/test-utils": "^0.1.6",
"@microsoft/microsoft-graph-types": "^1.25.0",
+2 -2
View File
@@ -32,7 +32,7 @@
},
"dependencies": {
"@backstage/catalog-model": "^0.6.0",
"@backstage/core": "^0.4.3",
"@backstage/core": "^0.4.4",
"@backstage/plugin-catalog": "^0.2.7",
"@backstage/theme": "^0.2.2",
"@material-ui/core": "^4.11.0",
@@ -50,7 +50,7 @@
"react-use": "^15.3.3"
},
"devDependencies": {
"@backstage/cli": "^0.4.5",
"@backstage/cli": "^0.4.6",
"@backstage/dev-utils": "^0.1.7",
"@backstage/test-utils": "^0.1.6",
"@testing-library/jest-dom": "^5.10.1",
+14
View File
@@ -1,5 +1,19 @@
# @backstage/plugin-cloudbuild
## 0.2.6
### Patch Changes
- 94fdf4955: Get rid of all usages of @octokit/types, and bump the rest of the octokit dependencies to the latest version
- Updated dependencies [f3b064e1c]
- Updated dependencies [c00488983]
- Updated dependencies [265a7ab30]
- Updated dependencies [abbee6fff]
- Updated dependencies [147fadcb9]
- @backstage/catalog-model@0.6.1
- @backstage/plugin-catalog@0.2.11
- @backstage/core@0.4.4
## 0.2.5
### Patch Changes
+5 -5
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-cloudbuild",
"version": "0.2.5",
"version": "0.2.6",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -30,9 +30,9 @@
"clean": "backstage-cli clean"
},
"dependencies": {
"@backstage/catalog-model": "^0.6.0",
"@backstage/core": "^0.4.3",
"@backstage/plugin-catalog": "^0.2.7",
"@backstage/catalog-model": "^0.6.1",
"@backstage/core": "^0.4.4",
"@backstage/plugin-catalog": "^0.2.11",
"@backstage/theme": "^0.2.2",
"@material-ui/core": "^4.11.0",
"@material-ui/icons": "^4.9.1",
@@ -47,7 +47,7 @@
"react-use": "^15.3.3"
},
"devDependencies": {
"@backstage/cli": "^0.4.5",
"@backstage/cli": "^0.4.6",
"@backstage/dev-utils": "^0.1.7",
"@backstage/test-utils": "^0.1.6",
"@testing-library/jest-dom": "^5.10.1",
+2 -2
View File
@@ -31,7 +31,7 @@
},
"dependencies": {
"@backstage/config": "^0.1.2",
"@backstage/core": "^0.4.3",
"@backstage/core": "^0.4.4",
"@backstage/theme": "^0.2.2",
"@material-ui/core": "^4.11.0",
"@material-ui/icons": "^4.9.1",
@@ -55,7 +55,7 @@
"yup": "^0.29.3"
},
"devDependencies": {
"@backstage/cli": "^0.4.5",
"@backstage/cli": "^0.4.6",
"@backstage/dev-utils": "^0.1.7",
"@backstage/test-utils": "^0.1.6",
"@testing-library/jest-dom": "^5.10.1",
+2 -2
View File
@@ -30,7 +30,7 @@
"start": "backstage-cli plugin:serve"
},
"dependencies": {
"@backstage/core": "^0.4.3",
"@backstage/core": "^0.4.4",
"@backstage/theme": "^0.2.2",
"@material-ui/core": "^4.11.0",
"@material-ui/icons": "^4.9.1",
@@ -42,7 +42,7 @@
"react-use": "^15.3.3"
},
"devDependencies": {
"@backstage/cli": "^0.4.5",
"@backstage/cli": "^0.4.6",
"@backstage/dev-utils": "^0.1.7",
"@backstage/test-utils": "^0.1.6",
"@testing-library/jest-dom": "^5.10.1",
+2 -2
View File
@@ -32,7 +32,7 @@
},
"dependencies": {
"@backstage/catalog-model": "^0.6.0",
"@backstage/core": "^0.4.3",
"@backstage/core": "^0.4.4",
"@backstage/theme": "^0.2.2",
"@material-ui/core": "^4.11.0",
"@material-ui/icons": "^4.9.1",
@@ -43,7 +43,7 @@
"react-use": "^15.3.3"
},
"devDependencies": {
"@backstage/cli": "^0.4.5",
"@backstage/cli": "^0.4.6",
"@backstage/dev-utils": "^0.1.7",
"@backstage/test-utils": "^0.1.6",
"@testing-library/jest-dom": "^5.10.1",
+2 -2
View File
@@ -30,7 +30,7 @@
"clean": "backstage-cli clean"
},
"dependencies": {
"@backstage/core": "^0.4.3",
"@backstage/core": "^0.4.4",
"@backstage/theme": "^0.2.2",
"@material-ui/core": "^4.11.0",
"@material-ui/icons": "^4.9.1",
@@ -41,7 +41,7 @@
"react-use": "^15.3.3"
},
"devDependencies": {
"@backstage/cli": "^0.4.5",
"@backstage/cli": "^0.4.6",
"@backstage/dev-utils": "^0.1.7",
"@backstage/test-utils": "^0.1.6",
"@testing-library/jest-dom": "^5.10.1",
+15
View File
@@ -1,5 +1,20 @@
# @backstage/plugin-github-actions
## 0.2.7
### Patch Changes
- 94fdf4955: Get rid of all usages of @octokit/types, and bump the rest of the octokit dependencies to the latest version
- a6f9dca0d: Remove dependency on `@backstage/core-api`. No plugin should ever depend on that package; it's an internal concern whose important bits are re-exported by `@backstage/core` which is the public facing dependency to use.
- Updated dependencies [f3b064e1c]
- Updated dependencies [c00488983]
- Updated dependencies [265a7ab30]
- Updated dependencies [abbee6fff]
- Updated dependencies [147fadcb9]
- @backstage/catalog-model@0.6.1
- @backstage/plugin-catalog@0.2.11
- @backstage/core@0.4.4
## 0.2.6
### Patch Changes
+5 -6
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-github-actions",
"version": "0.2.6",
"version": "0.2.7",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -32,10 +32,9 @@
"clean": "backstage-cli clean"
},
"dependencies": {
"@backstage/catalog-model": "^0.6.0",
"@backstage/core": "^0.4.3",
"@backstage/core-api": "^0.2.7",
"@backstage/plugin-catalog": "^0.2.8",
"@backstage/catalog-model": "^0.6.1",
"@backstage/core": "^0.4.4",
"@backstage/plugin-catalog": "^0.2.11",
"@backstage/theme": "^0.2.2",
"@material-ui/core": "^4.11.0",
"@material-ui/icons": "^4.9.1",
@@ -50,7 +49,7 @@
"react-use": "^15.3.3"
},
"devDependencies": {
"@backstage/cli": "^0.4.5",
"@backstage/cli": "^0.4.6",
"@backstage/dev-utils": "^0.1.7",
"@backstage/test-utils": "^0.1.6",
"@testing-library/jest-dom": "^5.10.1",
@@ -14,15 +14,15 @@
* limitations under the License.
*/
import type { Props as RecentWorkflowRunsCardProps } from './RecentWorkflowRunsCard';
import React from 'react';
import { render } from '@testing-library/react';
import { RecentWorkflowRunsCard } from './RecentWorkflowRunsCard';
import { ApiProvider, ApiRegistry, errorApiRef } from '@backstage/core-api';
import { useWorkflowRuns } from '../useWorkflowRuns';
import { ThemeProvider } from '@material-ui/core';
import { ApiProvider, ApiRegistry, errorApiRef } from '@backstage/core';
import { lightTheme } from '@backstage/theme';
import { ThemeProvider } from '@material-ui/core';
import { render } from '@testing-library/react';
import React from 'react';
import { MemoryRouter } from 'react-router';
import { useWorkflowRuns } from '../useWorkflowRuns';
import type { Props as RecentWorkflowRunsCardProps } from './RecentWorkflowRunsCard';
import { RecentWorkflowRunsCard } from './RecentWorkflowRunsCard';
jest.mock('../useWorkflowRuns', () => ({
useWorkflowRuns: jest.fn(),
@@ -14,14 +14,19 @@
* limitations under the License.
*/
import { Entity } from '@backstage/catalog-model';
import { errorApiRef, useApi } from '@backstage/core-api';
import {
EmptyState,
errorApiRef,
InfoCard,
Table,
useApi,
} from '@backstage/core';
import { Button, Link } from '@material-ui/core';
import React, { useEffect } from 'react';
import { generatePath, Link as RouterLink } from 'react-router-dom';
import { GITHUB_ACTIONS_ANNOTATION } from '../useProjectName';
import { useWorkflowRuns } from '../useWorkflowRuns';
import React, { useEffect } from 'react';
import { EmptyState, InfoCard, Table } from '@backstage/core';
import { WorkflowRunStatus } from '../WorkflowRunStatus';
import { Button, Link } from '@material-ui/core';
import { generatePath, Link as RouterLink } from 'react-router-dom';
const firstLine = (message: string): string => message.split('\n')[0];
+2 -2
View File
@@ -31,7 +31,7 @@
"clean": "backstage-cli clean"
},
"dependencies": {
"@backstage/core": "^0.4.3",
"@backstage/core": "^0.4.4",
"@backstage/theme": "^0.2.2",
"@material-ui/core": "^4.11.0",
"@material-ui/icons": "^4.9.1",
@@ -42,7 +42,7 @@
"react-use": "^15.3.3"
},
"devDependencies": {
"@backstage/cli": "^0.4.5",
"@backstage/cli": "^0.4.6",
"@backstage/dev-utils": "^0.1.7",
"@backstage/test-utils": "^0.1.6",
"@testing-library/jest-dom": "^5.10.1",

Some files were not shown because too many files have changed in this diff Show More