UNPKG

@topgroup/diginext

Version:

A BUILD SERVER & CLI to deploy apps to any Kubernetes clusters.

141 lines (140 loc) 6.54 kB
"use strict"; 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;