From 484aadb9204e9ba0bc0bf94201a0abf2b6602987 Mon Sep 17 00:00:00 2001 From: Janne Savolainen Date: Tue, 7 Jun 2022 13:45:55 +0300 Subject: [PATCH] Handle error about no helm repositories when updating repositories Co-authored-by: Mikko Aspiala Signed-off-by: Janne Savolainen --- ...m-repositories-in-preferences.test.ts.snap | 2602 ++++++++--------- ...e-helm-repositories-in-preferences.test.ts | 261 +- ...get-active-helm-repositories.injectable.ts | 21 +- 3 files changed, 1440 insertions(+), 1444 deletions(-) diff --git a/src/behaviours/helm-charts/__snapshots__/listing-active-helm-repositories-in-preferences.test.ts.snap b/src/behaviours/helm-charts/__snapshots__/listing-active-helm-repositories-in-preferences.test.ts.snap index 992ff35155..e72d9547a1 100644 --- a/src/behaviours/helm-charts/__snapshots__/listing-active-helm-repositories-in-preferences.test.ts.snap +++ b/src/behaviours/helm-charts/__snapshots__/listing-active-helm-repositories-in-preferences.test.ts.snap @@ -938,7 +938,7 @@ exports[`listing active helm repositories in preferences when navigating to pref `; -exports[`listing active helm repositories in preferences when navigating to preferences containing helm repositories when configuration resolves when updating repositories reject renders 1`] = ` +exports[`listing active helm repositories in preferences when navigating to preferences containing helm repositories when configuration resolves when updating repositories reject with any other error renders 1`] = `
`; -exports[`listing active helm repositories in preferences when navigating to preferences containing helm repositories when configuration resolves when updating repositories resolve when loading repositories resolves with existing repositories renders 1`] = ` +exports[`listing active helm repositories in preferences when navigating to preferences containing helm repositories when configuration resolves when updating repositories reject with error about no existing repositories renders 1`] = ` + +
+
+ +
+
+
+
+

+ Kubernetes +

+
+
+ Kubectl binary download + +
+ +
+
+
+ Download mirror + +
+
+ + +
+
+
+ Download mirror for kubectl +
+
+ +
+
+
+ + +
+
+
+
+
+
+ Directory for binaries + +
+
+ +
+
+
+ The directory to download binaries into. +
+
+
+
+ Path to kubectl binary + +
+
+ +
+
+
+
+
+
+

+ Kubeconfig Syncs +

+
+ +
+
+ Synced Items + +
+
+
+ No files and folders have been synced yet +
+
+
+
+
+

+ Helm Charts +

+
+
+
+
+ + +
+
+
+ Repositories +
+
+ +
+
+
+ + + +
+
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + + close + + +
+ +
+
+
+
+
+
+
+ +`; + +exports[`listing active helm repositories in preferences when navigating to preferences containing helm repositories when configuration resolves when updating repositories reject with error about no existing repositories when adding default repository reject renders 1`] = ` + +
+
+ +
+
+
+
+

+ Kubernetes +

+
+
+ Kubectl binary download + +
+ +
+
+
+ Download mirror + +
+
+ + +
+
+
+ Download mirror for kubectl +
+
+ +
+
+
+ + +
+
+
+
+
+
+ Directory for binaries + +
+
+ +
+
+
+ The directory to download binaries into. +
+
+
+
+ Path to kubectl binary + +
+
+ +
+
+
+
+
+
+

+ Kubeconfig Syncs +

+
+ +
+
+ Synced Items + +
+
+
+ No files and folders have been synced yet +
+
+
+
+
+

+ Helm Charts +

+
+
+
+ Error when adding default Helm repository: Some error +
+
+
+
+
+
+
+
+
+
+ + + close + + +
+ +
+
+
+
+
+
+
+ +`; + +exports[`listing active helm repositories in preferences when navigating to preferences containing helm repositories when configuration resolves when updating repositories reject with error about no existing repositories when adding of default repository resolves renders 1`] = ` + +
+
+ +
+
+
+
+

+ Kubernetes +

+
+
+ Kubectl binary download + +
+ +
+
+
+ Download mirror + +
+
+ + +
+
+
+ Download mirror for kubectl +
+
+ +
+
+
+ + +
+
+
+
+
+
+ Directory for binaries + +
+
+ +
+
+
+ The directory to download binaries into. +
+
+
+
+ Path to kubectl binary + +
+
+ +
+
+
+
+
+
+

+ Kubeconfig Syncs +

+
+ +
+
+ Synced Items + +
+
+
+ No files and folders have been synced yet +
+
+
+
+
+

+ Helm Charts +

+
+
+
+
+ + +
+
+
+ Repositories +
+
+ +
+
+
+ + + +
+
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + + close + + +
+ +
+
+
+
+
+
+
+ +`; + +exports[`listing active helm repositories in preferences when navigating to preferences containing helm repositories when configuration resolves when updating repositories resolve when repositories resolves renders 1`] = `
`; -exports[`listing active helm repositories in preferences when navigating to preferences containing helm repositories when configuration resolves when updating repositories resolve when loading repositories resolves with no existing repositories renders 1`] = ` - -
-
- -
-
-
-
-

- Kubernetes -

-
-
- Kubectl binary download - -
- -
-
-
- Download mirror - -
-
- - -
-
-
- Download mirror for kubectl -
-
- -
-
-
- - -
-
-
-
-
-
- Directory for binaries - -
-
- -
-
-
- The directory to download binaries into. -
-
-
-
- Path to kubectl binary - -
-
- -
-
-
-
-
-
-

- Kubeconfig Syncs -

-
- -
-
- Synced Items - -
-
-
- No files and folders have been synced yet -
-
-
-
-
-

- Helm Charts -

-
-
-
-
- - -
-
-
- Repositories -
-
- -
-
-
- - - -
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- - - close - - -
- -
-
-
-
-
-
-
- -`; - -exports[`listing active helm repositories in preferences when navigating to preferences containing helm repositories when configuration resolves when updating repositories resolve when loading repositories resolves with no existing repositories when adding default repository reject renders 1`] = ` - -
-
- -
-
-
-
-

- Kubernetes -

-
-
- Kubectl binary download - -
- -
-
-
- Download mirror - -
-
- - -
-
-
- Download mirror for kubectl -
-
- -
-
-
- - -
-
-
-
-
-
- Directory for binaries - -
-
- -
-
-
- The directory to download binaries into. -
-
-
-
- Path to kubectl binary - -
-
- -
-
-
-
-
-
-

- Kubeconfig Syncs -

-
- -
-
- Synced Items - -
-
-
- No files and folders have been synced yet -
-
-
-
-
-

- Helm Charts -

-
-
-
- Error when adding default Helm repository: Some error -
-
-
-
-
-
-
-
-
-
- - - close - - -
- -
-
-
-
-
-
-
- -`; - -exports[`listing active helm repositories in preferences when navigating to preferences containing helm repositories when configuration resolves when updating repositories resolve when loading repositories resolves with no existing repositories when adding of default repository resolves renders 1`] = ` - -
-
- -
-
-
-
-

- Kubernetes -

-
-
- Kubectl binary download - -
- -
-
-
- Download mirror - -
-
- - -
-
-
- Download mirror for kubectl -
-
- -
-
-
- - -
-
-
-
-
-
- Directory for binaries - -
-
- -
-
-
- The directory to download binaries into. -
-
-
-
- Path to kubectl binary - -
-
- -
-
-
-
-
-
-

- Kubeconfig Syncs -

-
- -
-
- Synced Items - -
-
-
- No files and folders have been synced yet -
-
-
-
-
-

- Helm Charts -

-
-
-
-
- - -
-
-
- Repositories -
-
- -
-
-
- - - -
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- - - close - - -
- -
-
-
-
-
-
-
- -`; - exports[`listing active helm repositories in preferences when navigating to preferences containing helm repositories when configuration resolves without path to repository cache directory renders 1`] = `
diff --git a/src/behaviours/helm-charts/listing-active-helm-repositories-in-preferences.test.ts b/src/behaviours/helm-charts/listing-active-helm-repositories-in-preferences.test.ts index 2959b53a00..5d840618c9 100644 --- a/src/behaviours/helm-charts/listing-active-helm-repositories-in-preferences.test.ts +++ b/src/behaviours/helm-charts/listing-active-helm-repositories-in-preferences.test.ts @@ -218,7 +218,7 @@ describe("listing active helm repositories in preferences", () => { expect(readYamlFileMock).not.toHaveBeenCalled(); }); - describe("when updating repositories reject", () => { + describe("when updating repositories reject with any other error", () => { beforeEach(async () => { await execFileMock.reject("Some error"); }); @@ -246,6 +246,134 @@ describe("listing active helm repositories in preferences", () => { }); }); + describe("when updating repositories reject with error about no existing repositories", () => { + beforeEach(async () => { + execFileMock.mockClear(); + + await execFileMock.reject( + "Error: no repositories found. You must add one before updating", + ); + }); + + it("renders", () => { + expect(rendered.baseElement).toMatchSnapshot(); + }); + + it("still shows the loader for repositories", () => { + expect( + rendered.queryByTestId("helm-repositories-are-loading"), + ).toBeInTheDocument(); + }); + + it('adds "bitnami" as default repository', () => { + expect(execFileMock).toHaveBeenCalledWith( + "some-helm-binary-path", + ["repo", "add", "bitnami", "https://charts.bitnami.com/bitnami"], + ); + }); + + describe("when adding default repository reject", () => { + beforeEach(async () => { + await execFileMock.reject("Some error"); + }); + + it("shows error notification", () => { + expect(showErrorNotificationMock).toHaveBeenCalledWith( + "Error when adding default Helm repository: Some error", + ); + }); + + it("removes all helm controls", () => { + expect( + rendered.queryByTestId("helm-controls"), + ).not.toBeInTheDocument(); + }); + + it("does not show loader for repositories anymore", () => { + expect( + rendered.queryByTestId("helm-repositories-are-loading"), + ).not.toBeInTheDocument(); + }); + + it("renders", () => { + expect(rendered.baseElement).toMatchSnapshot(); + }); + }); + + describe("when adding of default repository resolves", () => { + beforeEach(async () => { + readYamlFileMock.mockClear(); + + await execFileMock.resolveSpecific( + [ + "some-helm-binary-path", + + [ + "repo", + "add", + "bitnami", + "https://charts.bitnami.com/bitnami", + ], + ], + + "", + ); + }); + + it("renders", () => { + expect(rendered.baseElement).toMatchSnapshot(); + }); + + it("still shows the loader for repositories", () => { + expect( + rendered.queryByTestId("helm-repositories-are-loading"), + ).toBeInTheDocument(); + }); + + it("calls for repositories again", () => { + expect(readYamlFileMock).toHaveBeenCalledWith( + "some-helm-repository-config-file.yaml", + ); + }); + + describe("when another call for repositories resolve", () => { + beforeEach(async () => { + await readYamlFileMock.resolveSpecific( + ["some-helm-repository-config-file.yaml"], + + { + repositories: [ + { + name: "bitnami", + url: "https://charts.bitnami.com/bitnami", + caFile: "irrelevant", + certFile: "irrelevant", + insecure_skip_tls_verify: false, + keyFile: "irrelevant", + pass_credentials_all: false, + password: "irrelevant", + username: "irrelevant", + }, + ], + }, + ); + }); + + it("does not show loader for repositories anymore", () => { + expect( + rendered.queryByTestId("helm-repositories-are-loading"), + ).not.toBeInTheDocument(); + }); + + it("shows the added repository", () => { + const actual = rendered.getByTestId("helm-repository-bitnami"); + + expect(actual).toBeInTheDocument(); + }); + }); + }); + }); + describe("when updating repositories resolve", () => { beforeEach(async () => { execFileMock.mockClear(); @@ -262,7 +390,7 @@ describe("listing active helm repositories in preferences", () => { ); }); - describe("when loading repositories resolves with existing repositories", () => { + describe("when repositories resolves", () => { beforeEach(async () => { execFileMock.mockClear(); @@ -297,135 +425,6 @@ describe("listing active helm repositories in preferences", () => { expect(actual).toHaveLength(2); }); }); - - describe("when loading repositories resolves with no existing repositories", () => { - beforeEach(async () => { - execFileMock.mockClear(); - - await readYamlFileMock.resolveSpecific( - ["some-helm-repository-config-file.yaml"], - { repositories: [] }, - ); - }); - - it("renders", () => { - expect(rendered.baseElement).toMatchSnapshot(); - }); - - it("still shows the loader for repositories", () => { - expect( - rendered.queryByTestId("helm-repositories-are-loading"), - ).toBeInTheDocument(); - }); - - it('adds "bitnami" as default repository', () => { - expect(execFileMock).toHaveBeenCalledWith( - "some-helm-binary-path", - ["repo", "add", "bitnami", "https://charts.bitnami.com/bitnami"], - ); - }); - - describe("when adding default repository reject", () => { - beforeEach(async () => { - await execFileMock.reject("Some error"); - }); - - it("shows error notification", () => { - expect(showErrorNotificationMock).toHaveBeenCalledWith( - "Error when adding default Helm repository: Some error", - ); - }); - - it("removes all helm controls", () => { - expect( - rendered.queryByTestId("helm-controls"), - ).not.toBeInTheDocument(); - }); - - it("does not show loader for repositories anymore", () => { - expect( - rendered.queryByTestId("helm-repositories-are-loading"), - ).not.toBeInTheDocument(); - }); - - it("renders", () => { - expect(rendered.baseElement).toMatchSnapshot(); - }); - }); - - describe("when adding of default repository resolves", () => { - beforeEach(async () => { - readYamlFileMock.mockClear(); - - await execFileMock.resolveSpecific( - [ - "some-helm-binary-path", - - [ - "repo", - "add", - "bitnami", - "https://charts.bitnami.com/bitnami", - ], - ], - - "", - ); - }); - - it("renders", () => { - expect(rendered.baseElement).toMatchSnapshot(); - }); - - it("still shows the loader for repositories", () => { - expect( - rendered.queryByTestId("helm-repositories-are-loading"), - ).toBeInTheDocument(); - }); - - it("calls for repositories again", () => { - expect(readYamlFileMock).toHaveBeenCalledWith( - "some-helm-repository-config-file.yaml", - ); - }); - - describe("when another call for repositories resolve", () => { - beforeEach(async () => { - await readYamlFileMock.resolveSpecific( - ["some-helm-repository-config-file.yaml"], - - { - repositories: [ - { - name: "bitnami", - url: "https://charts.bitnami.com/bitnami", - caFile: "irrelevant", - certFile: "irrelevant", - insecure_skip_tls_verify: false, - keyFile: "irrelevant", - pass_credentials_all: false, - password: "irrelevant", - username: "irrelevant", - }, - ], - }, - ); - }); - - it("does not show loader for repositories anymore", () => { - expect( - rendered.queryByTestId("helm-repositories-are-loading"), - ).not.toBeInTheDocument(); - }); - - it("shows the added repository", () => { - const actual = rendered.getByTestId("helm-repository-bitnami"); - - expect(actual).toBeInTheDocument(); - }); - }); - }); - }); }); }); }); diff --git a/src/main/helm/repositories/get-active-helm-repositories/get-active-helm-repositories.injectable.ts b/src/main/helm/repositories/get-active-helm-repositories/get-active-helm-repositories.injectable.ts index 2e9ffa6ed0..6071c597c3 100644 --- a/src/main/helm/repositories/get-active-helm-repositories/get-active-helm-repositories.injectable.ts +++ b/src/main/helm/repositories/get-active-helm-repositories/get-active-helm-repositories.injectable.ts @@ -8,7 +8,6 @@ import type { ReadYamlFile } from "../../../../common/fs/read-yaml-file.injectab import readYamlFileInjectable from "../../../../common/fs/read-yaml-file.injectable"; import getHelmEnvInjectable from "../../get-helm-env/get-helm-env.injectable"; import execHelmInjectable from "../../exec-helm/exec-helm.injectable"; -import { isEmpty } from "lodash/fp"; import loggerInjectable from "../../../../common/logger.injectable"; import type { AsyncResult } from "../../../../common/utils/async-result"; @@ -84,15 +83,13 @@ const getActiveHelmRepositoriesInjectable = getInjectable({ const updateResult = await execHelm("repo", "update"); if (!updateResult.callWasSuccessful) { - return { - callWasSuccessful: false, - error: `Error updating Helm repositories: ${updateResult.error}`, - }; - } + if (!updateResult.error.includes(internalHelmErrorForNoRepositoriesFound)) { + return { + callWasSuccessful: false, + error: `Error updating Helm repositories: ${updateResult.error}`, + }; + } - const repositories = await getRepositories(); - - if (isEmpty(repositories)) { const resultOfAddingDefaultRepository = await execHelm("repo", "add", "bitnami", "https://charts.bitnami.com/bitnami"); if (!resultOfAddingDefaultRepository.callWasSuccessful) { @@ -101,11 +98,9 @@ const getActiveHelmRepositoriesInjectable = getInjectable({ error: `Error when adding default Helm repository: ${resultOfAddingDefaultRepository.error}`, }; } - - return { callWasSuccessful: true, response: await getRepositories() }; } - return { callWasSuccessful: true, response: repositories }; + return { callWasSuccessful: true, response: await getRepositories() }; }; }, }); @@ -132,3 +127,5 @@ const getRepositoriesForFor = cacheFilePath: `${helmRepositoryCacheDirPath}/${repository.name}-index.yaml`, })); }; + +const internalHelmErrorForNoRepositoriesFound = "no repositories found. You must add one before updating";