import "./deployments.scss"; import React from "react"; import { observer } from "mobx-react"; import { RouteComponentProps } from "react-router"; import { t, Trans } from "@lingui/macro"; 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"; import { nodesStore } from "../+nodes/nodes.store"; import { eventStore } from "../+events/event.store"; import { KubeObjectListLayout } from "../kube-object"; import { IDeploymentsRouteParams } from "../+workloads"; import { _i18n } from "../../i18n"; import { cssNames } from "../../utils"; import kebabCase from "lodash/kebabCase"; import orderBy from "lodash/orderBy"; import { kubeObjectMenuRegistry } from "../../../extensions/registries/kube-object-menu-registry"; import { KubeObjectStatusIcon } from "../kube-object-status-icon"; import { Notifications } from "../notifications"; enum sortBy { name = "name", namespace = "namespace", replicas = "replicas", age = "age", condition = "condition", } interface Props extends RouteComponentProps { } @observer export class Deployments extends React.Component { renderPods(deployment: Deployment) { const { replicas, availableReplicas } = deployment.status; return `${availableReplicas || 0}/${replicas || 0}`; } renderConditions(deployment: Deployment) { const conditions = orderBy(deployment.getConditions(true), "type", "asc"); return conditions.map(({ type, message }) => ( {type} )); } render() { return ( deployment.getName(), [sortBy.namespace]: (deployment: Deployment) => deployment.getNs(), [sortBy.replicas]: (deployment: Deployment) => deployment.getReplicas(), [sortBy.age]: (deployment: Deployment) => deployment.metadata.creationTimestamp, [sortBy.condition]: (deployment: Deployment) => deployment.getConditionsText(), }} searchFilters={[ (deployment: Deployment) => deployment.getSearchFields(), (deployment: Deployment) => deployment.getConditionsText(), ]} renderHeaderTitle={Deployments} renderTableHeader={[ { title: Name, className: "name", sortBy: sortBy.name }, { className: "warning" }, { title: Namespace, className: "namespace", sortBy: sortBy.namespace }, { title: Pods, className: "pods" }, { title: Replicas, className: "replicas", sortBy: sortBy.replicas }, { title: Age, className: "age", sortBy: sortBy.age }, { title: Conditions, className: "conditions", sortBy: sortBy.condition }, ]} renderTableContents={(deployment: Deployment) => [ deployment.getName(), , deployment.getNs(), this.renderPods(deployment), deployment.getReplicas(), deployment.getAge(), this.renderConditions(deployment), ]} renderItemMenu={(item: Deployment) => { return ; }} /> ); } } export function DeploymentMenu(props: KubeObjectMenuProps) { const { object, toolbar } = props; return ( <> 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
); } kubeObjectMenuRegistry.add({ kind: "Deployment", apiVersions: ["apps/v1"], components: { MenuItem: DeploymentMenu } });