diff --git a/plugins/catalog/src/components/SystemDiagram/SystemDiagram.test.tsx b/plugins/catalog/src/components/SystemDiagram/SystemDiagram.test.tsx index cd38384645..ed9b12e3e5 100644 --- a/plugins/catalog/src/components/SystemDiagram/SystemDiagram.test.tsx +++ b/plugins/catalog/src/components/SystemDiagram/SystemDiagram.test.tsx @@ -31,50 +31,14 @@ describe('', () => { afterEach(() => jest.resetAllMocks()); - const catalogApi: Partial = { - getEntities: () => - Promise.resolve({ - items: [ - { - apiVersion: 'backstage.io/v1alpha1', - kind: 'System', - metadata: { - name: 'my-system', - namespace: 'my-namespace', - }, - spec: { - owner: 'tools@example.com', - }, - }, - { - apiVersion: 'backstage.io/v1alpha1', - kind: 'Component', - metadata: { - name: 'my-entity', - namespace: 'my-namespace', - }, - spec: { - owner: 'not-tools@example.com', - type: 'service', - system: 'my-system', - }, - }, - { - apiVersion: 'backstage.io/v1alpha1', - kind: 'System', - metadata: { - name: 'my-system2', - namespace: 'my-namespace2', - }, - spec: { - owner: 'tools@example.com', - }, - }, - ] as Entity[], - }), - }; - it('shows empty list if no relations', async () => { + const catalogApi: Partial = { + getEntities: () => + Promise.resolve({ + items: [] as Entity[], + }), + }; + const entity: Entity = { apiVersion: 'v1', kind: 'System', @@ -99,6 +63,27 @@ describe('', () => { }); it('shows related systems', async () => { + const catalogApi: Partial = { + getEntities: () => + Promise.resolve({ + items: [ + { + apiVersion: 'backstage.io/v1alpha1', + kind: 'Component', + metadata: { + name: 'my-entity', + namespace: 'my-namespace', + }, + spec: { + owner: 'not-tools@example.com', + type: 'service', + system: 'my-system', + }, + }, + ] as Entity[], + }), + }; + const entity: Entity = { apiVersion: 'v1', kind: 'System', diff --git a/plugins/catalog/src/components/SystemDiagram/SystemDiagram.tsx b/plugins/catalog/src/components/SystemDiagram/SystemDiagram.tsx index 3d966a2f8b..47ada9003d 100644 --- a/plugins/catalog/src/components/SystemDiagram/SystemDiagram.tsx +++ b/plugins/catalog/src/components/SystemDiagram/SystemDiagram.tsx @@ -62,84 +62,78 @@ function simplifiedEntityName( * and relationships of those entities. */ export function SystemDiagram({ entity }: SystemDiagramProps) { - const catalogApi = useApi(catalogApiRef); - const { loading, error, value: catalogResponse } = useAsync(() => { - return catalogApi.getEntities({ - filter: { - kind: ['Component', 'API', 'Resource', 'System', 'Domain'], - }, - }); - }, [catalogApi]); - const currentSystemName = entity.metadata.name; const currentSystemNode = simplifiedEntityName(entity); const systemNodes = new Array<{ id: string }>(); const systemEdges = new Array<{ from: string; to: string; label: string }>(); + const catalogApi = useApi(catalogApiRef); + const { loading, error, value: catalogResponse } = useAsync(() => { + return catalogApi.getEntities({ + filter: { + kind: ['Component', 'API', 'Resource', 'System', 'Domain'], + ['spec.system']: currentSystemName, + }, + }); + }, [catalogApi]); + + // pick out the system itself + systemNodes.push({ + id: currentSystemNode, + }); + + // check if the system has an assigned domain + // even if the domain object doesn't exist in the catalog, display it in the map + const catalogItemDomain = getEntityRelations(entity, RELATION_PART_OF, { + kind: 'domain', + }); + catalogItemDomain.forEach(foundDomain => + systemNodes.push({ + id: simplifiedEntityName(foundDomain), + }), + ); + catalogItemDomain.forEach(foundDomain => + systemEdges.push({ + from: currentSystemNode, + to: simplifiedEntityName(foundDomain), + label: 'part of', + }), + ); + if (catalogResponse && catalogResponse.items) { for (const catalogItem of catalogResponse.items) { - // pick out the system itself - if (catalogItem.metadata.name === currentSystemName) { - systemNodes.push({ - id: currentSystemNode, - }); + systemNodes.push({ + id: simplifiedEntityName(catalogItem), + }); - // check if the system has an assigned domain - // even if the domain object doesn't exist in the catalog, display it in the map - const catalogItemDomain = getEntityRelations( - catalogItem, - RELATION_PART_OF, - { kind: 'domain' }, - ); - catalogItemDomain.forEach(foundDomain => - systemNodes.push({ - id: simplifiedEntityName(foundDomain), - }), - ); - catalogItemDomain.forEach(foundDomain => - systemEdges.push({ - from: currentSystemNode, - to: simplifiedEntityName(foundDomain), - label: 'part of', - }), - ); - } + // Check relations of the entity assigned to this system to see + // if it relates to other entities. + // Note those relations may, or may not, be explicitly + // assigned to the system. + const catalogItemRelations_partOf = getEntityRelations( + catalogItem, + RELATION_PART_OF, + ); + catalogItemRelations_partOf.forEach(foundRelation => + systemEdges.push({ + from: simplifiedEntityName(catalogItem), + to: simplifiedEntityName(foundRelation), + label: 'part of', + }), + ); - // process any entity assigned to the system - if (catalogItem.spec?.system === currentSystemName) { - systemNodes.push({ - id: simplifiedEntityName(catalogItem), - }); + const catalogItemRelations_providesApi = getEntityRelations( + catalogItem, + RELATION_PROVIDES_API, + ); - // Check relations of the entity assigned to this system to see - // if it relates to other entities. - // Note those relations may, or may not, be explicitly - // assigned to the system. - - const catalogItemRelations_partOf = getEntityRelations( - catalogItem, - RELATION_PART_OF, - ); - catalogItemRelations_partOf.forEach(foundRelation => - systemEdges.push({ - from: simplifiedEntityName(catalogItem), - to: simplifiedEntityName(foundRelation), - label: 'part of', - }), - ); - - const catalogItemRelations_providesApi = getEntityRelations( - catalogItem, - RELATION_PROVIDES_API, - ); - catalogItemRelations_providesApi.forEach(foundRelation => - systemEdges.push({ - from: simplifiedEntityName(catalogItem), - to: simplifiedEntityName(foundRelation), - label: 'provides API', - }), - ); - } + catalogItemRelations_providesApi.forEach(foundRelation => + systemEdges.push({ + from: simplifiedEntityName(catalogItem), + to: simplifiedEntityName(foundRelation), + label: 'provides API', + }), + ); } }