@topgroup/diginext
Version:
A BUILD SERVER & CLI to deploy apps to any Kubernetes clusters.
275 lines (274 loc) • 11.9 kB
JavaScript
"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;