UNPKG

@apigeeks/fbl-k8s-plugin

Version:

fbl wrapper plugin for helm and kubectl cli utilities

193 lines 7.89 kB
"use strict"; var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; var __metadata = (this && this.__metadata) || function (k, v) { if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); }; 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()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); var K8sKubectlService_1; const minimatch = require("minimatch"); const typedi_1 = require("typedi"); const util_1 = require("util"); const fs_1 = require("fs"); const js_yaml_1 = require("js-yaml"); const fbl_1 = require("fbl"); let K8sKubectlService = K8sKubectlService_1 = class K8sKubectlService { /** * Execute "helm" command * @param {string[]} args * @param {string} wd * @return {Promise<IExecOutput>} */ execKubectlCommand(args, wd) { return __awaiter(this, void 0, void 0, function* () { const stdout = []; const stderr = []; const code = yield this.childProcessService.exec('kubectl', args, wd || '.', { stdout: (chunk) => { stdout.push(chunk.toString().trim()); }, stderr: (chunk) => { stderr.push(chunk.toString().trim()); }, }); return { code, stdout: stdout.join('\n'), stderr: stderr.join('\n'), }; }); } /** * Bulk removal of K8s objects * @param {IK8sBulkDelete} options * @param {IContext} context * @return {Promise<void>} */ deleteObjects(options, context) { return __awaiter(this, void 0, void 0, function* () { const objects = yield this.listObjects(options.kind, options.namespace); yield Promise.all(objects .filter(objectName => { for (const pattern of options.names) { if (minimatch(objectName, pattern)) { return true; } } return false; }) .map((objectName) => __awaiter(this, void 0, void 0, function* () { yield this.deleteObject({ kind: options.kind, apiVersion: 'v1', metadata: { name: objectName, namespace: options.namespace, }, }, context); }))); }); } /** * Delete K8s object * @param {IK8sObject} k8sObject * @param {IContext} context * @return {Promise<void>} */ deleteObject(k8sObject, context) { return __awaiter(this, void 0, void 0, function* () { const args = ['delete', k8sObject.kind, k8sObject.metadata.name]; if (k8sObject.metadata.namespace) { args.push('-n', k8sObject.metadata.namespace); } const result = yield this.execKubectlCommand(args); if (result.code !== 0) { throw new Error('Unexpected error occurred ' + JSON.stringify(result)); } const contextEntity = K8sKubectlService_1.createEntity(k8sObject); context.entities.unregistered.push(contextEntity); context.entities.deleted.push(contextEntity); }); } /** * Apply object * @param {IK8sObject} k8sObject * @param {IContext} context * @return {Promise<void>} */ applyObject(k8sObject, context) { return __awaiter(this, void 0, void 0, function* () { const tmpFile = yield this.tempPathsRegistry.createTempFile(false, '.yml'); yield util_1.promisify(fs_1.writeFile)(tmpFile, js_yaml_1.dump(k8sObject), 'utf8'); const result = yield this.execKubectlCommand(['apply', '-f', tmpFile]); if (result.code !== 0) { throw new Error(`Unable to apply K8s object with name: ${k8sObject.metadata.name} and kind: ${k8sObject.kind} Error: ${result.stderr}`); } const contextEntity = K8sKubectlService_1.createEntity(k8sObject); context.entities.registered.push(contextEntity); if (result.stdout.split(' ')[1] === 'created') { context.entities.created.push(contextEntity); } else { context.entities.updated.push(contextEntity); } }); } /** * @param {IK8sObject} k8sObject * @return {IContextEntity} */ static createEntity(k8sObject) { return { type: k8sObject.kind, payload: k8sObject, id: k8sObject.metadata.name, }; } /** * Get existing K8s Object * @param {IK8sObject} k8sObject * @returns {Promise<any>} */ getObject(k8sObject) { return __awaiter(this, void 0, void 0, function* () { const result = yield this.execKubectlCommand(['get', k8sObject.kind, k8sObject.metadata.name, '-o', 'json']); if (result.stderr.trim().indexOf('Error from server (NotFound)') === 0) { throw new Error(`Object ${k8sObject.kind} with name ${k8sObject.metadata.name} not found`); } if (result.code) { throw new Error(`Unexpected error occurred upon getting object ${k8sObject.kind} with name ${k8sObject.metadata.name}. ${result.stderr.trim()}`); } return JSON.parse(result.stdout); }); } /** * Get k8s objects * * @param {string} kind * @param {string} namespace * @return {Promise<string[]>} */ listObjects(kind, namespace) { return __awaiter(this, void 0, void 0, function* () { const args = ['get', kind]; if (namespace) { args.push('--namespace', namespace); } args.push('-o name'); const result = yield this.execKubectlCommand(args); return result.stdout .split('\n') .map(l => l .trim() .split('/') .pop()) .filter(l => l); }); } }; __decorate([ typedi_1.Inject(() => fbl_1.ChildProcessService), __metadata("design:type", fbl_1.ChildProcessService) ], K8sKubectlService.prototype, "childProcessService", void 0); __decorate([ typedi_1.Inject(() => fbl_1.TempPathsRegistry), __metadata("design:type", fbl_1.TempPathsRegistry) ], K8sKubectlService.prototype, "tempPathsRegistry", void 0); K8sKubectlService = K8sKubectlService_1 = __decorate([ typedi_1.Service() ], K8sKubectlService); exports.K8sKubectlService = K8sKubectlService; //# sourceMappingURL=K8sKubectlService.js.map