From fd63f2f4e3752222a362dbe0d28bdfe01c219169 Mon Sep 17 00:00:00 2001 From: Violetta <38247153+vshakirova@users.noreply.github.com> Date: Tue, 29 Dec 2020 19:19:23 +0400 Subject: [PATCH] Add suspend/resume button for CronJobs (#1860) Signed-off-by: vshakirova --- src/renderer/api/api-manager.ts | 2 +- src/renderer/api/endpoints/cron-job.api.ts | 38 +++++++++++++- .../+workloads-cronjobs/cronjobs.tsx | 52 +++++++++++++++++-- 3 files changed, 85 insertions(+), 7 deletions(-) diff --git a/src/renderer/api/api-manager.ts b/src/renderer/api/api-manager.ts index db06077f0b..629a0f29c2 100644 --- a/src/renderer/api/api-manager.ts +++ b/src/renderer/api/api-manager.ts @@ -18,7 +18,7 @@ export class ApiManager { } getApiByKind(kind: string, apiVersion: string) { - return Array.from(this.apis.values()).find((api) => api.kind === kind && api.apiVersion === apiVersion); + return Array.from(this.apis.values()).find((api) => api.kind === kind && api.apiVersionWithGroup === apiVersion); } registerApi(apiBase: string, api: KubeApi) { diff --git a/src/renderer/api/endpoints/cron-job.api.ts b/src/renderer/api/endpoints/cron-job.api.ts index 6669f34736..5063fbd66c 100644 --- a/src/renderer/api/endpoints/cron-job.api.ts +++ b/src/renderer/api/endpoints/cron-job.api.ts @@ -5,6 +5,38 @@ import { formatDuration } from "../../utils/formatDuration"; import { autobind } from "../../utils"; import { KubeApi } from "../kube-api"; +export class CronJobApi extends KubeApi { + suspend(params: { namespace: string; name: string }) { + return this.request.patch(this.getUrl(params), { + data: { + spec: { + suspend: true + } + } + }, + { + headers: { + "content-type": "application/strategic-merge-patch+json" + } + }); + } + + resume(params: { namespace: string; name: string }) { + return this.request.patch(this.getUrl(params), { + data: { + spec: { + suspend: false + } + } + }, + { + headers: { + "content-type": "application/strategic-merge-patch+json" + } + }); + } +} + @autobind() export class CronJob extends KubeObject { static kind = "CronJob"; @@ -90,8 +122,12 @@ export class CronJob extends KubeObject { return day > daysInMonth[month - 1]; } + + isSuspend() { + return this.spec.suspend; + } } -export const cronJobApi = new KubeApi({ +export const cronJobApi = new CronJobApi({ objectConstructor: CronJob, }); diff --git a/src/renderer/components/+workloads-cronjobs/cronjobs.tsx b/src/renderer/components/+workloads-cronjobs/cronjobs.tsx index 6e5f05b61a..19d35e4b3a 100644 --- a/src/renderer/components/+workloads-cronjobs/cronjobs.tsx +++ b/src/renderer/components/+workloads-cronjobs/cronjobs.tsx @@ -3,7 +3,7 @@ import "./cronjobs.scss"; import React from "react"; import { observer } from "mobx-react"; import { RouteComponentProps } from "react-router"; -import { CronJob } from "../../api/endpoints/cron-job.api"; +import { CronJob, cronJobApi } from "../../api/endpoints/cron-job.api"; import { MenuItem } from "../menu"; import { Icon } from "../icon"; import { cronJobStore } from "./cronjob.store"; @@ -15,6 +15,8 @@ import { KubeObjectListLayout } from "../kube-object"; import { CronJobTriggerDialog } from "./cronjob-trigger-dialog"; import { kubeObjectMenuRegistry } from "../../../extensions/registries/kube-object-menu-registry"; import { KubeObjectStatusIcon } from "../kube-object-status-icon"; +import { ConfirmDialog } from "../confirm-dialog/confirm-dialog"; +import { Notifications } from "../notifications/notifications"; enum sortBy { name = "name", @@ -80,10 +82,50 @@ export function CronJobMenu(props: KubeObjectMenuProps) { const { object, toolbar } = props; return ( - CronJobTriggerDialog.open(object)}> - - Trigger - + <> + CronJobTriggerDialog.open(object)}> + + Trigger + + + {object.isSuspend() ? + ConfirmDialog.open({ + ok: async () => { + try { + await cronJobApi.resume({ namespace: object.getNs(), name: object.getName() }); + } catch (err) { + Notifications.error(err); + } + }, + labelOk: `Resume`, + message: ( +

+ Resume CronJob {object.getName()}? +

), + })}> + + Resume +
+ + : ConfirmDialog.open({ + ok: async () => { + try { + await cronJobApi.suspend({ namespace: object.getNs(), name: object.getName() }); + } catch (err) { + Notifications.error(err); + } + }, + labelOk: `Suspend`, + message: ( +

+ Suspend CronJob {object.getName()}? +

), + })}> + + Suspend +
+ } + ); }