From 5c34d65de8fa20e5dce75b0081036ab778862665 Mon Sep 17 00:00:00 2001 From: Sebastian Malton Date: Thu, 10 Nov 2022 05:34:58 -0800 Subject: [PATCH] Fix cron jobs not being viewable on newer kube (#6542) * Replace use of legacy globals with injectables Signed-off-by: Sebastian Malton * Remove dead code Signed-off-by: Sebastian Malton * Fix error shown to users when load fails Signed-off-by: Sebastian Malton * Switch CronJob default apiBase Signed-off-by: Sebastian Malton Signed-off-by: Sebastian Malton --- .../endpoints/cron-job.api.injectable.ts | 7 +++- src/common/k8s-api/endpoints/cron-job.api.ts | 2 +- src/common/k8s-api/kube-object.store.ts | 8 ++--- .../+workloads-cronjobs/cronjobs.tsx | 32 ++++++++++++++++--- .../+workloads-cronjobs/legacy-store.ts | 12 ------- 5 files changed, 37 insertions(+), 24 deletions(-) delete mode 100644 src/renderer/components/+workloads-cronjobs/legacy-store.ts diff --git a/src/common/k8s-api/endpoints/cron-job.api.injectable.ts b/src/common/k8s-api/endpoints/cron-job.api.injectable.ts index a22909861e..252dcd624e 100644 --- a/src/common/k8s-api/endpoints/cron-job.api.injectable.ts +++ b/src/common/k8s-api/endpoints/cron-job.api.injectable.ts @@ -13,7 +13,12 @@ const cronJobApiInjectable = getInjectable({ instantiate: (di) => { assert(di.inject(storesAndApisCanBeCreatedInjectionToken), "cronJobApi is only available in certain environments"); - return new CronJobApi(); + return new CronJobApi({ + fallbackApiBases: [ + "/apis/batch/v1beta1/cronjobs", + ], + checkPreferredVersion: true, + }); }, injectionToken: kubeApiInjectionToken, diff --git a/src/common/k8s-api/endpoints/cron-job.api.ts b/src/common/k8s-api/endpoints/cron-job.api.ts index 131b632589..7dad6a857d 100644 --- a/src/common/k8s-api/endpoints/cron-job.api.ts +++ b/src/common/k8s-api/endpoints/cron-job.api.ts @@ -73,7 +73,7 @@ export class CronJob extends KubeObject< > { static readonly kind = "CronJob"; static readonly namespaced = true; - static readonly apiBase = "/apis/batch/v1beta1/cronjobs"; + static readonly apiBase = "/apis/batch/v1/cronjobs"; getSuspendFlag() { return (this.spec.suspend ?? false).toString(); diff --git a/src/common/k8s-api/kube-object.store.ts b/src/common/k8s-api/kube-object.store.ts index 0856176a59..32a762a74c 100644 --- a/src/common/k8s-api/kube-object.store.ts +++ b/src/common/k8s-api/kube-object.store.ts @@ -7,7 +7,7 @@ import type { ClusterContext } from "./cluster-context"; import { action, computed, makeObservable, observable, reaction, when } from "mobx"; import type { Disposer } from "../utils"; -import { waitUntilDefined, autoBind, includes, isRequestError, noop, rejectPromiseBy } from "../utils"; +import { waitUntilDefined, autoBind, includes, noop, rejectPromiseBy } from "../utils"; import type { KubeJsonApiDataFor, KubeObject } from "./kube-object"; import { KubeStatus } from "./kube-object"; import type { IKubeWatchEvent } from "./kube-watch-event"; @@ -221,11 +221,7 @@ export abstract class KubeObjectStore< try { return await res ?? []; } catch (error) { - onLoadFailure(( - isRequestError(error) - ? error.message || error.toString() - : "Unknown error" - )); + onLoadFailure(String(error)); // reset the store because we are loading all, so that nothing is displayed this.items.clear(); diff --git a/src/renderer/components/+workloads-cronjobs/cronjobs.tsx b/src/renderer/components/+workloads-cronjobs/cronjobs.tsx index f6c13ba6c0..24eff99303 100644 --- a/src/renderer/components/+workloads-cronjobs/cronjobs.tsx +++ b/src/renderer/components/+workloads-cronjobs/cronjobs.tsx @@ -7,14 +7,18 @@ import "./cronjobs.scss"; import React from "react"; import { observer } from "mobx-react"; -import { cronJobStore } from "./legacy-store"; -import { jobStore } from "../+workloads-jobs/legacy-store"; -import { eventStore } from "../+events/legacy-store"; import { KubeObjectListLayout } from "../kube-object-list-layout"; import { KubeObjectStatusIcon } from "../kube-object-status-icon"; import moment from "moment"; import { SiblingsInTabLayout } from "../layout/siblings-in-tab-layout"; import { KubeObjectAge } from "../kube-object/age"; +import type { CronJobStore } from "./store"; +import type { JobStore } from "../+workloads-jobs/store"; +import type { EventStore } from "../+events/store"; +import { withInjectables } from "@ogre-tools/injectable-react"; +import cronJobStoreInjectable from "./store.injectable"; +import jobStoreInjectable from "../+workloads-jobs/store.injectable"; +import eventStoreInjectable from "../+events/store.injectable"; enum columnId { name = "name", @@ -26,9 +30,21 @@ enum columnId { age = "age", } +interface Dependencies { + cronJobStore: CronJobStore; + jobStore: JobStore; + eventStore: EventStore; +} + @observer -export class CronJobs extends React.Component { +class NonInjectedCronJobs extends React.Component{ render() { + const { + cronJobStore, + eventStore, + jobStore, + } = this.props; + return ( (NonInjectedCronJobs, { + getProps: (di, props) => ({ + cronJobStore: di.inject(cronJobStoreInjectable), + eventStore: di.inject(eventStoreInjectable), + jobStore: di.inject(jobStoreInjectable), + ...props, + }), +}); diff --git a/src/renderer/components/+workloads-cronjobs/legacy-store.ts b/src/renderer/components/+workloads-cronjobs/legacy-store.ts deleted file mode 100644 index 880f8f5b0e..0000000000 --- a/src/renderer/components/+workloads-cronjobs/legacy-store.ts +++ /dev/null @@ -1,12 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import { asLegacyGlobalForExtensionApi } from "../../../extensions/as-legacy-globals-for-extension-api/as-legacy-global-object-for-extension-api"; -import cronJobStoreInjectable from "./store.injectable"; - -/** - * @deprecated use `di.inject(cronJobStoreInjectable)` instead - */ -export const cronJobStore = asLegacyGlobalForExtensionApi(cronJobStoreInjectable);