@apigeeks/fbl-k8s-plugin
Version:
fbl wrapper plugin for helm and kubectl cli utilities
193 lines • 7.89 kB
JavaScript
;
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