UNPKG

@topgroup/diginext

Version:

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

275 lines (274 loc) 11.9 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 __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 __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 __metadata = (this && this.__metadata) || function (k, v) { if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); }; var __param = (this && this.__param) || function (paramIndex, decorator) { return function (target, key) { decorator(target, key, paramIndex); } }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const dist_1 = require("tsoa/dist"); const entities = __importStar(require("../entities")); const interfaces = __importStar(require("../interfaces")); const ResponseData_1 = require("../interfaces/ResponseData"); const k8s_1 = __importDefault(require("../modules/k8s")); const CloudProviderService_1 = require("../services/CloudProviderService"); const ClusterService_1 = require("../services/ClusterService"); const BaseController_1 = __importDefault(require("./BaseController")); let ClusterController = class ClusterController extends BaseController_1.default { constructor() { super(new ClusterService_1.ClusterService()); } /** * List of K8S clusters of a workspace */ read(queryParams) { return super.read(); } /** * List of K8S clusters (include system default clusters) */ async readAll(queryParams) { try { const data = await this.service.findAll(this.filter, this.options, this.pagination); return (0, ResponseData_1.respondSuccess)({ data }); } catch (e) { return (0, ResponseData_1.respondFailure)(`Unable to get clusters: ${e}`); } } async create(body, queryParams) { // validation - round 1 let errors = []; if (!body.provider) errors.push(`Cloud Provider ID is required.`); if (typeof body.isVerified === "undefined") body.isVerified = false; if (errors.length > 0) return { status: 0, messages: errors }; // validate cloud provider... const cloudProviderSvc = new CloudProviderService_1.CloudProviderService(); const cloudProvider = await cloudProviderSvc.findOne({ _id: body.provider }); if (!cloudProvider) return (0, ResponseData_1.respondFailure)(`Cloud Provider "${body.provider}" not found.`); body.providerShortName = cloudProvider.shortName; // validation - round 2 errors = []; if (cloudProvider.shortName === "gcloud") { if (!body.shortName) errors.push(`GKE cluster name is required (Learn more: https://cloud.google.com/kubernetes-engine/docs/how-to/managing-clusters).`); if (!body.serviceAccount) errors.push(`Google Service Account (JSON) is required.`); // if (!body.region) errors.push(`Google cluster region is required.`); if (!body.zone) errors.push(`Google cluster zone is required.`); } if (cloudProvider.shortName === "digitalocean") { if (!body.shortName) errors.push(`DOK cluster name is required (Learn more: https://docs.digitalocean.com/products/kubernetes/how-to/connect-to-cluster/).`); if (!body.apiAccessToken) errors.push(`Digital Ocean API Access Token is required.`); // if (!body.region) errors.push(`Digital Ocean cluster region is required.`); } if (cloudProvider.shortName === "custom") { if (!body.kubeConfig) errors.push(`Kube config data (YAML) is required.`); } if (errors.length > 0) return { status: 0, messages: errors }; // create new cluster let newCluster = await this.service.create(body); if (newCluster) { try { newCluster = await k8s_1.default.authCluster(newCluster, { ownership: this.ownership }); if (!newCluster) return (0, ResponseData_1.respondFailure)(`Failed to connect to the cluster, please double check your information.`); return (0, ResponseData_1.respondSuccess)({ data: newCluster }); } catch (e) { return (0, ResponseData_1.respondFailure)(`Failed to connect to the cluster: ${e}`); } } else { return (0, ResponseData_1.respondFailure)(`Unable to create new cluster (internal server error).`); } } async update(body, queryParams) { // find cluster to update let cluster = await this.service.findOne(this.filter, { ...this.options, populate: ["provider"] }); // update to database cluster = await this.service.updateOne({ _id: cluster._id }, body); // console.log("[CLUSTER CONTROLLER] UPDATE > cluster :>> ", cluster); return (0, ResponseData_1.respondSuccess)({ data: cluster }); } async delete(queryParams) { try { const data = await this.service.delete(this.filter, this.options); return data.ok ? (0, ResponseData_1.respondSuccess)({ data }) : (0, ResponseData_1.respondFailure)({ data }); } catch (e) { return (0, ResponseData_1.respondFailure)(e.toString()); } } /** * Verify this cluster accessibility, then switch the current context to this cluster * - Similar to `/verify` */ async connect(queryParams) { let cluster = await this.service.findOne(this.filter, this.options); if (!cluster) return (0, ResponseData_1.respondFailure)(`Cluster not found.`); try { cluster = await this.service.authCluster(cluster, { isDebugging: this.options.isDebugging, shouldSwitchContextToThisCluster: true, ownership: this.ownership, }); return (0, ResponseData_1.respondSuccess)({ data: cluster }); } catch (e) { return (0, ResponseData_1.respondFailure)(e.toString()); } } /** * Verify this cluster accessibility, **won't** switch the current context to this cluster * - Similar to `/connect` */ async verify(queryParams) { let cluster = await this.service.findOne(this.filter, this.options); if (!cluster) return (0, ResponseData_1.respondFailure)(`Cluster not found.`); try { // verify but won't cluster = await this.service.authCluster(cluster, { isDebugging: this.options.isDebugging, shouldSwitchContextToThisCluster: false, ownership: this.ownership, }); return (0, ResponseData_1.respondSuccess)({ data: cluster }); } catch (e) { return (0, ResponseData_1.respondFailure)(e.toString()); } } async createImagePullSecret(body) { try { const data = await this.service.createImagePullSecret(this.filter, body, this.options); return data ? (0, ResponseData_1.respondSuccess)({ data }) : (0, ResponseData_1.respondFailure)({ data }); } catch (e) { return (0, ResponseData_1.respondFailure)(e.toString()); } } }; __decorate([ (0, dist_1.Security)("api_key"), (0, dist_1.Security)("jwt"), (0, dist_1.Get)("/"), __param(0, (0, dist_1.Queries)()), __metadata("design:type", Function), __metadata("design:paramtypes", [Object]), __metadata("design:returntype", void 0) ], ClusterController.prototype, "read", null); __decorate([ (0, dist_1.Security)("api_key"), (0, dist_1.Security)("jwt"), (0, dist_1.Get)("/all"), __param(0, (0, dist_1.Queries)()), __metadata("design:type", Function), __metadata("design:paramtypes", [Object]), __metadata("design:returntype", Promise) ], ClusterController.prototype, "readAll", null); __decorate([ (0, dist_1.Security)("api_key"), (0, dist_1.Security)("jwt"), (0, dist_1.Post)("/"), __param(0, (0, dist_1.Body)()), __param(1, (0, dist_1.Queries)()), __metadata("design:type", Function), __metadata("design:paramtypes", [Object, Object]), __metadata("design:returntype", Promise) ], ClusterController.prototype, "create", null); __decorate([ (0, dist_1.Security)("api_key"), (0, dist_1.Security)("jwt"), (0, dist_1.Patch)("/"), __param(0, (0, dist_1.Body)()), __param(1, (0, dist_1.Queries)()), __metadata("design:type", Function), __metadata("design:paramtypes", [Object, Object]), __metadata("design:returntype", Promise) ], ClusterController.prototype, "update", null); __decorate([ (0, dist_1.Security)("api_key"), (0, dist_1.Security)("jwt"), (0, dist_1.Delete)("/"), __param(0, (0, dist_1.Queries)()), __metadata("design:type", Function), __metadata("design:paramtypes", [Object]), __metadata("design:returntype", Promise) ], ClusterController.prototype, "delete", null); __decorate([ (0, dist_1.Security)("api_key"), (0, dist_1.Security)("jwt"), (0, dist_1.Get)("/connect"), __param(0, (0, dist_1.Queries)()), __metadata("design:type", Function), __metadata("design:paramtypes", [Object]), __metadata("design:returntype", Promise) ], ClusterController.prototype, "connect", null); __decorate([ (0, dist_1.Security)("api_key"), (0, dist_1.Security)("jwt"), (0, dist_1.Get)("/verify"), __param(0, (0, dist_1.Queries)()), __metadata("design:type", Function), __metadata("design:paramtypes", [Object]), __metadata("design:returntype", Promise) ], ClusterController.prototype, "verify", null); __decorate([ (0, dist_1.Security)("api_key"), (0, dist_1.Security)("jwt"), (0, dist_1.Post)("/image-pull-secret"), __param(0, (0, dist_1.Body)()), __metadata("design:type", Function), __metadata("design:paramtypes", [Object]), __metadata("design:returntype", Promise) ], ClusterController.prototype, "createImagePullSecret", null); ClusterController = __decorate([ (0, dist_1.Tags)("Cluster"), (0, dist_1.Route)("cluster"), __metadata("design:paramtypes", []) ], ClusterController); exports.default = ClusterController;