@pubgcorp/pk-template
Version:
p template engine for kubernetes
202 lines • 15.5 kB
JavaScript
;
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;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.PkProjectConf = void 0;
const path_1 = require("path");
const Yaml = __importStar(require("../pk-yaml"));
const fs_1 = require("fs");
class PkProjectConf {
constructor(data) {
this.data = data;
this.getApp = (name) => this.data.apps.find(app => app.name == name);
this.getEnv = (name) => this.data.envs && this.data.envs.find(e => e.name === name);
this.getModule = (name) => this.data.modules.find(m => m.name == name);
this.getClusterKubeConfig = (cluster) => { var _a; return (_a = this.data.clusterKubeConfig) === null || _a === void 0 ? void 0 : _a.find(m => m.name == cluster); };
}
addApp(app) {
if (this.getApp(app.name)) {
throw new Error(`app ${app.name} already exists`);
}
this.data.apps.push(app);
}
prepareEnv(envName) {
if (!this.data.envs) {
this.data.envs = [];
}
const env = this.data.envs.find(e => e.name == envName);
if (env) {
return env;
}
const newEnv = {
name: envName,
values: {},
clusters: [],
};
this.data.envs.push(newEnv);
return newEnv;
}
prepareAppEnv(appName, envName) {
const app = this.getApp(appName);
if (!app) {
throw new Error(`app ${appName} does not exists`);
}
if (!app.envs) {
app.envs = [];
}
const env = app.envs.find(e => e.name == envName);
if (env) {
return env;
}
const newEnv = {
name: envName,
values: {},
clusters: [],
};
app.envs.push(newEnv);
return newEnv;
}
getMergedEnv(appName, envName, clusterName) {
const app = this.getApp(appName);
if (!app) {
throw new Error(`app ${appName} not exits`);
}
const env = app.envs
? app.envs.find(e => e.name === envName)
: this.getEnv(envName);
if (!env) {
return undefined;
}
if (!env.clusters.includes(clusterName)) {
return undefined;
}
return Object.assign(Object.assign({}, (env || {})), { values: Object.assign(Object.assign({}, (this.data.values || {})), (env && env.values || {})) });
}
addEnv(env) {
if (this.getEnv(env.name)) {
throw new Error(`env ${env.name} already exists`);
}
this.data.envs.push(env);
}
addModule(module) {
if (this.getModule(module.name)) {
throw new Error(`module ${module.name} already exists`);
}
this.data.modules.push(module);
}
upsertModule(module) {
const idx = this.data.modules.findIndex(m => m.name == module.name);
if (idx >= 0) {
this.data.modules[idx] = module;
}
else {
this.addModule(module);
}
}
isDeployExecutable(branch, appName, envName, clusterName) {
if (!branch || !this.data.deploy || this.data.deploy.length === 0) {
return true;
}
const deployConfs = this.data.deploy.filter(d => d.branch === branch);
if (deployConfs.length === 0) {
return false;
}
const accepted = (accpets, denies, item, name) => {
if (accpets && denies) {
throw new Error(`deploy option ${name} and -${name} can not be used at the same time.`);
}
if (accpets) {
return accpets.includes(item);
}
else if (denies) {
return !denies.includes(item);
}
else { // both not exists
return true;
}
};
return deployConfs.some(conf => accepted(conf.apps, conf['-apps'], appName, 'apps')
&& accepted(conf.envs, conf['-envs'], envName, 'envs')
&& accepted(conf.clusters, conf['-clusters'], clusterName, 'clusters'));
}
static exists(dir) {
return dir
? (0, fs_1.existsSync)((0, path_1.join)(dir, PkProjectConf.FILENAME))
: (0, fs_1.existsSync)(PkProjectConf.FILENAME);
}
static create(projectName, owner) {
return new PkProjectConf({
project: {
name: projectName,
owner: owner,
},
values: {},
apps: [],
envs: [],
clusterKubeConfig: [],
modules: [],
deploy: [],
});
}
static save(conf, dir) {
const content = Yaml.dumpYaml(conf.data);
(0, fs_1.writeFileSync)(`${dir}/${PkProjectConf.FILENAME}`, content, 'utf8');
}
static tryLoad(uri) {
try {
const json = (0, fs_1.readFileSync)(uri, 'utf8');
return json;
}
catch (e) {
return null;
}
}
static _find(dir) {
while (true) {
let projectPath = (0, path_1.resolve)(dir, PkProjectConf.FILENAME);
const content = PkProjectConf.tryLoad(projectPath);
if (content) {
const file = Yaml.parseYaml(content);
return {
projectPath,
projectRoot: (0, path_1.dirname)(projectPath),
projectConf: new PkProjectConf(file),
};
}
const parent = (0, path_1.resolve)(dir, '../');
if (parent == null || parent === dir) {
return { projectPath: null, projectConf: null, projectRoot: null };
}
dir = parent;
}
}
static find(uri) {
return uri
? PkProjectConf._find(uri + '/')
: PkProjectConf._find(process.cwd() + '/');
}
}
exports.PkProjectConf = PkProjectConf;
PkProjectConf.FILENAME = "pk-project.yaml";
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvamVjdENvbmYuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcGstY29uZi9wcm9qZWN0Q29uZi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLCtCQUE4QztBQUM5QyxpREFBbUM7QUFFbkMsMkJBQTZEO0FBRTdELE1BQWEsYUFBYTtJQUd4QixZQUFtQixJQUFvQjtRQUFwQixTQUFJLEdBQUosSUFBSSxDQUFnQjtRQVN2QyxXQUFNLEdBQUcsQ0FBQyxJQUFZLEVBQXNCLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxDQUFDO1FBc0U1RixXQUFNLEdBQUcsQ0FBQyxJQUFZLEVBQXNCLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxDQUFDO1FBZ0IzRyxjQUFTLEdBQUcsQ0FBQyxJQUFZLEVBQXlCLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxDQUFDO1FBRWpHLHlCQUFvQixHQUFHLENBQUMsT0FBZSxFQUEyQyxFQUFFLFdBQUMsT0FBQSxNQUFBLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLDBDQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksT0FBTyxDQUFDLENBQUEsRUFBQSxDQUFDO0lBaEcvSSxDQUFDO0lBRUQsTUFBTSxDQUFDLEdBQVc7UUFDaEIsSUFBSSxJQUFJ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