1
0
mirror of https://github.com/lensapp/lens.git synced 2025-05-20 05:10:56 +00:00

Cleanup and show error message

Signed-off-by: Sebastian Malton <sebastian@malton.name>
This commit is contained in:
Sebastian Malton 2022-09-06 11:43:31 -04:00
parent dde628b027
commit 2a7788bcf9
7 changed files with 53 additions and 55 deletions

View File

@ -16,8 +16,7 @@ const navigateToHelmReleasesInjectable = getInjectable({
const navigateToRoute = di.inject(navigateToRouteInjectionToken); const navigateToRoute = di.inject(navigateToRouteInjectionToken);
const route = di.inject(helmReleasesRouteInjectable); const route = di.inject(helmReleasesRouteInjectable);
return (parameters) => return (parameters) => navigateToRoute(route, { parameters });
navigateToRoute(route, { parameters });
}, },
}); });

View File

@ -5388,8 +5388,7 @@ exports[`showing details for helm release given application is started when navi
<span <span
class="value" class="value"
> >
NaNy NaNy ago (some-updated)
ago (some-updated)
</span> </span>
</div> </div>
<div <div
@ -6613,8 +6612,7 @@ exports[`showing details for helm release given application is started when navi
<span <span
class="value" class="value"
> >
NaNy NaNy ago (some-updated)
ago (some-updated)
</span> </span>
</div> </div>
<div <div
@ -7838,8 +7836,7 @@ exports[`showing details for helm release given application is started when navi
<span <span
class="value" class="value"
> >
NaNy NaNy ago (some-updated)
ago (some-updated)
</span> </span>
</div> </div>
<div <div
@ -8890,8 +8887,7 @@ exports[`showing details for helm release given application is started when navi
<span <span
class="value" class="value"
> >
NaNy NaNy ago (some-updated)
ago (some-updated)
</span> </span>
</div> </div>
<div <div
@ -9942,8 +9938,7 @@ exports[`showing details for helm release given application is started when navi
<span <span
class="value" class="value"
> >
NaNy NaNy ago (some-updated)
ago (some-updated)
</span> </span>
</div> </div>
<div <div
@ -11169,8 +11164,7 @@ exports[`showing details for helm release given application is started when navi
<span <span
class="value" class="value"
> >
NaNy NaNy ago (some-updated)
ago (some-updated)
</span> </span>
</div> </div>
<div <div
@ -13273,7 +13267,9 @@ exports[`showing details for helm release given application is started when navi
<div <div
data-testid="helm-release-detail-error" data-testid="helm-release-detail-error"
> >
Failed to load release Failed to load release:
some-error
</div> </div>
</div> </div>
</div> </div>

View File

@ -6,12 +6,7 @@ import { getInjectable } from "@ogre-tools/injectable";
import type { AsyncResult } from "../../../../../common/utils/async-result"; import type { AsyncResult } from "../../../../../common/utils/async-result";
import execHelmInjectable from "../../../exec-helm/exec-helm.injectable"; import execHelmInjectable from "../../../exec-helm/exec-helm.injectable";
import yaml from "js-yaml"; import yaml from "js-yaml";
import type { KubeJsonApiData } from "../../../../../common/k8s-api/kube-json-api";
export interface HelmResourceManifest {
metadata: {
namespace: string;
};
}
const callForHelmManifestInjectable = getInjectable({ const callForHelmManifestInjectable = getInjectable({
id: "call-for-helm-manifest", id: "call-for-helm-manifest",
@ -23,7 +18,7 @@ const callForHelmManifestInjectable = getInjectable({
name: string, name: string,
namespace: string, namespace: string,
kubeconfigPath: string, kubeconfigPath: string,
): Promise<AsyncResult<HelmResourceManifest[]>> => { ): Promise<AsyncResult<KubeJsonApiData[]>> => {
const result = await execHelm( const result = await execHelm(
"get", "get",
"manifest", "manifest",
@ -42,7 +37,7 @@ const callForHelmManifestInjectable = getInjectable({
callWasSuccessful: true, callWasSuccessful: true,
response: yaml response: yaml
.loadAll(result.response) .loadAll(result.response)
.filter((manifest) => !!manifest) as HelmResourceManifest[], .filter((manifest) => !!manifest) as KubeJsonApiData[],
}; };
}; };

View File

@ -10,13 +10,13 @@ import execFileWithInputInjectable from "./exec-file-with-input/exec-file-with-i
import { getErrorMessage } from "../../../../../common/utils/get-error-message"; import { getErrorMessage } from "../../../../../common/utils/get-error-message";
import { map } from "lodash/fp"; import { map } from "lodash/fp";
import { pipeline } from "@ogre-tools/fp"; import { pipeline } from "@ogre-tools/fp";
import type { HelmResourceManifest } from "../call-for-helm-manifest/call-for-helm-manifest.injectable"; import type { KubeJsonApiData } from "../../../../../common/k8s-api/kube-json-api";
export type CallForKubeResourcesByManifest = ( export type CallForKubeResourcesByManifest = (
namespace: string, namespace: string,
kubeconfigPath: string, kubeconfigPath: string,
kubectlPath: string, kubectlPath: string,
resourceManifests: HelmResourceManifest[] resourceManifests: KubeJsonApiData[]
) => Promise<JsonObject[]>; ) => Promise<JsonObject[]>;
const callForKubeResourcesByManifestInjectable = getInjectable({ const callForKubeResourcesByManifestInjectable = getInjectable({

View File

@ -34,10 +34,16 @@ interface Dependencies {
} }
const NonInjectedReleaseDetailsContent = observer(({ model }: Dependencies & ReleaseDetailsContentProps) => { const NonInjectedReleaseDetailsContent = observer(({ model }: Dependencies & ReleaseDetailsContentProps) => {
const failedToLoad = model.failedToLoad.get(); const loadingError = model.loadingError.get();
if (failedToLoad) { if (loadingError) {
return <div data-testid="helm-release-detail-error">Failed to load release</div>; return (
<div data-testid="helm-release-detail-error">
Failed to load release:
{" "}
{loadingError}
</div>
);
} }
@ -58,8 +64,7 @@ const NonInjectedReleaseDetailsContent = observer(({ model }: Dependencies & Rel
</DrawerItem> </DrawerItem>
<DrawerItem name="Updated"> <DrawerItem name="Updated">
{model.release.getUpdated()} {`${model.release.getUpdated()} ago (${model.release.updated})`}
{` ago (${model.release.updated})`}
</DrawerItem> </DrawerItem>
<DrawerItem name="Namespace">{model.release.getNs()}</DrawerItem> <DrawerItem name="Namespace">{model.release.getNs()}</DrawerItem>

View File

@ -21,19 +21,23 @@ interface ReleaseDetailsDrawerProps {
interface Dependencies { interface Dependencies {
model: ReleaseDetailsModel; model: ReleaseDetailsModel;
closeDrawer: () => void; navigateToHelmReleases: () => void;
} }
const NonInjectedReleaseDetailsDrawerToolbar = observer( const NonInjectedReleaseDetailsDrawerToolbar = observer(({
({ model, closeDrawer }: Dependencies & ReleaseDetailsDrawerProps) => model,
model.failedToLoad.get() ? null : ( navigateToHelmReleases,
}: Dependencies & ReleaseDetailsDrawerProps) => (
model.loadingError.get()
? null
: (
<HelmReleaseMenu <HelmReleaseMenu
release={model.release} release={model.release}
toolbar toolbar
hideDetails={closeDrawer} hideDetails={navigateToHelmReleases}
/> />
), )
); ));
export const ReleaseDetailsDrawerToolbar = withInjectables< export const ReleaseDetailsDrawerToolbar = withInjectables<
Dependencies, Dependencies,
@ -43,7 +47,7 @@ export const ReleaseDetailsDrawerToolbar = withInjectables<
getProps: async (di, props) => ({ getProps: async (di, props) => ({
model: await di.inject(releaseDetailsModelInjectable, props.targetRelease), model: await di.inject(releaseDetailsModelInjectable, props.targetRelease),
closeDrawer: di.inject(navigateToHelmReleasesInjectable), navigateToHelmReleases: di.inject(navigateToHelmReleasesInjectable),
...props, ...props,
}), }),
}); });

View File

@ -54,7 +54,7 @@ const releaseDetailsModelInjectable = getInjectable({
showCheckedErrorNotification, showCheckedErrorNotification,
showSuccessNotification, showSuccessNotification,
createUpgradeChartTab, createUpgradeChartTab,
closeDrawer: navigateToHelmReleases, navigateToHelmReleases,
}); });
await model.load(); await model.load();
@ -63,47 +63,46 @@ const releaseDetailsModelInjectable = getInjectable({
}, },
lifecycle: lifecycleEnum.keyedSingleton({ lifecycle: lifecycleEnum.keyedSingleton({
getInstanceKey: (di, release: TargetHelmRelease) => getInstanceKey: (di, release: TargetHelmRelease) => `${release.namespace}/${release.name}`,
`${release.namespace}/${release.name}`,
}), }),
}); });
export default releaseDetailsModelInjectable; export default releaseDetailsModelInjectable;
export interface OnlyUserSuppliedValuesAreShownToggle { export interface OnlyUserSuppliedValuesAreShownToggle {
value: IObservableValue<boolean>; readonly value: IObservableValue<boolean>;
toggle: () => Promise<void>; toggle: () => Promise<void>;
} }
export interface ConfigurationInput { export interface ConfigurationInput {
nonSavedValue: IObservableValue<string>; readonly nonSavedValue: IObservableValue<string>;
isLoading: IObservableValue<boolean>; readonly isLoading: IObservableValue<boolean>;
isSaving: IObservableValue<boolean>; readonly isSaving: IObservableValue<boolean>;
onChange: (value: string) => void; onChange: (value: string) => void;
save: () => Promise<void>; save: () => Promise<void>;
} }
interface Dependencies { interface Dependencies {
readonly targetRelease: TargetHelmRelease;
readonly activeTheme: IComputedValue<LensTheme>;
callForHelmRelease: CallForHelmRelease; callForHelmRelease: CallForHelmRelease;
targetRelease: TargetHelmRelease;
activeTheme: IComputedValue<LensTheme>;
callForHelmReleaseConfiguration: CallForHelmReleaseConfiguration; callForHelmReleaseConfiguration: CallForHelmReleaseConfiguration;
getResourceDetailsUrl: GetResourceDetailsUrl; getResourceDetailsUrl: GetResourceDetailsUrl;
updateRelease: CallForHelmReleaseUpdate; updateRelease: CallForHelmReleaseUpdate;
showCheckedErrorNotification: ShowCheckedErrorNotification; showCheckedErrorNotification: ShowCheckedErrorNotification;
showSuccessNotification: ShowNotification; showSuccessNotification: ShowNotification;
createUpgradeChartTab: (release: HelmRelease) => string; createUpgradeChartTab: (release: HelmRelease) => string;
closeDrawer: () => void; navigateToHelmReleases: () => void;
} }
export class ReleaseDetailsModel { export class ReleaseDetailsModel {
id = `${this.dependencies.targetRelease.namespace}/${this.dependencies.targetRelease.name}`; readonly id = `${this.dependencies.targetRelease.namespace}/${this.dependencies.targetRelease.name}`;
constructor(private dependencies: Dependencies) {} constructor(private readonly dependencies: Dependencies) {}
private detailedRelease = observable.box<DetailedHelmRelease | undefined>(); private readonly detailedRelease = observable.box<DetailedHelmRelease | undefined>();
readonly failedToLoad = observable.box(false); readonly loadingError = observable.box<string>();
readonly configuration: ConfigurationInput = { readonly configuration: ConfigurationInput = {
nonSavedValue: observable.box(""), nonSavedValue: observable.box(""),
@ -179,7 +178,7 @@ export class ReleaseDetailsModel {
if (!result.callWasSuccessful) { if (!result.callWasSuccessful) {
runInAction(() => { runInAction(() => {
this.failedToLoad.set(true); this.loadingError.set(result.error);
}); });
return; return;
@ -257,13 +256,13 @@ export class ReleaseDetailsModel {
} }
close = () => { close = () => {
this.dependencies.closeDrawer(); this.dependencies.navigateToHelmReleases();
}; };
startUpgradeProcess = () => { startUpgradeProcess = () => {
this.dependencies.createUpgradeChartTab(this.release); this.dependencies.createUpgradeChartTab(this.release);
this.dependencies.closeDrawer(); this.dependencies.navigateToHelmReleases();
}; };
} }