@pubgcorp/pk-template
Version:
p template engine for kubernetes
328 lines • 29.4 kB
JavaScript
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
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 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");
const build_1 = require("../../../pk-deploy/build");
const virtualObject_1 = require("./virtualObject");
class Command extends progress_1.Progress {
constructor(options, app, env, cluster, clusterKubeConfig) {
super(options);
this.options = options;
this.app = app;
this.env = env;
this.cluster = cluster;
this.clusterKubeConfig = clusterKubeConfig;
this.kube = null;
this.kubeOption = null;
this.packageName = null;
}
buildApplySteps(objects) {
const g = {
BeforeNamespaces: { name: 'BeforeNamespaces', objects: [], final: false, order: 1 },
Namespaces: { name: 'Namespaces', objects: [], final: false, order: 2 },
AfterNamespaces: { name: 'AfterNamespaces', objects: [], final: false, order: 3 },
BeforeResources: { name: 'BeforeResources', objects: [], final: false, order: 4 },
Resources: { name: 'Resources', objects: [], final: false, order: 5 },
AfterResources: { name: 'AfterResources', objects: [], final: false, order: 6 },
BeforeDeployments: { name: 'BeforeDeployments', objects: [], final: false, order: 7 },
Deployments: { name: 'Deployments', objects: [], final: false, order: 8 },
AfterDeployments: { name: 'AfterDeployments', objects: [], final: false, order: 9 },
Catalog: { name: 'Catalog', objects: [], final: true, order: 10 },
};
for (const o of objects) {
if (!(0, build_1.isVirtualObject)(o) && !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);
}
}
if (o.metadata.annotations && o.metadata.annotations['pk.io/apply-step']) {
const stepName = o.metadata.annotations['pk.io/apply-step'];
const step = g[stepName];
if (step) {
step.objects.push(o);
continue;
}
else {
console.error(`unknown pk.io/apply-step (${stepName}) on ${o.kind}/${o.metadata.namespace}/${o.metadata.name}`);
}
}
switch (o.kind) {
case 'Namespace':
g.Namespaces.objects.push(o);
break;
case 'Pod':
case 'Deployment':
case 'DaemonSet':
case 'StatefulSet':
g.Deployments.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.Catalog.objects.push(o);
}
else {
g.Resources.objects.push(o);
}
}
else {
g.Resources.objects.push(o);
}
}
}
return Object.values(g).sort((a, b) => a.order - b.order);
}
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 = (0, 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.kubeOption.context && this.output(` context : ${chalk(this.kubeOption.context)} `);
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.applyObjects([o]);
}
}
else {
yield this.applyObjects(step.objects);
}
this.output();
});
}
applyObjects(objects) {
return __awaiter(this, void 0, void 0, function* () {
const objectGroups = this.splitObjects(objects);
for (const group of objectGroups) {
if (group.findIndex(build_1.isVirtualObject) !== -1) {
for (const object of group) {
if ((0, build_1.isVirtualObject)(object)) {
yield (0, virtualObject_1.applyPkIoVirtualObject)(this.kube, object);
}
else {
yield this.kube.applyRaw(this.kubeOption, [object]);
}
}
}
else {
yield this.kube.applyRaw(this.kubeOption, group);
}
}
});
}
splitObjects(objects) {
const groups = [];
let group = [];
const nextGroup = () => {
if (group.length !== 0) {
groups.push(group);
group = [];
}
};
for (const obj of objects) {
if ((0, build_1.isVirtualObject)(obj)) {
nextGroup();
group.push(obj);
nextGroup();
}
else {
group.push(obj);
}
}
nextGroup();
return groups;
}
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 (0, common_1.delay)(500);
}
console.log('.. START !!!');
}
}
for (const step of steps) {
if (step.final) {
yield this.deleteStep(step);
}
yield this.applyStep(step);
}
this.output();
this.success('success !!!');
});
}
execute() {
var _a;
return __awaiter(this, void 0, void 0, function* () {
const pkd = (0, load_1.loadPkd)(this.env, this.cluster);
const cluster = this.cluster;
const kubeConfig = (0, path_1.join)((0, os_1.homedir)(), '.kube', ((_a = this.clusterKubeConfig) === null || _a === void 0 ? void 0 : _a.kubeconfig) || cluster);
const context = this.clusterKubeConfig ? this.clusterKubeConfig.context : undefined;
this.kubeOption = {
cluster: cluster,
isDryRun: this.options.dryRun,
kubeConfig: kubeConfig,
context,
};
this.packageName = pkd.header.name;
this.kube = new pk_kubectl_1.PkKubeCtl(this.kubeOption, this);
yield this.apply(pkd);
});
}
}
exports.default = (pk) => (argv) => __awaiter(void 0, void 0, void 0, function* () {
yield (0, libs_1.tryCatch)(() => __awaiter(void 0, void 0, void 0, function* () {
yield (0, libs_1.visitEachDeployments)(argv.app, argv.env, argv.cluster, (projectRoot, projectConf, app, envName, clusterName) => __awaiter(void 0, void 0, void 0, function* () {
if (!(0, exists_1.existsPkd)(envName, clusterName)) {
return;
}
if (!projectConf.isDeployExecutable(argv.branch, app.name, envName, clusterName)) {
return;
}
yield new Command(argv, app.name, envName, clusterName, projectConf.getClusterKubeConfig(clusterName)).execute();
}));
}), !!argv.d);
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwbHlIYW5kbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3BrL2NvbW1hbmRzL2RlcGxveW1lbnQvYXBwbHlIYW5kbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQSxzREFBbUQ7QUFDbkQsNENBQStFO0FBQy9FLHlEQUEyQztBQUMzQywrREFBMkQ7QUFDM0Qsd0RBQXdEO0FBQ3hELHdDQUF5QztBQUN6QyxrREFBa0Q7QUFFbEQsK0JBQTRCO0FBQzVCLDJCQUE2QjtBQUM3QixxQ0FBNEQ7QUFFNUQsc0RBQXNEO0FBQ3RELG9EQUEyRDtBQUMzRCxtREFBeUQ7QUE2QnpELE1BQU0sT0FBUSxTQUFRLG1CQUFRO0lBTTVCLFlBQW9CLE9BQTJCLEVBQVUsR0FBVyxFQUFVLEdBQVcsRUFBVSxPQUFlLEVBQVUsaUJBQTBEO1FBQ3BMLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQURJLFlBQU8sR0FBUCxPQUFPLENBQW9CO1FBQVUsUUFBRyxHQUFILEdBQUcsQ0FBUTtRQUFVLFFBQUcsR0FBSCxHQUFHLENBQVE7UUFBVSxZQUFPLEdBQVAsT0FBTyxDQUFRO1FBQVUsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUF5QztRQUdwTCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQTRCLENBQUM7UUFDekMsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFpQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO0lBQzFCLENBQUM7SUFFTyxlQUFlLENBQUMsT0FBa0I7UUFDeEMsTUFBTSxDQUFDLEdBQWdCO1lBQ3JCLGdCQUFnQixFQUFFLEVBQUUsSUFBSSxFQUFFLGtCQUFrQixFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFO1lBQ25GLFVBQVUsRUFBRSxFQUFFLElBQUksRUFBRSxZ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