diff --git a/packages/catalog-model/examples/all-domains.yaml b/packages/catalog-model/examples/all-domains.yaml index 91a8a5b76d..5855fde34b 100644 --- a/packages/catalog-model/examples/all-domains.yaml +++ b/packages/catalog-model/examples/all-domains.yaml @@ -5,5 +5,6 @@ metadata: description: A collection of all Backstage example domains spec: targets: + - ./domains/audio-domain.yaml - ./domains/artists-domain.yaml - ./domains/playback-domain.yaml diff --git a/packages/catalog-model/examples/domains/artists-domain.yaml b/packages/catalog-model/examples/domains/artists-domain.yaml index 2a74425791..44963e8a34 100644 --- a/packages/catalog-model/examples/domains/artists-domain.yaml +++ b/packages/catalog-model/examples/domains/artists-domain.yaml @@ -11,3 +11,4 @@ metadata: icon: dashboard spec: owner: team-a + domain: audio diff --git a/packages/catalog-model/examples/domains/audio-domain.yaml b/packages/catalog-model/examples/domains/audio-domain.yaml new file mode 100644 index 0000000000..c454a7cf8d --- /dev/null +++ b/packages/catalog-model/examples/domains/audio-domain.yaml @@ -0,0 +1,13 @@ +apiVersion: backstage.io/v1alpha1 +kind: Domain +metadata: + name: audio + description: Everything related to audio + links: + - url: http://example.com/domain/audio/ + title: Domain Readme + - url: http://example.com/domains/audio/dashboard + title: Domain Metrics Dashboard + icon: dashboard +spec: + owner: acme-corp diff --git a/packages/catalog-model/src/kinds/DomainEntityV1alpha1.test.ts b/packages/catalog-model/src/kinds/DomainEntityV1alpha1.test.ts index 822a7984e9..40c3e3ee5e 100644 --- a/packages/catalog-model/src/kinds/DomainEntityV1alpha1.test.ts +++ b/packages/catalog-model/src/kinds/DomainEntityV1alpha1.test.ts @@ -31,6 +31,7 @@ describe('DomainV1alpha1Validator', () => { }, spec: { owner: 'me', + domain: 'parent', }, }; }); @@ -68,4 +69,19 @@ describe('DomainV1alpha1Validator', () => { (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/); + }); }); diff --git a/packages/catalog-model/src/kinds/DomainEntityV1alpha1.ts b/packages/catalog-model/src/kinds/DomainEntityV1alpha1.ts index e0302fcc52..dacb5f817b 100644 --- a/packages/catalog-model/src/kinds/DomainEntityV1alpha1.ts +++ b/packages/catalog-model/src/kinds/DomainEntityV1alpha1.ts @@ -32,6 +32,7 @@ export interface DomainEntityV1alpha1 extends Entity { kind: 'Domain'; spec: { owner: string; + domain?: string; }; } diff --git a/packages/catalog-model/src/schema/kinds/Domain.v1alpha1.schema.json b/packages/catalog-model/src/schema/kinds/Domain.v1alpha1.schema.json index a1a09b1213..00549db11b 100644 --- a/packages/catalog-model/src/schema/kinds/Domain.v1alpha1.schema.json +++ b/packages/catalog-model/src/schema/kinds/Domain.v1alpha1.schema.json @@ -11,7 +11,8 @@ "description": "Everything about artists" }, "spec": { - "owner": "artist-relations-team" + "owner": "artist-relations-team", + "domain": "artists" } } ], @@ -38,6 +39,12 @@ "description": "An entity reference to the owner of the component.", "examples": ["artist-relations-team", "user:john.johnson"], "minLength": 1 + }, + "domain": { + "type": "string", + "description": "An entity reference to the domain that the system belongs to.", + "examples": ["artists"], + "minLength": 1 } } }