@controlplane/cli
Version:
Control Plane Corporation CLI
192 lines • 7.53 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.getResourcesFromCompose = exports.createSecretForBindMount = exports.getFilenameFromPath = exports.healthCheckCommandToCplnCommand = exports.durationToSeconds = exports.mergeEnv = exports.envFileToEnv = exports.convertToPorts = exports.portsFromRange = exports.convertToEnvironment = exports.convertToMebibytes = exports.convertToMilicore = void 0;
const objects_1 = require("../util/objects");
const secret_1 = require("./compose-resources/secret");
const fs_1 = require("fs");
const network_1 = require("./compose-resources/network");
const service_1 = require("./compose-resources/service");
const volume_1 = require("./compose-resources/volume");
function convertToMilicore(cpu) {
return Number(cpu) * 1000;
}
exports.convertToMilicore = convertToMilicore;
function convertToMebibytes(memory) {
let number = Number(memory.replace(/(^\d+)(.+$)/i, '$1'));
// Memory in bytes
if (memory.endsWith('b') || memory.endsWith('B')) {
return Math.ceil(number / 1000000);
}
// Memory in kilobytes
if (memory.endsWith('k') || memory.endsWith('K') || memory.endsWith('kb') || memory.endsWith('KB')) {
return Math.ceil(number / 1000);
}
// Memory in megabytes
if (memory.endsWith('m') || memory.endsWith('M') || memory.endsWith('mb') || memory.endsWith('MB')) {
return Math.ceil(number * 1.05);
}
// Memory in gigibytes
if (memory.endsWith('g') || memory.endsWith('G') || memory.endsWith('gb') || memory.endsWith('GB')) {
return Math.ceil(number * 1000);
}
return number;
}
exports.convertToMebibytes = convertToMebibytes;
function convertToEnvironment(environment) {
if (Array.isArray(environment)) {
return (0, objects_1.toEnv)(environment);
}
return Object.entries(environment).map(([name, value]) => ({ name, value: String(value) }));
}
exports.convertToEnvironment = convertToEnvironment;
function portsFromRange(portRange) {
if (!portRange.includes('-')) {
return [Number(portRange)];
}
const [start, end] = portRange.split('-');
return Array.from({ length: +end - +start + 1 }, (value, index) => +start + +index);
}
exports.portsFromRange = portsFromRange;
function convertToPorts(portStrings, availableProtocols) {
const cplnPorts = [];
const portsObject = {};
// Fill in ports object. Ensures no duplicate ports
portStrings.forEach((p) => {
let ports = [];
const [portString, composeProtocol] = p.split('/');
const portsInfo = portString.split(':');
if (portsInfo.length === 1)
ports = portsFromRange(portsInfo[0]);
else if (portsInfo.length === 2) {
ports = portsFromRange(portsInfo[1]);
}
else {
ports = portsFromRange(portsInfo[2]);
}
const protocol = availableProtocols.includes(composeProtocol) ? composeProtocol : undefined;
for (const port of ports) {
portsObject[port] = protocol;
}
});
// converts ports object to cpln object
for (const [port, protocol] of Object.entries(portsObject)) {
cplnPorts.push({ number: +port, protocol });
}
return cplnPorts;
}
exports.convertToPorts = convertToPorts;
function envFileToEnv(filedir) {
const file = (0, fs_1.readFileSync)(filedir, 'utf8');
const lines = file.split(/\r?\n/);
const envs = (0, objects_1.toEnv)(lines);
return envs;
}
exports.envFileToEnv = envFileToEnv;
// merges env2 into env1,
function mergeEnv(env1, env2) {
for (const variable of env2) {
// Adding variable only if it doesnt exist already
if (env1.findIndex((v) => v.name === variable.name) === -1) {
env1.push(variable);
}
}
}
exports.mergeEnv = mergeEnv;
function durationToSeconds(duration) {
if (duration === undefined) {
return undefined;
}
let timeInSeconds = 0;
if (duration.includes('h')) {
let [hours, rest] = duration.split('h');
timeInSeconds += Number(hours) * 60 * 60;
duration = rest;
}
if (duration.includes('m')) {
let [minutes, rest] = duration.split('m');
timeInSeconds += Number(minutes) * 60;
duration = rest;
}
if (duration.includes('s')) {
let [seconds, rest] = duration.split('s');
timeInSeconds += Number(seconds);
duration = rest;
}
return timeInSeconds;
}
exports.durationToSeconds = durationToSeconds;
function healthCheckCommandToCplnCommand(command) {
if (command === undefined) {
return undefined;
}
if (typeof command === 'string') {
return ['/bin/sh', '-c', command];
}
else if (command.length < 2) {
throw new Error('Health check command invalid');
}
else {
if (command[0] === 'CMD') {
return command.slice(1);
}
else {
// command[0] === 'CMD-SHELL'
// No other way to use default shell, so I use /bin/sh
return ['/bin/sh', '-c', command[1]];
}
}
}
exports.healthCheckCommandToCplnCommand = healthCheckCommandToCplnCommand;
function getFilenameFromPath(filePath, includeExtension = false) {
const paths = filePath.split('/');
const fileName = paths[paths.length - 1];
if (!includeExtension) {
// Return file name without extension
return fileName.split('.')[0];
}
return fileName;
}
exports.getFilenameFromPath = getFilenameFromPath;
function createSecretForBindMount(composePath, filePath, secrets, context) {
let secret;
if (secrets.every((s) => s.body.file !== filePath)) {
secret = new secret_1.default(getFilenameFromPath(filePath), { file: filePath }, context, composePath);
secrets.push(secret);
}
else {
secret = secrets.find((s) => s.body.file == filePath);
}
return secret;
}
exports.createSecretForBindMount = createSecretForBindMount;
function getResourcesFromCompose(composeObject, composePath, context, registry, profile) {
var _a, _b, _c, _d, _e;
const networks = [];
const volumes = [];
const secrets = [];
const services = [];
// Object.entries(composeObject.{key}) returns [name, body]
for (const network of Object.entries((_a = composeObject.networks) !== null && _a !== void 0 ? _a : {})) {
networks.push(new network_1.default(network[0]));
}
for (const volume of Object.entries((_b = composeObject.volumes) !== null && _b !== void 0 ? _b : {})) {
volumes.push(new volume_1.default(volume[0], 'volumeset', volume[1], context, composePath));
}
for (const secret of Object.entries((_c = composeObject.secrets) !== null && _c !== void 0 ? _c : {})) {
secrets.push(new secret_1.default(secret[0], secret[1], context, composePath));
}
for (const config of Object.entries((_d = composeObject.configs) !== null && _d !== void 0 ? _d : {})) {
secrets.push(new secret_1.default(config[0], config[1], context, composePath));
}
for (const service of Object.entries((_e = composeObject.services) !== null && _e !== void 0 ? _e : {})) {
services.push(new service_1.default(service[0], service[1], context, networks, volumes, secrets, composeObject, composePath, registry, profile));
}
return {
networks,
volumes,
secrets,
services,
};
}
exports.getResourcesFromCompose = getResourcesFromCompose;
//# sourceMappingURL=util.js.map
;