From 83d250badc60fb7c450f6497582fd95bce2acc4a Mon Sep 17 00:00:00 2001 From: Brian Fletcher Date: Tue, 14 Mar 2023 19:44:18 +0000 Subject: [PATCH] fix bug where response is badly formed. (#16830) * fix bug where response is badly formed. Ideally the client would validate that the response is in the format it expects upfront before any of this processing is done. This change provides a minimal fix. Signed-off-by: Brian Fletcher * Update plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.ts Co-authored-by: Sam Blausten Signed-off-by: Brian Fletcher * prettier Signed-off-by: Brian Fletcher --------- Signed-off-by: Brian Fletcher Co-authored-by: Sam Blausten --- .changeset/old-cougars-sit.md | 5 +++ .../service/KubernetesFanOutHandler.test.ts | 41 +++++++++++++++++++ .../src/service/KubernetesFanOutHandler.ts | 2 +- 3 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 .changeset/old-cougars-sit.md 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)), ), }; }