diff --git a/locales/en/messages.po b/locales/en/messages.po index c062c63db1..220b5c93a8 100644 --- a/locales/en/messages.po +++ b/locales/en/messages.po @@ -549,6 +549,14 @@ msgstr "Condition" msgid "Conditions" msgstr "Conditions" +#: src/renderer/components/+workloads-deployments/deployments.tsx: 118 +msgid "Restart" +msgstr "Restart" + +#: src/renderer/components/+workloads-deployments/deployments.tsx: 121 +msgid "Are you sure you want to restart deployment <0>{0}?" +msgstr "Are you sure you want to restart deployment <0>{0}?" + #: src/renderer/components/+config-maps/config-maps.tsx:33 msgid "Config Maps" msgstr "Config Maps" diff --git a/locales/fi/messages.po b/locales/fi/messages.po index ee19bf5187..ac1c8902a0 100644 --- a/locales/fi/messages.po +++ b/locales/fi/messages.po @@ -545,6 +545,14 @@ msgstr "" msgid "Conditions" msgstr "" +#: src/renderer/components/+workloads-deployments/deployments.tsx: 118 +msgid "Restart" +msgstr "" + +#: src/renderer/components/+workloads-deployments/deployments.tsx: 121 +msgid "Are you sure you want to restart deployment <0>{0}?" +msgstr "" + #: src/renderer/components/+config-maps/config-maps.tsx:33 msgid "Config Maps" msgstr "" diff --git a/locales/ru/messages.po b/locales/ru/messages.po index 01b8d777a3..9b4fbc99ba 100644 --- a/locales/ru/messages.po +++ b/locales/ru/messages.po @@ -550,6 +550,14 @@ msgstr "Состояние" msgid "Conditions" msgstr "Состояния" +#: src/renderer/components/+workloads-deployments/deployments.tsx: 118 +msgid "Restart" +msgstr "Перезагрузка" + +#: src/renderer/components/+workloads-deployments/deployments.tsx: 121 +msgid "Are you sure you want to restart deployment <0>{0}?" +msgstr "Выполнить перезагрузку деплоймента <0>{0}?" + #: src/renderer/components/+config-maps/config-maps.tsx:33 msgid "Config Maps" msgstr "" diff --git a/src/renderer/api/endpoints/deployment.api.ts b/src/renderer/api/endpoints/deployment.api.ts index 25164e10f9..b21495ecc1 100644 --- a/src/renderer/api/endpoints/deployment.api.ts +++ b/src/renderer/api/endpoints/deployment.api.ts @@ -1,3 +1,5 @@ +import moment from "moment"; + import { IAffinity, WorkloadKubeObject } from "../workload-kube-object"; import { autobind } from "../../utils"; import { KubeApi } from "../kube-api"; @@ -23,6 +25,25 @@ export class DeploymentApi extends KubeApi { } }) } + + restart(params: { namespace: string; name: string }) { + return this.request.patch(this.getUrl(params), { + data: { + spec: { + template: { + metadata: { + annotations: {"kubectl.kubernetes.io/restartedAt" : moment.utc().format()} + } + } + } + } + }, + { + headers: { + 'content-type': 'application/strategic-merge-patch+json' + } + }) + } } @autobind() @@ -38,6 +59,7 @@ export class Deployment extends WorkloadKubeObject { metadata: { creationTimestamp?: string; labels: { [app: string]: string }; + annotations?: { [app: string]: string }; }; spec: { containers: { diff --git a/src/renderer/api/json-api.ts b/src/renderer/api/json-api.ts index 027c201175..e42996c041 100644 --- a/src/renderer/api/json-api.ts +++ b/src/renderer/api/json-api.ts @@ -64,7 +64,7 @@ export class JsonApi { } patch(path: string, params?: P, reqInit: RequestInit = {}) { - return this.request(path, params, { ...reqInit, method: "patch" }); + return this.request(path, params, { ...reqInit, method: "PATCH" }); } del(path: string, params?: P, reqInit: RequestInit = {}) { diff --git a/src/renderer/components/+workloads-deployments/deployments.tsx b/src/renderer/components/+workloads-deployments/deployments.tsx index a7b9a01ab4..39047bf62a 100644 --- a/src/renderer/components/+workloads-deployments/deployments.tsx +++ b/src/renderer/components/+workloads-deployments/deployments.tsx @@ -4,11 +4,12 @@ import React from "react"; import { observer } from "mobx-react"; import { RouteComponentProps } from "react-router"; import { t, Trans } from "@lingui/macro"; -import { Deployment } from "../../api/endpoints"; +import { Deployment, deploymentApi } from "../../api/endpoints"; import { KubeObjectMenuProps } from "../kube-object/kube-object-menu"; import { MenuItem } from "../menu"; import { Icon } from "../icon"; import { DeploymentScaleDialog } from "./deployment-scale-dialog"; +import { ConfirmDialog } from "../confirm-dialog"; import { deploymentStore } from "./deployments.store"; import { replicaSetStore } from "../+workloads-replicasets/replicasets.store"; import { podsStore } from "../+workloads-pods/pods.store"; @@ -22,6 +23,8 @@ import kebabCase from "lodash/kebabCase"; import orderBy from "lodash/orderBy"; import { KubeEventIcon } from "../+events/kube-event-icon"; import { kubeObjectMenuRegistry } from "../../../extensions/registries/kube-object-menu-registry"; +import { apiManager } from "../../api/api-manager"; +import { Notifications } from "../notifications"; enum sortBy { name = "name", @@ -96,10 +99,34 @@ export class Deployments extends React.Component { export function DeploymentMenu(props: KubeObjectMenuProps) { const { object, toolbar } = props; return ( - DeploymentScaleDialog.open(object)}> - - Scale - + <> + DeploymentScaleDialog.open(object)}> + + Scale + + ConfirmDialog.open({ + ok: async () => + { + try { + await deploymentApi.restart({ + namespace: object.getNs(), + name: object.getName(), + }) + } catch (err) { + Notifications.error(err); + } + }, + labelOk: _i18n._(t`Restart`), + message: ( +

+ Are you sure you want to restart deployment {object.getName()}? +

+ ), + })}> + + Restart +
+ ) } @@ -110,4 +137,3 @@ kubeObjectMenuRegistry.add({ MenuItem: DeploymentMenu } }) -