diff --git a/.changeset/old-cougars-sit.md b/.changeset/old-cougars-sit.md new file mode 100644 index 0000000000..cdab8b1291 --- /dev/null +++ b/.changeset/old-cougars-sit.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-kubernetes-backend': patch +--- + +Fix parsing error when kubernetes api is returning badly structured data. diff --git a/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.test.ts b/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.test.ts index 17a86eb30d..53aaa1ad3a 100644 --- a/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.test.ts +++ b/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.test.ts @@ -502,6 +502,47 @@ describe('getKubernetesObjectsByEntity', () => { }); }); + it('pods api is returning garbage', async () => { + getClustersByEntity.mockImplementation(() => + Promise.resolve({ + clusters: [ + { + name: 'test-cluster', + authProvider: 'serviceAccount', + }, + ], + }), + ); + + fetchObjectsForService.mockImplementation((_: ObjectFetchParams) => + Promise.resolve({ + errors: [], + responses: [ + { + garbage: ['thrash', 'rubbish'], + }, + ], + }), + ); + + mockMetrics(fetchPodMetricsByNamespaces); + + const sut = getKubernetesFanOutHandler([]); + + const result = await sut.getKubernetesObjectsByEntity({ + entity, + auth: {}, + }); + + expect(getClustersByEntity.mock.calls.length).toBe(1); + expect(fetchObjectsForService.mock.calls.length).toBe(1); + expect(fetchPodMetricsByNamespaces.mock.calls.length).toBe(0); + + expect(result).toStrictEqual({ + items: [], + }); + }); + it('retrieve objects for two clusters', async () => { getClustersByEntity.mockImplementation(() => Promise.resolve({ diff --git a/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.ts b/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.ts index 63e46a44e3..e0a6c21c4a 100644 --- a/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.ts +++ b/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.ts @@ -324,7 +324,7 @@ export class KubernetesFanOutHandler { (item.errors !== undefined && item.errors.length >= 1) || (item.resources !== undefined && item.resources.length >= 1 && - item.resources.some(fr => fr.resources.length >= 1)), + item.resources.some(fr => fr.resources?.length >= 1)), ), }; }