1
0
mirror of https://github.com/lensapp/lens.git synced 2025-05-20 05:10:56 +00:00
lens/dashboard/client/components/+workloads-pods/pod-menu.tsx
Jari Kolehmainen 07e2653f80
Fix pod shell error if no access to nodes (#275)
Signed-off-by: Jari Kolehmainen <jari.kolehmainen@gmail.com>
2020-04-19 17:48:52 +03:00

118 lines
3.9 KiB
TypeScript

import "./pod-menu.scss";
import * as React from "react";
import { t, Trans } from "@lingui/macro";
import { MenuItem, SubMenu } from "../menu";
import { IPodContainer, Pod, nodesApi } from "../../api/endpoints";
import { Icon } from "../icon";
import { StatusBrick } from "../status-brick";
import { PodLogsDialog } from "./pod-logs-dialog";
import { KubeObjectMenu, KubeObjectMenuProps } from "../kube-object/kube-object-menu";
import { cssNames, prevDefault } from "../../utils";
import { terminalStore } from "../dock/terminal.store";
import { _i18n } from "../../i18n";
import { hideDetails } from "../../navigation";
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 (pod.getSelectedNodeOs() === "windows") {
command = `${command} powershell`
} else {
command = `${command} sh -c "clear; (bash || ash || sh)"`
}
terminalStore.sendCommand(command, {
enter: true,
newTab: true,
});
}
showLogs(container: IPodContainer) {
PodLogsDialog.open(this.props.object, container);
}
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() {
const { ...menuProps } = this.props;
return (
<KubeObjectMenu {...menuProps} className="PodMenu">
{this.renderShellMenu()}
{this.renderLogsMenu()}
</KubeObjectMenu>
)
}
}