mirror of
https://github.com/lensapp/lens.git
synced 2025-05-20 05:10:56 +00:00
cleanup
Signed-off-by: Jari Kolehmainen <jari.kolehmainen@gmail.com>
This commit is contained in:
parent
56f1d19ca4
commit
950ce37826
@ -1,4 +1,3 @@
|
|||||||
export * from "./nodes"
|
export * from "./nodes"
|
||||||
export * from "./nodes.route"
|
export * from "./nodes.route"
|
||||||
export * from "./node-menu"
|
export * from "./node-details"
|
||||||
export * from "./node-details"
|
|
||||||
|
|||||||
@ -1,78 +0,0 @@
|
|||||||
import React from "react";
|
|
||||||
import { t, Trans } from "@lingui/macro";
|
|
||||||
import { Node } from "../../api/endpoints/nodes.api";
|
|
||||||
import { createTerminalTab, terminalStore } from "../dock/terminal.store";
|
|
||||||
import { KubeObjectMenu, KubeObjectMenuProps } from "../kube-object/kube-object-menu";
|
|
||||||
import { ConfirmDialog } from "../confirm-dialog";
|
|
||||||
import { MenuItem } from "../menu";
|
|
||||||
import { Icon } from "../icon";
|
|
||||||
import { _i18n } from "../../i18n";
|
|
||||||
import { hideDetails } from "../../navigation";
|
|
||||||
|
|
||||||
export function NodeMenu(props: KubeObjectMenuProps<Node>) {
|
|
||||||
const { object: node, toolbar } = props;
|
|
||||||
if (!node) return null;
|
|
||||||
const nodeName = node.getName();
|
|
||||||
|
|
||||||
const sendToTerminal = (command: string) => {
|
|
||||||
terminalStore.sendCommand(command, {
|
|
||||||
enter: true,
|
|
||||||
newTab: true,
|
|
||||||
});
|
|
||||||
hideDetails();
|
|
||||||
}
|
|
||||||
|
|
||||||
const shell = () => {
|
|
||||||
createTerminalTab({
|
|
||||||
title: _i18n._(t`Node`) + `: ${nodeName}`,
|
|
||||||
node: nodeName,
|
|
||||||
});
|
|
||||||
hideDetails();
|
|
||||||
}
|
|
||||||
|
|
||||||
const cordon = () => {
|
|
||||||
sendToTerminal(`kubectl cordon ${nodeName}`);
|
|
||||||
}
|
|
||||||
|
|
||||||
const unCordon = () => {
|
|
||||||
sendToTerminal(`kubectl uncordon ${nodeName}`)
|
|
||||||
}
|
|
||||||
|
|
||||||
const drain = () => {
|
|
||||||
const command = `kubectl drain ${nodeName} --delete-local-data --ignore-daemonsets --force`;
|
|
||||||
ConfirmDialog.open({
|
|
||||||
ok: () => sendToTerminal(command),
|
|
||||||
labelOk: _i18n._(t`Drain Node`),
|
|
||||||
message: (
|
|
||||||
<p>
|
|
||||||
<Trans>Are you sure you want to drain <b>{nodeName}</b>?</Trans>
|
|
||||||
</p>
|
|
||||||
),
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
|
||||||
<>
|
|
||||||
<MenuItem onClick={shell}>
|
|
||||||
<Icon svg="ssh" interactive={toolbar} title={_i18n._(t`Node shell`)}/>
|
|
||||||
<span className="title"><Trans>Shell</Trans></span>
|
|
||||||
</MenuItem>
|
|
||||||
{!node.isUnschedulable() && (
|
|
||||||
<MenuItem onClick={cordon}>
|
|
||||||
<Icon material="pause_circle_filled" title={_i18n._(t`Cordon`)} interactive={toolbar}/>
|
|
||||||
<span className="title"><Trans>Cordon</Trans></span>
|
|
||||||
</MenuItem>
|
|
||||||
)}
|
|
||||||
{node.isUnschedulable() && (
|
|
||||||
<MenuItem onClick={unCordon}>
|
|
||||||
<Icon material="play_circle_filled" title={_i18n._(t`Uncordon`)} interactive={toolbar}/>
|
|
||||||
<span className="title"><Trans>Uncordon</Trans></span>
|
|
||||||
</MenuItem>
|
|
||||||
)}
|
|
||||||
<MenuItem onClick={drain}>
|
|
||||||
<Icon material="delete_sweep" title={_i18n._(t`Drain`)} interactive={toolbar}/>
|
|
||||||
<span className="title"><Trans>Drain</Trans></span>
|
|
||||||
</MenuItem>
|
|
||||||
</>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@ -9,15 +9,13 @@ import { nodesStore } from "./nodes.store";
|
|||||||
import { podsStore } from "../+workloads-pods/pods.store";
|
import { podsStore } from "../+workloads-pods/pods.store";
|
||||||
import { KubeObjectListLayout } from "../kube-object";
|
import { KubeObjectListLayout } from "../kube-object";
|
||||||
import { INodesRouteParams } from "./nodes.route";
|
import { INodesRouteParams } from "./nodes.route";
|
||||||
import { Node, nodesApi } from "../../api/endpoints/nodes.api";
|
import { Node } from "../../api/endpoints/nodes.api";
|
||||||
import { NodeMenu } from "./node-menu";
|
|
||||||
import { LineProgress } from "../line-progress";
|
import { LineProgress } from "../line-progress";
|
||||||
import { _i18n } from "../../i18n";
|
import { _i18n } from "../../i18n";
|
||||||
import { bytesToUnits } from "../../utils/convertMemory";
|
import { bytesToUnits } from "../../utils/convertMemory";
|
||||||
import { Tooltip, TooltipPosition } from "../tooltip";
|
import { Tooltip, TooltipPosition } from "../tooltip";
|
||||||
import kebabCase from "lodash/kebabCase";
|
import kebabCase from "lodash/kebabCase";
|
||||||
import upperFirst from "lodash/upperFirst";
|
import upperFirst from "lodash/upperFirst";
|
||||||
import { kubeObjectMenuRegistry } from "../../api/kube-object-menu-registry"
|
|
||||||
|
|
||||||
enum sortBy {
|
enum sortBy {
|
||||||
name = "name",
|
name = "name",
|
||||||
|
|||||||
@ -1,10 +0,0 @@
|
|||||||
.PodMenu {
|
|
||||||
.StatusBrick {
|
|
||||||
margin-right: $margin;
|
|
||||||
@include pod-status-bgs;
|
|
||||||
|
|
||||||
&.running:not(.ready) {
|
|
||||||
background-color: $pod-status-pending-color;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,134 +0,0 @@
|
|||||||
import "./pod-menu.scss";
|
|
||||||
|
|
||||||
import React from "react";
|
|
||||||
import { t, Trans } from "@lingui/macro";
|
|
||||||
import { MenuItem, SubMenu } from "../menu";
|
|
||||||
import { IPodContainer, Pod } from "../../api/endpoints";
|
|
||||||
import { Icon } from "../icon";
|
|
||||||
import { StatusBrick } from "../status-brick";
|
|
||||||
import { KubeObjectMenu, KubeObjectMenuProps } from "../kube-object/kube-object-menu";
|
|
||||||
import { cssNames, prevDefault } from "../../utils";
|
|
||||||
import { terminalStore, createTerminalTab } from "../dock/terminal.store";
|
|
||||||
import { _i18n } from "../../i18n";
|
|
||||||
import { hideDetails } from "../../navigation";
|
|
||||||
import { createPodLogsTab } from "../dock/pod-logs.store";
|
|
||||||
import { kubeObjectMenuRegistry } from "../../api/kube-object-menu-registry";
|
|
||||||
|
|
||||||
interface Props extends KubeObjectMenuProps<Pod> {
|
|
||||||
}
|
|
||||||
|
|
||||||
export class PodMenu extends React.Component<Props> {
|
|
||||||
async execShell(container?: string) {
|
|
||||||
hideDetails();
|
|
||||||
const { object: pod } = this.props
|
|
||||||
const containerParam = container ? `-c ${container}` : ""
|
|
||||||
let command = `kubectl exec -i -t -n ${pod.getNs()} ${pod.getName()} ${containerParam} "--"`
|
|
||||||
if (window.navigator.platform !== "Win32") {
|
|
||||||
command = `exec ${command}`
|
|
||||||
}
|
|
||||||
if (pod.getSelectedNodeOs() === "windows") {
|
|
||||||
command = `${command} powershell`
|
|
||||||
} else {
|
|
||||||
command = `${command} sh -c "clear; (bash || ash || sh)"`
|
|
||||||
}
|
|
||||||
|
|
||||||
const shell = createTerminalTab({
|
|
||||||
title: _i18n._(t`Pod`) + `: ${pod.getName()} (namespace: ${pod.getNs()})`
|
|
||||||
});
|
|
||||||
|
|
||||||
terminalStore.sendCommand(command, {
|
|
||||||
enter: true,
|
|
||||||
tabId: shell.id
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
showLogs(container: IPodContainer) {
|
|
||||||
hideDetails();
|
|
||||||
const pod = this.props.object;
|
|
||||||
createPodLogsTab({
|
|
||||||
pod,
|
|
||||||
containers: pod.getContainers(),
|
|
||||||
initContainers: pod.getInitContainers(),
|
|
||||||
selectedContainer: container,
|
|
||||||
showTimestamps: false,
|
|
||||||
previous: false,
|
|
||||||
tailLines: 1000
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
renderShellMenu() {
|
|
||||||
const { object: pod, toolbar } = this.props
|
|
||||||
const containers = pod.getRunningContainers();
|
|
||||||
if (!containers.length) return;
|
|
||||||
return (
|
|
||||||
<MenuItem onClick={prevDefault(() => this.execShell(containers[0].name))}>
|
|
||||||
<Icon svg="ssh" interactive={toolbar} title={_i18n._(t`Pod shell`)}/>
|
|
||||||
<span className="title"><Trans>Shell</Trans></span>
|
|
||||||
{containers.length > 1 && (
|
|
||||||
<>
|
|
||||||
<Icon className="arrow" material="keyboard_arrow_right"/>
|
|
||||||
<SubMenu>
|
|
||||||
{
|
|
||||||
containers.map(container => {
|
|
||||||
const { name } = container;
|
|
||||||
return (
|
|
||||||
<MenuItem key={name} onClick={prevDefault(() => this.execShell(name))} className="flex align-center">
|
|
||||||
<StatusBrick/>
|
|
||||||
{name}
|
|
||||||
</MenuItem>
|
|
||||||
)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
</SubMenu>
|
|
||||||
</>
|
|
||||||
)}
|
|
||||||
</MenuItem>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
renderLogsMenu() {
|
|
||||||
const { object: pod, toolbar } = this.props
|
|
||||||
const containers = pod.getAllContainers();
|
|
||||||
const statuses = pod.getContainerStatuses();
|
|
||||||
if (!containers.length) return;
|
|
||||||
return (
|
|
||||||
<MenuItem onClick={prevDefault(() => this.showLogs(containers[0]))}>
|
|
||||||
<Icon material="subject" title={_i18n._(t`Logs`)} interactive={toolbar}/>
|
|
||||||
<span className="title"><Trans>Logs</Trans></span>
|
|
||||||
{containers.length > 1 && (
|
|
||||||
<>
|
|
||||||
<Icon className="arrow" material="keyboard_arrow_right"/>
|
|
||||||
<SubMenu>
|
|
||||||
{
|
|
||||||
containers.map(container => {
|
|
||||||
const { name } = container
|
|
||||||
const status = statuses.find(status => status.name === name);
|
|
||||||
const brick = status ? (
|
|
||||||
<StatusBrick
|
|
||||||
className={cssNames(Object.keys(status.state)[0], { ready: status.ready })}
|
|
||||||
/>
|
|
||||||
) : null
|
|
||||||
return (
|
|
||||||
<MenuItem key={name} onClick={prevDefault(() => this.showLogs(container))} className="flex align-center">
|
|
||||||
{brick}
|
|
||||||
{name}
|
|
||||||
</MenuItem>
|
|
||||||
)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
</SubMenu>
|
|
||||||
</>
|
|
||||||
)}
|
|
||||||
</MenuItem>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
render() {
|
|
||||||
return (
|
|
||||||
<>
|
|
||||||
{this.renderShellMenu()}
|
|
||||||
{this.renderLogsMenu()}
|
|
||||||
</>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -9,9 +9,8 @@ import { RouteComponentProps } from "react-router";
|
|||||||
import { volumeClaimStore } from "../+storage-volume-claims/volume-claim.store";
|
import { volumeClaimStore } from "../+storage-volume-claims/volume-claim.store";
|
||||||
import { IPodsRouteParams } from "../+workloads";
|
import { IPodsRouteParams } from "../+workloads";
|
||||||
import { eventStore } from "../+events/event.store";
|
import { eventStore } from "../+events/event.store";
|
||||||
import { KubeObjectListLayout, KubeObjectMenu } from "../kube-object";
|
import { KubeObjectListLayout } from "../kube-object";
|
||||||
import { Pod, podsApi } from "../../api/endpoints";
|
import { Pod } from "../../api/endpoints";
|
||||||
import { PodMenu } from "./pod-menu";
|
|
||||||
import { StatusBrick } from "../status-brick";
|
import { StatusBrick } from "../status-brick";
|
||||||
import { cssNames, stopPropagation } from "../../utils";
|
import { cssNames, stopPropagation } from "../../utils";
|
||||||
import { KubeEventIcon } from "../+events/kube-event-icon";
|
import { KubeEventIcon } from "../+events/kube-event-icon";
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user