UNPKG

kui-shell

Version:

This is the monorepo for Kui, the hybrid command-line/GUI electron-based Kubernetes tool

152 lines 6.06 kB
"use strict"; 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