UNPKG

@pubgcorp/pk-template

Version:
328 lines 29.4 kB
"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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