@@ -5712,7 +5757,7 @@ exports[`activate custom helm repository in preferences when navigating to prefe
-
-
+
+
- Repositories
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
-
-
-
+ class="pt-5 relative"
+ >
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ close
+
+
+
+
+ ESC
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/behaviours/helm-charts/__snapshots__/activate-helm-repository-from-list-in-preferences.test.ts.snap b/src/behaviours/helm-charts/__snapshots__/activate-helm-repository-from-list-in-preferences.test.ts.snap
index 36e2946904..af51c234df 100644
--- a/src/behaviours/helm-charts/__snapshots__/activate-helm-repository-from-list-in-preferences.test.ts.snap
+++ b/src/behaviours/helm-charts/__snapshots__/activate-helm-repository-from-list-in-preferences.test.ts.snap
@@ -306,118 +306,122 @@ exports[`activate helm repository from list in preferences when navigating to pr
-
-
+
+
- Repositories
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
-
-
-
+ class="pt-5 relative"
+ >
+
+
+
-
@@ -771,123 +775,127 @@ exports[`activate helm repository from list in preferences when navigating to pr
-
-
-
-
-
- Repositories
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Some already active repository
-
-
- some-url
-
-
+
+
- delete
-
-
+
+
+ Repositories
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Some already active repository
+
+
+ some-url
+
+
+
+ delete
+
+
+
+
+
-
@@ -1241,125 +1249,129 @@ exports[`activate helm repository from list in preferences when navigating to pr
-
-
-
-
-
- Repositories
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Some already active repository
-
-
- some-url
-
-
+
+
- delete
-
-
+
+
+ Repositories
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Some already active repository
+
+
+ some-url
+
+
+
+ delete
+
+
+
+
+
-
@@ -1764,123 +1776,127 @@ exports[`activate helm repository from list in preferences when navigating to pr
-
-
-
-
-
- Repositories
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Some already active repository
-
-
- some-url
-
-
+
+
- delete
-
-
+
+
+ Repositories
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Some already active repository
+
+
+ some-url
+
+
+
+ delete
+
+
+
+
+
-
@@ -2234,118 +2250,122 @@ exports[`activate helm repository from list in preferences when navigating to pr
-
-
+
+
- Repositories
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
-
-
-
+ class="pt-5 relative"
+ >
+
+
+
-
@@ -2699,151 +2719,155 @@ exports[`activate helm repository from list in preferences when navigating to pr
-
-
+
+
- Repositories
+
+ Repositories
+
+
+
+
-
+
+
+
+
+
+
+
+
+ Some already active repository
+
+
+ some-url
+
+
-
-
-
+ delete
+
+
+
+
+
+ Some to be activated repository
-
-
-
-
-
-
-
- Some already active repository
-
-
- some-url
-
-
-
- delete
-
-
-
-
-
- Some to be activated repository
-
-
- some-other-url
-
-
-
+
- delete
-
-
+
+ delete
+
+
+
+
-
@@ -3197,153 +3221,157 @@ exports[`activate helm repository from list in preferences when navigating to pr
-
-
+
+
- Repositories
+
+ Repositories
+
+
+
+
-
+
+
+
+
+
+
+
+
+ Some already active repository
+
+
+ some-url
+
+
-
-
-
+ delete
+
+
+
+
+
+ Some to be activated repository
-
-
-
-
-
-
-
- Some already active repository
-
-
- some-url
-
-
-
- delete
-
-
-
-
-
- Some to be activated repository
-
-
- some-other-url
-
-
-
+
- delete
-
-
+
+ delete
+
+
+
+
-
@@ -3758,151 +3786,155 @@ exports[`activate helm repository from list in preferences when navigating to pr
-
-
+
+
- Repositories
+
+ Repositories
+
+
+
+
-
+
+
+
+
+
+
+
+
+ Some already active repository
+
+
+ some-url
+
+
-
-
-
+ delete
+
+
+
+
+
+ Some to be activated repository
-
-
-
-
-
-
-
- Some already active repository
-
-
- some-url
-
-
-
- delete
-
-
-
-
-
- Some to be activated repository
-
-
- some-other-url
-
-
-
+
- delete
-
-
+
+ delete
+
+
+
+
-
@@ -4256,118 +4288,596 @@ exports[`activate helm repository from list in preferences when navigating to pr
-
-
+
+
- Repositories
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
-
-
-
+ class="pt-5 relative"
+ >
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ close
+
+
+
+
+ ESC
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Some already active repository
+
+
+ some-url
+
+
+
+ delete
+
+
+
+
+
-
diff --git a/src/behaviours/helm-charts/__snapshots__/deactivate-helm-repository-from-list-of-active-repository-in-preferences.test.ts.snap b/src/behaviours/helm-charts/__snapshots__/deactivate-helm-repository-from-list-of-active-repository-in-preferences.test.ts.snap
index 6a58cbb752..7b901103c6 100644
--- a/src/behaviours/helm-charts/__snapshots__/deactivate-helm-repository-from-list-of-active-repository-in-preferences.test.ts.snap
+++ b/src/behaviours/helm-charts/__snapshots__/deactivate-helm-repository-from-list-of-active-repository-in-preferences.test.ts.snap
@@ -306,118 +306,122 @@ exports[`deactivate helm repository from list of active repositories in preferen
-
-
+
+
- Repositories
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
-
-
-
+ class="pt-5 relative"
+ >
+
+
+
-
@@ -771,123 +775,127 @@ exports[`deactivate helm repository from list of active repositories in preferen
-
-
-
-
-
- Repositories
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- some-active-repository
-
-
- some-url
-
-
+
+
- delete
-
-
+
+
+ Repositories
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ some-active-repository
+
+
+ some-url
+
+
+
+ delete
+
+
+
+
+
-
@@ -1241,123 +1249,127 @@ exports[`deactivate helm repository from list of active repositories in preferen
-
-
-
-
-
- Repositories
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- some-active-repository
-
-
- some-url
-
-
+
+
- delete
-
-
+
+
+ Repositories
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ some-active-repository
+
+
+ some-url
+
+
+
+ delete
+
+
+
+
+
-
@@ -1711,118 +1723,122 @@ exports[`deactivate helm repository from list of active repositories in preferen
-
-
+
+
- Repositories
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
-
-
-
+ class="pt-5 relative"
+ >
+
+
+
-
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 575d03033f..992ff35155 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
@@ -306,118 +306,122 @@ exports[`listing active helm repositories in preferences when navigating to pref
-
-
+
+
- Repositories
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
-
-
-
+ class="pt-5 relative"
+ >
+
+
+
-
@@ -771,118 +775,483 @@ exports[`listing active helm repositories in preferences when navigating to pref
-
-
+
+
- Repositories
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
-
-
-
+ class="pt-5 relative"
+ >
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ close
+
+
+
+
+ ESC
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 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 updating Helm repositories: Some error
-
@@ -1236,151 +1605,155 @@ exports[`listing active helm repositories in preferences when navigating to pref
-
-
+
+
- Repositories
+
+ Repositories
+
+
+
+
-
+
+
+
+
+
+
+
+
+ some-repository
+
+
+ some-repository-url
+
+
-
-
-
+ delete
+
+
+
+
+
+ some-other-repository
-
-
-
-
-
-
-
- some-repository
-
-
- some-repository-url
-
-
-
- delete
-
-
-
-
-
- some-other-repository
-
-
- some-other-repository-url
-
-
-
+
- delete
-
-
+
+ delete
+
+
+
+
-
@@ -1734,118 +2107,483 @@ exports[`listing active helm repositories in preferences when navigating to pref
-
-
+
+
- Repositories
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
-
-
-
+ class="pt-5 relative"
+ >
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ close
+
+
+
+
+ ESC
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 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
-
@@ -2199,118 +2937,122 @@ exports[`listing active helm repositories in preferences when navigating to pref
-
-
+
+
- Repositories
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
-
-
-
+ class="pt-5 relative"
+ >
+
+
+
-
@@ -2664,105 +3406,14 @@ exports[`listing active helm repositories in preferences when navigating to pref
-
-
-
-
-
- Repositories
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- The repositories have not been added yet
-
+ Error getting Helm configuration: Tried to get Helm repositories, but HELM_REPOSITORY_CACHE was not present in \`$ helm env\`.
-
@@ -3116,105 +3767,375 @@ exports[`listing active helm repositories in preferences when navigating to pref
-
-
-
-
-
- Repositories
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- The repositories have not been added yet
-
+ Error getting Helm configuration: Tried to get Helm repositories, but HELM_REPOSITORY_CONFIG was not present in \`$ helm env\`.
+
+
+
+
+
+
+
+
+
+
+
+
+ close
+
+
+
+
+ ESC
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 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 getting Helm configuration: some-error
-
diff --git a/src/behaviours/helm-charts/activate-custom-helm-repository-preferences.test.ts b/src/behaviours/helm-charts/activate-custom-helm-repository-preferences.test.ts
index 3e92465d24..e31cf033a1 100644
--- a/src/behaviours/helm-charts/activate-custom-helm-repository-preferences.test.ts
+++ b/src/behaviours/helm-charts/activate-custom-helm-repository-preferences.test.ts
@@ -14,8 +14,9 @@ import getActiveHelmRepositoriesInjectable from "../../main/helm/repositories/ge
import type { HelmRepo } from "../../common/helm-repo";
import callForPublicHelmRepositoriesInjectable from "../../renderer/components/+preferences/kubernetes/helm-charts/activation-of-public-helm-repository/public-helm-repositories/call-for-public-helm-repositories.injectable";
import isPathInjectable from "../../renderer/components/input/validators/is-path.injectable";
-import showSuccessNotificationInjectable
- from "../../renderer/components/notifications/show-success-notification.injectable";
+import showSuccessNotificationInjectable from "../../renderer/components/notifications/show-success-notification.injectable";
+import showErrorNotificationInjectable from "../../renderer/components/notifications/show-error-notification.injectable";
+import type { AsyncResult } from "../../common/utils/async-result";
// TODO: Make tooltips free of side effects by making it deterministic
jest.mock("../../renderer/components/tooltip/withTooltip", () => ({
@@ -25,11 +26,12 @@ jest.mock("../../renderer/components/tooltip/withTooltip", () => ({
describe("activate custom helm repository in preferences", () => {
let applicationBuilder: ApplicationBuilder;
let showSuccessNotificationMock: jest.Mock;
+ let showErrorNotificationMock: jest.Mock;
let rendered: RenderResult;
let execFileMock: AsyncFnMock<
ReturnType
>;
- let getActiveHelmRepositoriesMock: AsyncFnMock<() => Promise>;
+ let getActiveHelmRepositoriesMock: AsyncFnMock<() => AsyncResult>;
beforeEach(async () => {
jest.useFakeTimers("modern");
@@ -46,6 +48,10 @@ describe("activate custom helm repository in preferences", () => {
rendererDi.override(showSuccessNotificationInjectable, () => showSuccessNotificationMock);
+ showErrorNotificationMock = jest.fn();
+
+ rendererDi.override(showErrorNotificationInjectable, () => showErrorNotificationMock);
+
// TODO: Figure out how to make async validators unit testable
rendererDi.override(isPathInjectable, () => ({ debounce: 0, validate: async () => {} }));
@@ -74,9 +80,12 @@ describe("activate custom helm repository in preferences", () => {
describe("when active repositories resolve", () => {
beforeEach(async () => {
await Promise.all([
- getActiveHelmRepositoriesMock.resolve([
- { name: "Some active repository", url: "some-url" },
- ]),
+ getActiveHelmRepositoriesMock.resolve({
+ callWasSuccessful: true,
+ response: [
+ { name: "Some active repository", url: "some-url" },
+ ],
+ }),
]);
});
@@ -180,7 +189,37 @@ describe("activate custom helm repository in preferences", () => {
expect(showSuccessNotificationMock).not.toHaveBeenCalled();
});
- describe("when activating resolves", () => {
+ describe("when activation rejects", () => {
+ beforeEach(async () => {
+ await execFileMock.reject(
+ "Some error",
+ );
+ });
+
+ it("renders", () => {
+ expect(rendered.baseElement).toMatchSnapshot();
+ });
+
+ it("shows error notification", () => {
+ expect(showErrorNotificationMock).toHaveBeenCalledWith(
+ "Some error",
+ );
+ });
+
+ it("does not show success notification", () => {
+ expect(showSuccessNotificationMock).not.toHaveBeenCalled();
+ });
+
+ it("does not show dialog anymore", () => {
+ expect(rendered.queryByTestId("activate-custom-helm-repository-dialog")).not.toBeInTheDocument();
+ });
+
+ it("does not reload active repositories", () => {
+ expect(getActiveHelmRepositoriesMock).not.toHaveBeenCalled();
+ });
+ });
+
+ describe("when activation resolves with success", () => {
beforeEach(async () => {
await execFileMock.resolveSpecific(
[
@@ -204,7 +243,7 @@ describe("activate custom helm repository in preferences", () => {
expect(getActiveHelmRepositoriesMock).toHaveBeenCalled();
});
- it("shows the notification", () => {
+ it("shows success notification", () => {
expect(showSuccessNotificationMock).toHaveBeenCalledWith(
"Helm repository some-custom-repository has been added.",
);
diff --git a/src/behaviours/helm-charts/activate-helm-repository-from-list-in-preferences.test.ts b/src/behaviours/helm-charts/activate-helm-repository-from-list-in-preferences.test.ts
index cae953f63c..48721690d1 100644
--- a/src/behaviours/helm-charts/activate-helm-repository-from-list-in-preferences.test.ts
+++ b/src/behaviours/helm-charts/activate-helm-repository-from-list-in-preferences.test.ts
@@ -12,6 +12,11 @@ import helmBinaryPathInjectable from "../../main/helm/helm-binary-path.injectabl
import getActiveHelmRepositoriesInjectable from "../../main/helm/repositories/get-active-helm-repositories/get-active-helm-repositories.injectable";
import type { HelmRepo } from "../../common/helm-repo";
import callForPublicHelmRepositoriesInjectable from "../../renderer/components/+preferences/kubernetes/helm-charts/activation-of-public-helm-repository/public-helm-repositories/call-for-public-helm-repositories.injectable";
+import showSuccessNotificationInjectable
+ from "../../renderer/components/notifications/show-success-notification.injectable";
+import showErrorNotificationInjectable
+ from "../../renderer/components/notifications/show-error-notification.injectable";
+import type { AsyncResult } from "../../common/utils/async-result";
// TODO: Make tooltips free of side effects by making it deterministic
jest.mock("../../renderer/components/tooltip/withTooltip", () => ({
@@ -21,11 +26,13 @@ jest.mock("../../renderer/components/tooltip/withTooltip", () => ({
describe("activate helm repository from list in preferences", () => {
let applicationBuilder: ApplicationBuilder;
+ let showSuccessNotificationMock: jest.Mock;
+ let showErrorNotificationMock: jest.Mock;
let rendered: RenderResult;
let execFileMock: AsyncFnMock<
ReturnType
>;
- let getActiveHelmRepositoriesMock: AsyncFnMock<() => Promise>;
+ let getActiveHelmRepositoriesMock: AsyncFnMock<() => AsyncResult>;
let callForPublicHelmRepositoriesMock: AsyncFnMock<() => Promise>;
beforeEach(async () => {
@@ -36,6 +43,14 @@ describe("activate helm repository from list in preferences", () => {
callForPublicHelmRepositoriesMock = asyncFn();
applicationBuilder.beforeApplicationStart(({ mainDi, rendererDi }) => {
+ showSuccessNotificationMock = jest.fn();
+
+ rendererDi.override(showSuccessNotificationInjectable, () => showSuccessNotificationMock);
+
+ showErrorNotificationMock = jest.fn();
+
+ rendererDi.override(showErrorNotificationInjectable, () => showErrorNotificationMock);
+
rendererDi.override(
callForPublicHelmRepositoriesInjectable,
() => callForPublicHelmRepositoriesMock,
@@ -78,9 +93,12 @@ describe("activate helm repository from list in preferences", () => {
{ name: "Some to be activated repository", url: "some-other-url" },
]),
- getActiveHelmRepositoriesMock.resolve([
- { name: "Some already active repository", url: "some-url" },
- ]),
+ getActiveHelmRepositoriesMock.resolve({
+ callWasSuccessful: true,
+ response: [
+ { name: "Some already active repository", url: "some-url" },
+ ],
+ }),
]);
});
@@ -124,6 +142,36 @@ describe("activate helm repository from list in preferences", () => {
expect(getActiveHelmRepositoriesMock).not.toHaveBeenCalled();
});
+ describe("when activation rejects", () => {
+ beforeEach(async () => {
+ await execFileMock.reject(
+ "Some error",
+ );
+ });
+
+ it("renders", () => {
+ expect(rendered.baseElement).toMatchSnapshot();
+ });
+
+ it("shows error notification", () => {
+ expect(showErrorNotificationMock).toHaveBeenCalledWith(
+ "Some error",
+ );
+ });
+
+ it("does not show success notification", () => {
+ expect(showSuccessNotificationMock).not.toHaveBeenCalled();
+ });
+
+ it("does not show dialog anymore", () => {
+ expect(rendered.queryByTestId("activate-custom-helm-repository-dialog")).not.toBeInTheDocument();
+ });
+
+ it("does not reload active repositories", () => {
+ expect(getActiveHelmRepositoriesMock).not.toHaveBeenCalled();
+ });
+ });
+
describe("when activating resolves", () => {
beforeEach(async () => {
await execFileMock.resolveSpecific(
@@ -144,12 +192,21 @@ describe("activate helm repository from list in preferences", () => {
expect(getActiveHelmRepositoriesMock).toHaveBeenCalled();
});
+ it("shows success notification", () => {
+ expect(showSuccessNotificationMock).toHaveBeenCalledWith(
+ "Helm repository Some to be activated repository has been added.",
+ );
+ });
+
describe("when active repositories resolve again", () => {
beforeEach(async () => {
- await getActiveHelmRepositoriesMock.resolve([
- { name: "Some already active repository", url: "some-url" },
- { name: "Some to be activated repository", url: "some-other-url" },
- ]);
+ await getActiveHelmRepositoriesMock.resolve({
+ callWasSuccessful: true,
+ response: [
+ { name: "Some already active repository", url: "some-url" },
+ { name: "Some to be activated repository", url: "some-other-url" },
+ ],
+ });
});
it("renders", () => {
diff --git a/src/behaviours/helm-charts/deactivate-helm-repository-from-list-of-active-repository-in-preferences.test.ts b/src/behaviours/helm-charts/deactivate-helm-repository-from-list-of-active-repository-in-preferences.test.ts
index 3f664ca528..98178d2fd6 100644
--- a/src/behaviours/helm-charts/deactivate-helm-repository-from-list-of-active-repository-in-preferences.test.ts
+++ b/src/behaviours/helm-charts/deactivate-helm-repository-from-list-of-active-repository-in-preferences.test.ts
@@ -13,6 +13,7 @@ import helmBinaryPathInjectable from "../../main/helm/helm-binary-path.injectabl
import getActiveHelmRepositoriesInjectable from "../../main/helm/repositories/get-active-helm-repositories/get-active-helm-repositories.injectable";
import type { HelmRepo } from "../../common/helm-repo";
import callForPublicHelmRepositoriesInjectable from "../../renderer/components/+preferences/kubernetes/helm-charts/activation-of-public-helm-repository/public-helm-repositories/call-for-public-helm-repositories.injectable";
+import type { AsyncResult } from "../../common/utils/async-result";
// TODO: Make tooltips free of side effects by making it deterministic
jest.mock("../../renderer/components/tooltip/withTooltip", () => ({
@@ -22,7 +23,7 @@ jest.mock("../../renderer/components/tooltip/withTooltip", () => ({
describe("deactivate helm repository from list of active repositories in preferences", () => {
let applicationBuilder: ApplicationBuilder;
let rendered: RenderResult;
- let getActiveHelmRepositoriesMock: AsyncFnMock<() => Promise>;
+ let getActiveHelmRepositoriesMock: AsyncFnMock<() => AsyncResult>;
let execFileMock: AsyncFnMock<
ReturnType
>;
@@ -60,9 +61,12 @@ describe("deactivate helm repository from list of active repositories in prefere
describe("when active repositories resolve", () => {
beforeEach(async () => {
- getActiveHelmRepositoriesMock.resolve([
- { name: "some-active-repository", url: "some-url" },
- ]);
+ getActiveHelmRepositoriesMock.resolve({
+ callWasSuccessful: true,
+ response: [
+ { name: "some-active-repository", url: "some-url" },
+ ],
+ });
});
it("renders", () => {
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 489956cd72..2959b53a00 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
@@ -15,6 +15,8 @@ import helmBinaryPathInjectable from "../../main/helm/helm-binary-path.injectabl
import loggerInjectable from "../../common/logger.injectable";
import type { Logger } from "../../common/logger";
import callForPublicHelmRepositoriesInjectable from "../../renderer/components/+preferences/kubernetes/helm-charts/activation-of-public-helm-repository/public-helm-repositories/call-for-public-helm-repositories.injectable";
+import showErrorNotificationInjectable
+ from "../../renderer/components/notifications/show-error-notification.injectable";
// TODO: Make tooltips free of side effects by making it deterministic
jest.mock("../../renderer/components/tooltip/withTooltip", () => ({
@@ -27,6 +29,7 @@ describe("listing active helm repositories in preferences", () => {
let readYamlFileMock: AsyncFnMock;
let execFileMock: AsyncFnMock>;
let loggerStub: Logger;
+ let showErrorNotificationMock: jest.Mock;
beforeEach(async () => {
applicationBuilder = getApplicationBuilder();
@@ -34,9 +37,12 @@ describe("listing active helm repositories in preferences", () => {
readYamlFileMock = asyncFn();
execFileMock = asyncFn();
- loggerStub = { warn: jest.fn() } as unknown as Logger;
+ loggerStub = { error: jest.fn() } as unknown as Logger;
applicationBuilder.beforeApplicationStart(({ mainDi, rendererDi }) => {
+ showErrorNotificationMock = jest.fn();
+
+ rendererDi.override(showErrorNotificationInjectable, () => showErrorNotificationMock);
rendererDi.override(callForPublicHelmRepositoriesInjectable, () => async () => []);
mainDi.override(readYamlFileInjectable, () => readYamlFileMock);
mainDi.override(execFileInjectable, () => execFileMock);
@@ -77,6 +83,34 @@ describe("listing active helm repositories in preferences", () => {
);
});
+ describe("when getting configuration rejects", () => {
+ beforeEach(async () => {
+ await execFileMock.reject("some-error");
+ });
+
+ it("shows error notification", () => {
+ expect(showErrorNotificationMock).toHaveBeenCalledWith(
+ "Error getting Helm configuration: 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 configuration resolves without path to repository config file", () => {
beforeEach(async () => {
execFileMock.mockClear();
@@ -87,20 +121,22 @@ describe("listing active helm repositories in preferences", () => {
);
});
- it("renders", () => {
- expect(rendered.baseElement).toMatchSnapshot();
- });
-
it("logs error", () => {
- expect(loggerStub.warn).toHaveBeenCalledWith(
- "Tried to get Helm repositories, but HELM_REPOSITORY_CONFIG was not present in `$ helm env`. Behaving as if there were no repositories.",
+ expect(loggerStub.error).toHaveBeenCalledWith(
+ "Tried to get Helm repositories, but HELM_REPOSITORY_CONFIG was not present in `$ helm env`.",
);
});
- it("shows message about no repositories found", () => {
+ it("shows error notification", () => {
+ expect(showErrorNotificationMock).toHaveBeenCalledWith(
+ "Error getting Helm configuration: Tried to get Helm repositories, but HELM_REPOSITORY_CONFIG was not present in `$ helm env`.",
+ );
+ });
+
+ it("removes all helm controls", () => {
expect(
- rendered.getByTestId("no-helm-repositories"),
- ).toBeInTheDocument();
+ rendered.queryByTestId("helm-controls"),
+ ).not.toBeInTheDocument();
});
it("does not show loader for repositories anymore", () => {
@@ -109,11 +145,8 @@ describe("listing active helm repositories in preferences", () => {
).not.toBeInTheDocument();
});
- it("does not call for updating of repositories", () => {
- expect(execFileMock).not.toHaveBeenCalledWith(
- "some-helm-binary-path",
- ["repo", "update"],
- );
+ it("renders", () => {
+ expect(rendered.baseElement).toMatchSnapshot();
});
});
@@ -127,20 +160,22 @@ describe("listing active helm repositories in preferences", () => {
);
});
- it("renders", () => {
- expect(rendered.baseElement).toMatchSnapshot();
- });
-
it("logs error", () => {
- expect(loggerStub.warn).toHaveBeenCalledWith(
- "Tried to get Helm repositories, but HELM_REPOSITORY_CACHE was not present in `$ helm env`. Behaving as if there were no repositories.",
+ expect(loggerStub.error).toHaveBeenCalledWith(
+ "Tried to get Helm repositories, but HELM_REPOSITORY_CACHE was not present in `$ helm env`.",
);
});
- it("shows message about no repositories found", () => {
+ it("shows error notification", () => {
+ expect(showErrorNotificationMock).toHaveBeenCalledWith(
+ "Error getting Helm configuration: Tried to get Helm repositories, but HELM_REPOSITORY_CACHE was not present in `$ helm env`.",
+ );
+ });
+
+ it("removes all helm controls", () => {
expect(
- rendered.getByTestId("no-helm-repositories"),
- ).toBeInTheDocument();
+ rendered.queryByTestId("helm-controls"),
+ ).not.toBeInTheDocument();
});
it("does not show loader for repositories anymore", () => {
@@ -149,11 +184,8 @@ describe("listing active helm repositories in preferences", () => {
).not.toBeInTheDocument();
});
- it("does not call for updating of repositories", () => {
- expect(execFileMock).not.toHaveBeenCalledWith(
- "some-helm-binary-path",
- ["repo", "update"],
- );
+ it("renders", () => {
+ expect(rendered.baseElement).toMatchSnapshot();
});
});
@@ -186,6 +218,34 @@ describe("listing active helm repositories in preferences", () => {
expect(readYamlFileMock).not.toHaveBeenCalled();
});
+ describe("when updating repositories reject", () => {
+ beforeEach(async () => {
+ await execFileMock.reject("Some error");
+ });
+
+ it("shows error notification", () => {
+ expect(showErrorNotificationMock).toHaveBeenCalledWith(
+ "Error updating Helm repositories: 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 updating repositories resolve", () => {
beforeEach(async () => {
execFileMock.mockClear();
@@ -196,6 +256,12 @@ describe("listing active helm repositories in preferences", () => {
);
});
+ it("loads repositories from file system", () => {
+ expect(readYamlFileMock).toHaveBeenCalledWith(
+ "some-helm-repository-config-file.yaml",
+ );
+ });
+
describe("when loading repositories resolves with existing repositories", () => {
beforeEach(async () => {
execFileMock.mockClear();
@@ -252,12 +318,6 @@ describe("listing active helm repositories in preferences", () => {
).toBeInTheDocument();
});
- it("does not show message about no repositories", () => {
- expect(
- rendered.queryByTestId("no-helm-repositories"),
- ).not.toBeInTheDocument();
- });
-
it('adds "bitnami" as default repository', () => {
expect(execFileMock).toHaveBeenCalledWith(
"some-helm-binary-path",
@@ -265,6 +325,34 @@ describe("listing active helm repositories in preferences", () => {
);
});
+ 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();
@@ -295,13 +383,6 @@ describe("listing active helm repositories in preferences", () => {
).toBeInTheDocument();
});
- it("does not show message about no repositories", () => {
- expect(
- rendered.queryByTestId("no-helm-repositories"),
- ).not.toBeInTheDocument();
- });
-
-
it("calls for repositories again", () => {
expect(readYamlFileMock).toHaveBeenCalledWith(
"some-helm-repository-config-file.yaml",
@@ -342,12 +423,6 @@ describe("listing active helm repositories in preferences", () => {
expect(actual).toBeInTheDocument();
});
-
- it("does not show message about no repositories", () => {
- expect(
- rendered.queryByTestId("no-helm-repositories"),
- ).not.toBeInTheDocument();
- });
});
});
});
diff --git a/src/common/fs/exec-file.injectable.ts b/src/common/fs/exec-file.injectable.ts
index 8e8f04cffb..510fa025e4 100644
--- a/src/common/fs/exec-file.injectable.ts
+++ b/src/common/fs/exec-file.injectable.ts
@@ -4,18 +4,20 @@
*/
import { getInjectable } from "@ogre-tools/injectable";
import { execFile } from "child_process";
+import { promisify } from "util";
export type ExecFile = (filePath: string, args: string[]) => Promise;
const execFileInjectable = getInjectable({
id: "exec-file",
- instantiate: (): ExecFile => async (filePath, args) =>
- new Promise((resolve) => {
- execFile(filePath, args, (error, stdout) => {
- resolve(stdout);
- });
- }),
+ instantiate: (): ExecFile => async (filePath, args) => {
+ const asyncExecFile = promisify(execFile);
+
+ const result = await asyncExecFile(filePath, args);
+
+ return result.stdout;
+ },
causesSideEffects: true,
});
diff --git a/src/common/helm/activate-helm-repository-channel.injectable.ts b/src/common/helm/activate-helm-repository-channel.injectable.ts
index 81ed44315a..f1b2d4878a 100644
--- a/src/common/helm/activate-helm-repository-channel.injectable.ts
+++ b/src/common/helm/activate-helm-repository-channel.injectable.ts
@@ -6,8 +6,9 @@ import { getInjectable } from "@ogre-tools/injectable";
import type { HelmRepo } from "../helm-repo";
import type { RequestChannel } from "../utils/channel/request-channel-injection-token";
import { requestChannelInjectionToken } from "../utils/channel/request-channel-injection-token";
+import type { AsyncResult } from "../utils/async-result";
-export type ActivateHelmRepositoryChannel = RequestChannel;
+export type ActivateHelmRepositoryChannel = RequestChannel>;
const activateHelmRepositoryChannelInjectable = getInjectable({
id: "activate-helm-repository-channel",
diff --git a/src/common/helm/get-active-helm-repositories-channel.injectable.ts b/src/common/helm/get-active-helm-repositories-channel.injectable.ts
index 7e913f64fb..a5997117cf 100644
--- a/src/common/helm/get-active-helm-repositories-channel.injectable.ts
+++ b/src/common/helm/get-active-helm-repositories-channel.injectable.ts
@@ -6,8 +6,9 @@ import { getInjectable } from "@ogre-tools/injectable";
import type { RequestChannel } from "../utils/channel/request-channel-injection-token";
import type { HelmRepo } from "../helm-repo";
import { requestChannelInjectionToken } from "../utils/channel/request-channel-injection-token";
+import type { AsyncResult } from "../utils/async-result";
-export type GetHelmRepositoriesChannel = RequestChannel;
+export type GetHelmRepositoriesChannel = RequestChannel>;
const getActiveHelmRepositoriesChannelInjectable = getInjectable({
id: "get-active-helm-repositories-channel",
diff --git a/src/common/utils/async-result.ts b/src/common/utils/async-result.ts
new file mode 100644
index 0000000000..4e4f37866e
--- /dev/null
+++ b/src/common/utils/async-result.ts
@@ -0,0 +1,7 @@
+/**
+ * Copyright (c) OpenLens Authors. All rights reserved.
+ * Licensed under MIT License. See LICENSE in root directory for more information.
+ */
+export type AsyncResult =
+ | { callWasSuccessful: true; response: Response }
+ | { callWasSuccessful: false; error: Error };
diff --git a/src/common/utils/get-error-message.ts b/src/common/utils/get-error-message.ts
new file mode 100644
index 0000000000..b5d7dd4244
--- /dev/null
+++ b/src/common/utils/get-error-message.ts
@@ -0,0 +1,15 @@
+/**
+ * Copyright (c) OpenLens Authors. All rights reserved.
+ * Licensed under MIT License. See LICENSE in root directory for more information.
+ */
+export const getErrorMessage = (error: unknown): string => {
+ if (typeof error === "string") {
+ return error;
+ }
+
+ if (error instanceof Error) {
+ return error.message;
+ }
+
+ return JSON.stringify(error);
+};
diff --git a/src/main/helm/exec-helm/exec-helm.injectable.ts b/src/main/helm/exec-helm/exec-helm.injectable.ts
index 9005c95baf..a97953706d 100644
--- a/src/main/helm/exec-helm/exec-helm.injectable.ts
+++ b/src/main/helm/exec-helm/exec-helm.injectable.ts
@@ -5,6 +5,8 @@
import { getInjectable } from "@ogre-tools/injectable";
import execFileInjectable from "../../../common/fs/exec-file.injectable";
import helmBinaryPathInjectable from "../helm-binary-path.injectable";
+import type { AsyncResult } from "../../../common/utils/async-result";
+import { getErrorMessage } from "../../../common/utils/get-error-message";
const execHelmInjectable = getInjectable({
id: "exec-helm",
@@ -13,8 +15,17 @@ const execHelmInjectable = getInjectable({
const execFile = di.inject(execFileInjectable);
const helmBinaryPath = di.inject(helmBinaryPathInjectable);
- return (...args: string[]) => execFile(helmBinaryPath, args);
+ return async (...args: string[]): Promise> => {
+ try {
+ const response = await execFile(helmBinaryPath, args);
+
+ return { callWasSuccessful: true, response };
+ } catch (error) {
+ return { callWasSuccessful: false, error: getErrorMessage(error) };
+ }
+ };
},
});
+
export default execHelmInjectable;
diff --git a/src/main/helm/get-helm-env/get-helm-env.injectable.ts b/src/main/helm/get-helm-env/get-helm-env.injectable.ts
index 5b023d805d..f4bf4cf739 100644
--- a/src/main/helm/get-helm-env/get-helm-env.injectable.ts
+++ b/src/main/helm/get-helm-env/get-helm-env.injectable.ts
@@ -4,6 +4,7 @@
*/
import { getInjectable } from "@ogre-tools/injectable";
import execHelmInjectable from "../exec-helm/exec-helm.injectable";
+import type { AsyncResult } from "../../../common/utils/async-result";
export type HelmEnv = Record & {
HELM_REPOSITORY_CACHE?: string;
@@ -16,10 +17,14 @@ const getHelmEnvInjectable = getInjectable({
instantiate: (di) => {
const execHelm = di.inject(execHelmInjectable);
- return async () => {
- const output = await execHelm("env");
+ return async (): Promise> => {
+ const result = await execHelm("env");
- const lines = output.split(/\r?\n/); // split by new line feed
+ if (!result.callWasSuccessful) {
+ return { callWasSuccessful: false, error: result.error };
+ }
+
+ const lines = result.response.split(/\r?\n/); // split by new line feed
const env: HelmEnv = {};
lines.forEach((line: string) => {
@@ -30,7 +35,7 @@ const getHelmEnvInjectable = getInjectable({
}
});
- return env;
+ return { callWasSuccessful: true, response: env };
};
},
});
diff --git a/src/main/helm/helm-service/list-helm-charts.injectable.ts b/src/main/helm/helm-service/list-helm-charts.injectable.ts
index 963c9c85c4..b537021f0f 100644
--- a/src/main/helm/helm-service/list-helm-charts.injectable.ts
+++ b/src/main/helm/helm-service/list-helm-charts.injectable.ts
@@ -3,6 +3,7 @@
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import { getInjectable } from "@ogre-tools/injectable";
+import assert from "assert";
import { object } from "../../../common/utils";
import { HelmChartManager } from "../helm-chart-manager";
import getActiveHelmRepositoriesInjectable from "../repositories/get-active-helm-repositories/get-active-helm-repositories.injectable";
@@ -14,7 +15,11 @@ const listHelmChartsInjectable = getInjectable({
const getActiveHelmRepositories = di.inject(getActiveHelmRepositoriesInjectable);
return async () => {
- const repositories = await getActiveHelmRepositories();
+ const result = await getActiveHelmRepositories();
+
+ assert(result.callWasSuccessful);
+
+ const repositories = result.response;
return object.fromEntries(
await Promise.all(
diff --git a/src/main/helm/repositories/activate-helm-repository/activate-helm-repository.injectable.ts b/src/main/helm/repositories/activate-helm-repository/activate-helm-repository.injectable.ts
index 2218caf4c2..ad57afd1cb 100644
--- a/src/main/helm/repositories/activate-helm-repository/activate-helm-repository.injectable.ts
+++ b/src/main/helm/repositories/activate-helm-repository/activate-helm-repository.injectable.ts
@@ -54,7 +54,7 @@ const activateHelmRepositoryInjectable = getInjectable({
args.push("--cert-file", certFile);
}
- await execHelm(...args);
+ return await execHelm(...args);
};
},
});
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 107fabfab9..2e9ffa6ed0 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
@@ -10,6 +10,7 @@ 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";
interface HelmRepositoryFromYaml {
name: string;
@@ -38,23 +39,41 @@ const getActiveHelmRepositoriesInjectable = getInjectable({
const getRepositoriesFor = getRepositoriesForFor(readYamlFile);
- return async (): Promise => {
- const { HELM_REPOSITORY_CONFIG: repositoryConfigFilePath, HELM_REPOSITORY_CACHE: helmRepositoryCacheDirPath } = await getHelmEnv();
+ return async (): Promise> => {
+ const envResult = await getHelmEnv();
+
+ if (!envResult.callWasSuccessful) {
+ return {
+ callWasSuccessful: false,
+ error: `Error getting Helm configuration: ${envResult.error}`,
+ };
+ }
+
+ const {
+ HELM_REPOSITORY_CONFIG: repositoryConfigFilePath,
+ HELM_REPOSITORY_CACHE: helmRepositoryCacheDirPath,
+ } = envResult.response;
if (!repositoryConfigFilePath) {
- logger.warn("Tried to get Helm repositories, but HELM_REPOSITORY_CONFIG was not present in `$ helm env`. Behaving as if there were no repositories.");
+ const errorMessage = "Tried to get Helm repositories, but HELM_REPOSITORY_CONFIG was not present in `$ helm env`.";
- return [];
+ logger.error(errorMessage);
+
+ return {
+ callWasSuccessful: false,
+ error: `Error getting Helm configuration: ${errorMessage}`,
+ };
}
if (!helmRepositoryCacheDirPath) {
- logger.warn("Tried to get Helm repositories, but HELM_REPOSITORY_CACHE was not present in `$ helm env`. Behaving as if there were no repositories.");
+ const errorMessage = "Tried to get Helm repositories, but HELM_REPOSITORY_CACHE was not present in `$ helm env`.";
- return [];
- }
+ logger.error(errorMessage);
- if (!repositoryConfigFilePath || !helmRepositoryCacheDirPath) {
- return [];
+ return {
+ callWasSuccessful: false,
+ error: `Error getting Helm configuration: ${errorMessage}`,
+ };
}
const getRepositories = getRepositoriesFor(
@@ -62,17 +81,31 @@ const getActiveHelmRepositoriesInjectable = getInjectable({
helmRepositoryCacheDirPath,
);
- await execHelm("repo", "update");
+ const updateResult = await execHelm("repo", "update");
+
+ if (!updateResult.callWasSuccessful) {
+ return {
+ callWasSuccessful: false,
+ error: `Error updating Helm repositories: ${updateResult.error}`,
+ };
+ }
const repositories = await getRepositories();
if (isEmpty(repositories)) {
- await execHelm("repo", "add", "bitnami", "https://charts.bitnami.com/bitnami");
+ const resultOfAddingDefaultRepository = await execHelm("repo", "add", "bitnami", "https://charts.bitnami.com/bitnami");
- return await getRepositories();
+ if (!resultOfAddingDefaultRepository.callWasSuccessful) {
+ return {
+ callWasSuccessful: false,
+ error: `Error when adding default Helm repository: ${resultOfAddingDefaultRepository.error}`,
+ };
+ }
+
+ return { callWasSuccessful: true, response: await getRepositories() };
}
- return repositories;
+ return { callWasSuccessful: true, response: repositories };
};
},
});
@@ -82,7 +115,7 @@ export default getActiveHelmRepositoriesInjectable;
const getRepositoriesForFor =
(readYamlFile: ReadYamlFile) =>
(repositoryConfigFilePath: string, helmRepositoryCacheDirPath: string) =>
- async () => {
+ async (): Promise => {
const { repositories } = (await readYamlFile(
repositoryConfigFilePath,
)) as HelmRepositoriesFromYaml;
diff --git a/src/main/helm/repositories/get-active-helm-repository.injectable.ts b/src/main/helm/repositories/get-active-helm-repository.injectable.ts
index 169a72914e..548e04b2ec 100644
--- a/src/main/helm/repositories/get-active-helm-repository.injectable.ts
+++ b/src/main/helm/repositories/get-active-helm-repository.injectable.ts
@@ -3,6 +3,7 @@
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import { getInjectable } from "@ogre-tools/injectable";
+import assert from "assert";
import getActiveHelmRepositoriesInjectable from "./get-active-helm-repositories/get-active-helm-repositories.injectable";
const getActiveHelmRepositoryInjectable = getInjectable({
@@ -14,7 +15,9 @@ const getActiveHelmRepositoryInjectable = getInjectable({
return async (name: string) => {
const activeHelmRepositories = await getActiveHelmRepositories();
- return activeHelmRepositories.find(
+ assert(activeHelmRepositories.callWasSuccessful);
+
+ return activeHelmRepositories.response.find(
(repository) => repository.name === name,
);
};
diff --git a/src/renderer/components/+preferences/kubernetes/helm-charts/activation-of-custom-helm-repository/submit-custom-helm-repository.injectable.ts b/src/renderer/components/+preferences/kubernetes/helm-charts/activation-of-custom-helm-repository/submit-custom-helm-repository.injectable.ts
index 4793cd5973..0575faa010 100644
--- a/src/renderer/components/+preferences/kubernetes/helm-charts/activation-of-custom-helm-repository/submit-custom-helm-repository.injectable.ts
+++ b/src/renderer/components/+preferences/kubernetes/helm-charts/activation-of-custom-helm-repository/submit-custom-helm-repository.injectable.ts
@@ -6,7 +6,6 @@ import { getInjectable } from "@ogre-tools/injectable";
import type { HelmRepo } from "../../../../../../common/helm-repo";
import activateHelmRepositoryInjectable from "../activation-of-public-helm-repository/select-helm-repository/activate-helm-repository.injectable";
import hideDialogForActivatingCustomHelmRepositoryInjectable from "./dialog-visibility/hide-dialog-for-activating-custom-helm-repository.injectable";
-import showSuccessNotificationInjectable from "../../../../notifications/show-success-notification.injectable";
const submitCustomHelmRepositoryInjectable = getInjectable({
id: "submit-custom-helm-repository",
@@ -14,13 +13,10 @@ const submitCustomHelmRepositoryInjectable = getInjectable({
instantiate: (di) => {
const activateHelmRepository = di.inject(activateHelmRepositoryInjectable);
const hideDialog = di.inject(hideDialogForActivatingCustomHelmRepositoryInjectable);
- const showSuccessNotification = di.inject(showSuccessNotificationInjectable);
return async (repository: HelmRepo) => {
await activateHelmRepository(repository);
- showSuccessNotification(`Helm repository ${repository.name} has been added.`);
-
hideDialog();
};
},
diff --git a/src/renderer/components/+preferences/kubernetes/helm-charts/activation-of-public-helm-repository/select-helm-repository/activate-helm-repository.injectable.ts b/src/renderer/components/+preferences/kubernetes/helm-charts/activation-of-public-helm-repository/select-helm-repository/activate-helm-repository.injectable.ts
index d96dad99de..d077a5c605 100644
--- a/src/renderer/components/+preferences/kubernetes/helm-charts/activation-of-public-helm-repository/select-helm-repository/activate-helm-repository.injectable.ts
+++ b/src/renderer/components/+preferences/kubernetes/helm-charts/activation-of-public-helm-repository/select-helm-repository/activate-helm-repository.injectable.ts
@@ -7,6 +7,8 @@ import activateHelmRepositoryChannelInjectable from "../../../../../../../common
import type { HelmRepo } from "../../../../../../../common/helm-repo";
import { requestFromChannelInjectionToken } from "../../../../../../../common/utils/channel/request-from-channel-injection-token";
import activeHelmRepositoriesInjectable from "../../active-helm-repositories.injectable";
+import showErrorNotificationInjectable from "../../../../../notifications/show-error-notification.injectable";
+import showSuccessNotificationInjectable from "../../../../../notifications/show-success-notification.injectable";
const activateHelmRepositoryInjectable = getInjectable({
id: "activate-public-helm-repository",
@@ -15,11 +17,24 @@ const activateHelmRepositoryInjectable = getInjectable({
const requestFromChannel = di.inject(requestFromChannelInjectionToken);
const activateHelmRepositoryChannel = di.inject(activateHelmRepositoryChannelInjectable);
const activeHelmRepositories = di.inject(activeHelmRepositoriesInjectable);
+ const showErrorNotification = di.inject(showErrorNotificationInjectable);
+ const showSuccessNotification = di.inject(showSuccessNotificationInjectable);
return async (repository: HelmRepo) => {
- await requestFromChannel(activateHelmRepositoryChannel, repository);
+ const result = await requestFromChannel(
+ activateHelmRepositoryChannel,
+ repository,
+ );
- activeHelmRepositories.invalidate();
+ if (result.callWasSuccessful) {
+ showSuccessNotification(
+ `Helm repository ${repository.name} has been added.`,
+ );
+
+ activeHelmRepositories.invalidate();
+ } else {
+ showErrorNotification(result.error);
+ }
};
},
});
diff --git a/src/renderer/components/+preferences/kubernetes/helm-charts/active-helm-repositories.injectable.ts b/src/renderer/components/+preferences/kubernetes/helm-charts/active-helm-repositories.injectable.ts
index ed8b5e38e0..94fdeaa393 100644
--- a/src/renderer/components/+preferences/kubernetes/helm-charts/active-helm-repositories.injectable.ts
+++ b/src/renderer/components/+preferences/kubernetes/helm-charts/active-helm-repositories.injectable.ts
@@ -4,20 +4,39 @@
*/
import { getInjectable } from "@ogre-tools/injectable";
import { asyncComputed } from "@ogre-tools/injectable-react";
-import requestFromChannelInjectable from "../../../../utils/channel/request-from-channel.injectable";
import getActiveHelmRepositoriesChannelInjectable from "../../../../../common/helm/get-active-helm-repositories-channel.injectable";
+import { requestFromChannelInjectionToken } from "../../../../../common/utils/channel/request-from-channel-injection-token";
+import showErrorNotificationInjectable from "../../../notifications/show-error-notification.injectable";
+import helmRepositoriesErrorStateInjectable from "./helm-repositories-error-state.injectable";
+import { runInAction } from "mobx";
const activeHelmRepositoriesInjectable = getInjectable({
id: "active-helm-repositories",
instantiate: (di) => {
- const requestFromChannel = di.inject(requestFromChannelInjectable);
+ const requestFromChannel = di.inject(requestFromChannelInjectionToken);
const getHelmRepositoriesChannel = di.inject(getActiveHelmRepositoriesChannelInjectable);
+ const showErrorNotification = di.inject(showErrorNotificationInjectable);
+ const helmRepositoriesErrorState = di.inject(helmRepositoriesErrorStateInjectable);
- return asyncComputed(
- async () => await requestFromChannel(getHelmRepositoriesChannel),
- [],
- );
+ return asyncComputed(async () => {
+ const result = await requestFromChannel(getHelmRepositoriesChannel);
+
+ if (result.callWasSuccessful) {
+ return result.response;
+ } else {
+ showErrorNotification(result.error);
+
+ runInAction(() =>
+ helmRepositoriesErrorState.set({
+ controlsAreShown: false,
+ errorMessage: result.error,
+ }),
+ );
+
+ return [];
+ }
+ }, []);
},
});
diff --git a/src/renderer/components/+preferences/kubernetes/helm-charts/helm-charts.tsx b/src/renderer/components/+preferences/kubernetes/helm-charts/helm-charts.tsx
index 93afa1027f..26ebfeef83 100644
--- a/src/renderer/components/+preferences/kubernetes/helm-charts/helm-charts.tsx
+++ b/src/renderer/components/+preferences/kubernetes/helm-charts/helm-charts.tsx
@@ -3,25 +3,59 @@
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
-
import React from "react";
import { HelmRepositories } from "./helm-repositories";
import { ActivationOfPublicHelmRepository } from "./activation-of-public-helm-repository/activation-of-public-helm-repository";
import { ActivationOfCustomHelmRepositoryOpenButton } from "./activation-of-custom-helm-repository/activation-of-custom-helm-repository-open-button";
import { ActivationOfCustomHelmRepositoryDialog } from "./activation-of-custom-helm-repository/activation-of-custom-helm-repository-dialog";
+import { withInjectables } from "@ogre-tools/injectable-react";
+import type { HelmRepositoriesErrorState } from "./helm-repositories-error-state.injectable";
+import helmRepositoriesErrorStateInjectable from "./helm-repositories-error-state.injectable";
+import type { IObservableValue } from "mobx";
+import { observer } from "mobx-react";
+import { Notice } from "../../../+extensions/notice";
-export const HelmCharts = () => (
-