kui-shell
Version:
This is the monorepo for Kui, the hybrid command-line/GUI electron-based Kubernetes tool
152 lines • 6.06 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
const debug_1 = require("debug");
const i18n_1 = require("@kui-shell/core/api/i18n");
const repl_util_1 = require("@kui-shell/core/api/repl-util");
const states_1 = require("../../model/states");
const strings = i18n_1.i18n('plugin-k8s');
const debug = debug_1.default('k8s/view/modes/containers');
exports.containersButton = (command, resource, overrides) => Object.assign({}, {
mode: 'containers',
label: strings('containers'),
direct: {
plugin: 'k8s/dist/index',
operation: 'renderAndViewContainers',
parameters: { command, resource }
}
}, overrides || {});
exports.containersMode = {
when: (resource) => {
return resource.spec && resource.spec.containers;
},
mode: (command, resource) => {
try {
return exports.containersButton(command, resource);
}
catch (err) {
debug('error rendering containers button');
console.error(err);
}
}
};
const showLogs = (tab, { pod, container }) => {
const podName = repl_util_1.encodeComponent(pod.metadata.name);
const containerName = repl_util_1.encodeComponent(container.name);
const ns = repl_util_1.encodeComponent(pod.metadata.namespace);
return `kubectl logs ${podName} ${containerName} -n ${ns}`;
};
const headerModel = (resource) => {
const statuses = resource.resource.status && resource.resource.status.containerStatuses;
const specAttrs = [{ value: 'PORTS', outerCSS: 'header-cell pretty-narrow' }];
const statusAttrs = !statuses
? []
: [
{ value: 'RESTARTS', outerCSS: 'header-cell very-narrow' },
{ value: 'READY', outerCSS: 'header-cell very-narrow' },
{ value: 'STATE', outerCSS: 'header-cell pretty-narrow' },
{ value: 'MESSAGE', outerCSS: 'header-cell' }
];
return {
type: 'container',
name: 'IMAGE',
outerCSS: 'header-cell not-too-wide',
attributes: specAttrs.concat(statusAttrs)
};
};
const bodyModel = (tab, resource) => {
const pod = resource.resource;
const statuses = pod.status && pod.status.containerStatuses;
const bodyModel = pod.spec.containers
.map(container => {
const status = statuses && statuses.find(_ => _.name === container.name);
if (!status) {
return;
}
debug('container status', container.name, status.restartCount, status);
const stateKey = Object.keys(status.state)[0];
const stateBody = status.state[stateKey];
const statusAttrs = !status
? []
: [
{
key: 'restartCount',
value: status.restartCount,
outerCSS: 'very-narrow'
},
{
key: 'ready',
value: status.ready,
fontawesome: status.ready ? 'fas fa-check-circle' : 'far fa-dot-circle',
css: status.ready ? 'green-text' : 'yellow-text'
},
{
key: 'state',
value: stateKey,
tag: 'badge',
outerCSS: 'capitalize',
css: stateKey === 'running'
? states_1.TrafficLight.Green
: stateKey === 'terminated'
? states_1.TrafficLight.Red
: states_1.TrafficLight.Yellow
},
{
key: 'message',
outerCSS: 'smaller-text not-too-wide',
value: stateBody.startedAt || stateBody.reason
}
];
const portsAttr = {
key: 'ports',
outerCSS: 'not-too-wide',
value: (container.ports || []).map(({ containerPort, protocol }) => `${containerPort}/${protocol}`).join(' ')
};
const specAttrs = [portsAttr];
return {
type: 'container',
name: container.name,
onclick: showLogs(tab, { pod, container }),
usePip: true,
attributes: specAttrs.concat(statusAttrs)
};
})
.filter(_ => _);
debug('body model', bodyModel);
return bodyModel;
};
exports.renderContainers = (tab, command, resource) => __awaiter(void 0, void 0, void 0, function* () {
debug('renderContainers', command, resource);
const fetchPod = `kubectl get pod ${repl_util_1.encodeComponent(resource.resource.metadata.name)} -n "${resource.resource.metadata.namespace}" -o json`;
debug('issuing command', fetchPod);
try {
const podResource = yield tab.REPL.qexec(fetchPod);
debug('renderContainers.response', podResource);
return {
header: headerModel(podResource),
body: bodyModel(tab, podResource),
noSort: true,
title: 'Containers'
};
}
catch (err) {
if (err.code === 404) {
return { body: [] };
}
else {
throw err;
}
}
});
exports.renderAndViewContainers = (tab, parameters) => {
return exports.renderContainers(tab, parameters.command, parameters.resource);
};
//# sourceMappingURL=containers.js.map