@topgroup/diginext
Version:
A BUILD SERVER & CLI to deploy apps to any Kubernetes clusters.
141 lines (140 loc) • 6.54 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;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.deleteClusterInKubeConfig = exports.getKubeContextByClusterSlug = exports.getKubeContextByCluster = exports.getAllContexts = exports.currentCluster = exports.currentContext = exports.getKubeConfig = void 0;
const fs_1 = require("fs");
const js_yaml_1 = __importDefault(require("js-yaml"));
const const_1 = require("../../config/const");
const plugins_1 = require("../../plugins");
async function getKubeConfig(filePath) {
let currentKubeConfigContent;
if (filePath) {
if (!(0, fs_1.existsSync)(filePath)) {
throw new Error(`File "${filePath}" not found.`);
}
currentKubeConfigContent = await (0, plugins_1.execCmd)(`kubectl config --kubeconfig ${filePath} view --flatten`);
}
else {
currentKubeConfigContent = await (0, plugins_1.execCmd)(`kubectl config view --flatten`, `Can't get current "kubeconfig"`);
}
if (!currentKubeConfigContent)
return;
const currentKubeConfig = js_yaml_1.default.load(currentKubeConfigContent);
return currentKubeConfig;
}
exports.getKubeConfig = getKubeConfig;
/**
* Get current context of KUBE_CONFIG
*/
async function currentContext() {
const kubeConfig = await getKubeConfig();
return kubeConfig["current-context"];
}
exports.currentContext = currentContext;
/**
* Get current cluster of KUBE_CONFIG
*/
async function currentCluster() {
const kubeConfig = await getKubeConfig();
const curContextName = kubeConfig["current-context"];
return kubeConfig.contexts.find((ctx) => ctx.name === curContextName);
}
exports.currentCluster = currentCluster;
/**
* Get all available Kubernetes contexts of the build server
*/
const getAllContexts = async (filePath) => {
const currentKubeConfig = await getKubeConfig(filePath);
return currentKubeConfig.contexts;
};
exports.getAllContexts = getAllContexts;
/**
* Get KUBE_CONTEXT by {Cluster} instance
* @param cluster - A cluster
* @param filePath - [optional] - A ".kubeconfig" YAML file path
* @returns
*/
async function getKubeContextByCluster(cluster, filePath) {
const { slug, providerShortName: provider, shortName } = cluster;
const kubeConfig = await getKubeConfig(filePath);
if (!kubeConfig)
throw new Error(`Can't get Kubernetes context of "${slug}" cluster (${provider}) due to empty KUBE_CONFIG.`);
const listContexts = kubeConfig.contexts || [];
let context;
let contexts;
if (provider === "digitalocean") {
contexts = listContexts.filter((ctx) => ctx.name.startsWith("do-"));
context = contexts.find((ctx) => ctx.name.indexOf(shortName) > -1);
}
else if (provider === "gcloud") {
contexts = listContexts.filter((ctx) => ctx.name.startsWith("gke_"));
context = contexts.find((ctx) => ctx.name.indexOf(shortName) > -1);
}
else {
context = listContexts.find((ctx) => ctx.name === slug);
}
if (!context) {
// logWarn(`Kubernetes context not found of "${slug}" cluster (${provider}), current contexts: ${listContexts.map((ctx) => ctx.name)}.`);
throw new Error(`Kubernetes context "${shortName}" not found of "${slug}" cluster (${provider}).`);
}
return context;
}
exports.getKubeContextByCluster = getKubeContextByCluster;
/**
* Get KUBE_CONTEXT by cluster's short name & cloud provider's short name
* @param slug - A cluster slug on the cloud provider (**NOT** a cluster in `kubeconfig`)
* @param provider - A cloud provider short name. One of "digitalocean", "gcloud" or "custom"
* @param filePath - [optional] - A service account file path
* @returns
*/
async function getKubeContextByClusterSlug(slug, provider, filePath) {
const { DB } = await Promise.resolve().then(() => __importStar(require("../../modules/api/DB")));
const cluster = await DB.findOne("cluster", { slug });
return getKubeContextByCluster(cluster);
}
exports.getKubeContextByClusterSlug = getKubeContextByClusterSlug;
async function deleteClusterInKubeConfig(cluster, filePath) {
const { slug, providerShortName: provider, shortName } = cluster;
const kubeConfig = await getKubeConfig(filePath);
if (!kubeConfig)
throw new Error(`Can't get Kubernetes context of "${slug}" cluster (${provider}) due to empty KUBE_CONFIG.`);
// delete cluster access credentials in KUBE_CONFIG file
kubeConfig.clusters = kubeConfig.clusters.filter((_cluster) => _cluster.name !== cluster.contextName);
kubeConfig.users = kubeConfig.users.filter((_user) => (cluster.providerShortName === "custom" && _user.name !== `${cluster.slug}-user`) ||
(cluster.providerShortName === "digitalocean" && _user.name !== `${cluster.contextName}-admin`) ||
(cluster.providerShortName === "gcloud" && _user.name !== cluster.contextName));
kubeConfig.contexts = kubeConfig.contexts.filter((ctx) => ctx.name !== cluster.contextName);
if (kubeConfig["current-context"] === cluster.contextName)
kubeConfig["current-context"] = "";
// save to "~/.kube/config"
const finalKubeConfigContent = js_yaml_1.default.dump(kubeConfig);
// log(finalKubeConfigContent);
(0, fs_1.writeFileSync)(const_1.KUBECONFIG_FILE, finalKubeConfigContent, "utf8");
return kubeConfig;
}
exports.deleteClusterInKubeConfig = deleteClusterInKubeConfig;