From a5a9d3318ae01d8e66ade8fbaa12271a3386cd92 Mon Sep 17 00:00:00 2001 From: Jamie Klassen Date: Wed, 30 Nov 2022 13:54:28 -0500 Subject: [PATCH] don't surface non-FetchErrors It makes sense to gracefully show an error that was actually related to fetching data from Kubernetes, but if the error is happening for some other exotic reason, the default error handling logic in Backstage should take over and log/manage it appropriately. Signed-off-by: Jamie Klassen --- .../service/KubernetesFanOutHandler.test.ts | 21 +++++++++++++++++ .../src/service/KubernetesFanOutHandler.ts | 23 +++++++++++-------- 2 files changed, 35 insertions(+), 9 deletions(-) diff --git a/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.test.ts b/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.test.ts index fcb8eceb19..17a86eb30d 100644 --- a/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.test.ts +++ b/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.test.ts @@ -757,6 +757,27 @@ describe('getKubernetesObjectsByEntity', () => { ], }); }); + it('fails when fetcher rejects with a non-FetchError', async () => { + const nonFetchError = new Error('not a fetch error'); + getClustersByEntity.mockResolvedValue({ + clusters: [ + { + name: 'test-cluster', + authProvider: 'serviceAccount', + skipMetricsLookup: true, + }, + ], + }); + fetchObjectsForService.mockRejectedValue(nonFetchError); + + const sut = getKubernetesFanOutHandler([]); + + const result = sut.getKubernetesObjectsByEntity({ + entity, + auth: {}, + }); + await expect(result).rejects.toThrow(nonFetchError); + }); describe('with a real fetcher', () => { const worker = setupServer(); setupRequestMockHandlers(worker); diff --git a/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.ts b/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.ts index bc8881f95b..a738c69bcc 100644 --- a/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.ts +++ b/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.ts @@ -274,15 +274,20 @@ export class KubernetesFanOutHandler { namespace, }) .then(result => this.getMetricsForPods(clusterDetailsItem, result)) - .catch((e): responseWithMetrics => { - return [ - { - errors: [{ errorType: 'FETCH_ERROR', message: e.message }], - responses: [], - }, - [], - ]; - }) + .catch( + (e): Promise => + e.name === 'FetchError' + ? Promise.resolve([ + { + errors: [ + { errorType: 'FETCH_ERROR', message: e.message }, + ], + responses: [], + }, + [], + ]) + : Promise.reject(e), + ) .then(r => this.toClusterObjects(clusterDetailsItem, r)); }), ).then(this.toObjectsByEntityResponse);