pk-template
Version:
p template engine for kubernetes
245 lines • 21.7 kB
JavaScript
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
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) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
result["default"] = mod;
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
const progress_1 = require("../../../pk-ui/progress");
const common_1 = require("../../../common");
const pkyaml = __importStar(require("../../../pk-yaml"));
const pk_kubectl_1 = require("../../../pk-kubectl/pk-kubectl");
const catalog_1 = require("../../../pk-deploy/catalog");
const lazy_1 = require("../../../lazy");
const load_1 = require("../../../pk-deploy/load");
const path_1 = require("path");
const os_1 = require("os");
const libs_1 = require("../../libs");
const exists_1 = require("../../../pk-deploy/exists");
class Command extends progress_1.Progress {
constructor(options, app, env, cluster) {
super(options);
this.options = options;
this.app = app;
this.env = env;
this.cluster = cluster;
this.kube = null;
this.kubeOption = null;
this.packageName = null;
}
buildApplySteps(objects) {
const g = [
{ name: 'Namespaces', objects: [], final: false },
{ name: 'Resources', objects: [], final: false },
{ name: 'Deployments', objects: [], final: false },
{ name: 'Catalog', objects: [], final: true },
];
for (const o of objects) {
if (!o.metadata.namespace) {
const namespaced = this.kube.isNamespacedObject(o);
if (namespaced) {
this.error(`namespace is missing on (apiversion=${o.apiVersion}, kind=${o.kind}, name=${o.metadata.name})`);
this.verbose(pkyaml.dumpYaml(o));
process.exit(1);
}
}
switch (o.kind) {
case 'Namespace':
g[0].objects.push(o);
break;
case 'Pod':
case 'Deployment':
case 'DaemonSet':
case 'StatefulSet':
g[2].objects.push(o);
break;
default:
if (o.kind == 'ConfigMap') {
const type = o.metadata.annotations &&
o.metadata.annotations['pkt.io/type'];
if (type === 'pk-deployment') {
g[3].objects.push(o);
}
else {
g[1].objects.push(o);
}
}
else {
g[1].objects.push(o);
}
}
}
return g;
}
toResourceKey(objects) {
return objects.map(o => ({
kind: o.kind,
apiGroup: o.apiVersion.split('/').length == 1
? ''
: o.apiVersion.split('/')[1],
name: o.metadata.name,
namespace: o.metadata.namespace || '',
}));
}
findDisappearedObjects(currcmap) {
const prevcmap = this.kube.getPkzSpec(currcmap.metadata.name) ||
{ metadata: { name: currcmap.metadata.name }, data: { catalog: '', header: {} } };
const prevSpec = catalog_1.PkdCatalog.parse(prevcmap.data.catalog);
const currSpec = catalog_1.PkdCatalog.parse(currcmap.data.catalog);
return prevSpec.subtract(currSpec);
}
precheckStep(objects, steps) {
this.header('pre-check');
const chalk = lazy_1.getChalk().yellowBright;
this.output(` target deployment : ${chalk(this.packageName)}`);
this.output(` kubeconfig : ${chalk(this.kubeOption.kubeConfig)} `);
this.output(` cluster : ${chalk(this.kubeOption.cluster)} `);
this.output(` apply : ${chalk(this.kubeOption.isDryRun ? 'no' : 'yes')} `);
this.output();
for (const step of steps) {
this.output(` ${step.name.padEnd(15)}: ${step.objects.length} objects`);
}
this.output();
this.output(` total ${objects.length} objects to apply`);
this.output();
this.confirm("proceed");
}
showTargets(targets) {
if (targets.length == 0) {
this.verbose(' - targets: none');
}
else {
this.verbose(` - targets:`);
const kmax = targets.reduce((max, target) => max = Math.max(max, target.kind.length), 0);
const nmax = targets.reduce((max, target) => max = Math.max(max, target.name.length), 0);
for (const target of targets) {
const name = target.namespace
? `${target.kind.padEnd(kmax)} ${target.name.padEnd(nmax)} namespace = ${target.namespace}`
: `${target.kind.padEnd(kmax)} ${target.name.padEnd(nmax)}`;
this.verbose(` ${name}`);
}
}
this.verbose();
}
deleteStep(step) {
return __awaiter(this, void 0, void 0, function* () {
this.header(`Delete step`);
const deleteList = this.findDisappearedObjects(step.objects[0]);
const targets = deleteList;
if (targets.length == 0) {
this.showTargets(targets);
this.confirm('skip');
this.verbose(' - kubectl: delete skipped');
}
else {
this.showTargets(targets);
this.confirm(`delete ${targets.length} objects`);
this.verbose(' - kubectl: delete');
this.kube.deleteObjects(deleteList);
this.output();
}
});
}
applyStep(step) {
return __awaiter(this, void 0, void 0, function* () {
this.header(`${step.name} step`);
if (step.objects.length == 0) {
this.showTargets([]);
this.confirm(`skip`);
this.verbose(' - kubectl: apply skipped');
return;
}
this.showTargets(this.toResourceKey(step.objects));
this.confirm(`apply these ${step.objects.length} objects`);
this.verbose(` - kubectl: apply`);
if (this.options.sequentialApply) {
for (const o of step.objects) {
yield this.kube.applyRaw(this.kubeOption, [o]);
}
}
else {
yield this.kube.applyRaw(this.kubeOption, step.objects);
}
this.output();
});
}
addPkDeploymentNamespace(objects) {
const exists = objects.findIndex(o => o.apiVersion == 'v1' &&
o.kind == 'Namespace' &&
o.metadata.name == 'pk-deployments') != -1;
if (!exists) {
objects.push({
apiVersion: 'v1',
kind: 'Namespace',
metadata: {
name: 'pk-deployments',
}
});
}
}
apply(pkz) {
return __awaiter(this, void 0, void 0, function* () {
const objects = pkz.objects.filter((o) => o);
this.addPkDeploymentNamespace(objects);
const steps = this.buildApplySteps(objects);
this.precheckStep(objects, steps);
if (!this.options.dryRun) {
this.error('CAUTION) APPLYING TO REAL KUBERNETES CLUSTER !!!');
if (this.options.yes && !this.options.immediate) {
for (let i = 10; i >= 0; --i) {
process.stdout.write(`..${i} `);
yield common_1.delay(500);
}
console.log('.. START !!!');
}
}
for (const step of steps) {
if (step.final) {
yield this.deleteStep(steps[3]);
}
yield this.applyStep(step);
}
this.output();
this.success('success !!!');
});
}
execute() {
return __awaiter(this, void 0, void 0, function* () {
const pkd = load_1.loadPkd(this.env, this.cluster);
const cluster = this.cluster;
const kubeConfig = path_1.join(os_1.homedir(), '.kube', cluster);
this.kubeOption = {
cluster: cluster,
isDryRun: this.options.dryRun,
kubeConfig: kubeConfig,
};
this.packageName = pkd.header.name;
this.kube = new pk_kubectl_1.PkKubeCtl(this.kubeOption, this);
yield this.apply(pkd);
});
}
}
exports.default = (pk) => (argv) => __awaiter(this, void 0, void 0, function* () {
yield libs_1.tryCatch(() => __awaiter(this, void 0, void 0, function* () {
yield libs_1.visitEachDeployments(argv.app, argv.env, argv.cluster, (projectRoot, projectConf, app, envName, clusterName) => __awaiter(this, void 0, void 0, function* () {
if (!exists_1.existsPkd(envName, clusterName)) {
return;
}
if (!projectConf.isDeployExecutable(argv.branch, app.name, envName, clusterName)) {
return;
}
yield new Command(argv, app.name, envName, clusterName).execute();
}));
}), !!argv.d);
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwbHlIYW5kbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3BrL2NvbW1hbmRzL2RlcGxveW1lbnQvYXBwbHlIYW5kbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQ0Esc0RBQW1EO0FBQ25ELDRDQUErRTtBQUMvRSx5REFBMkM7QUFDM0MsK0RBQTJEO0FBQzNELHdEQUF3RDtBQUN4RCx3Q0FBeUM7QUFDekMsa0RBQWtEO0FBRWxELCtCQUE0QjtBQUM1QiwyQkFBNkI7QUFDN0IscUNBQTREO0FBRTVELHNEQUFzRDtBQVF0RCxNQUFNLE9BQVEsU0FBUSxtQkFBUTtJQU01QixZQUFvQixPQUEyQixFQUFVLEdBQVcsRUFBVSxHQUFXLEVBQVUsT0FBZTtRQUNoSCxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUE7UUFESSxZQUFPLEdBQVAsT0FBTyxDQUFvQjtRQUFVLFFBQUcsR0FBSCxHQUFHLENBQVE7UUFBVSxRQUFHLEdBQUgsR0FBRyxDQUFRO1FBQVUsWUFBTyxHQUFQLE9BQU8sQ0FBUTtRQUdoSCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQTRCLENBQUM7UUFDekMsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFpQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO0lBQzFCLENBQUM7SUFFTyxlQUFlLENBQUMsT0FBa0I7UUFDeEMsTUFBTSxDQUFDLEdBQWlCO1lBQ3RCLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUU7WUFDakQsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRTtZQUNoRCxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFO1lBQ2xELEVBQUUs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