UNPKG

@intuitionrobotics/google-services

Version:
191 lines 9.61 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.GoogleCloudManager = exports.GoogleCloudManager_Class = void 0; const ts_common_1 = require("@intuitionrobotics/ts-common"); const googleapis_1 = require("googleapis"); const AuthModule_1 = require("./AuthModule"); var Serviceusage = googleapis_1.serviceusage_v1.Serviceusage; var Cloudresourcemanager = googleapis_1.cloudresourcemanager_v2.Cloudresourcemanager; var CloudresourcemanagerV1 = googleapis_1.cloudresourcemanager_v1.Cloudresourcemanager; const consts_1 = require("./consts"); class GoogleCloudManager_Class extends ts_common_1.Module { constructor() { super("GoogleCloudManager"); this.setDefaultConfig({ scopes: [consts_1.GCPScope.CloudPlatform] }); } init() { this.cloudServicesManagerAPI = new Serviceusage(AuthModule_1.AuthModule.getAuth(this.config.authKey, this.config.scopes, 'v1')); this.cloudResourcesManagerAPI = new Cloudresourcemanager(AuthModule_1.AuthModule.getAuth(this.config.authKey, this.config.scopes)); this.cloudResourcesManagerAPIv1 = new CloudresourcemanagerV1(AuthModule_1.AuthModule.getAuth(this.config.authKey, this.config.scopes, 'v1')); } // FOLDERS getOrCreateFolder(parentFolderId, folderName) { return __awaiter(this, void 0, void 0, function* () { if (parentFolderId === undefined) throw new ts_common_1.BadImplementationException("MUST provide a parentFolderId"); if (folderName === undefined) throw new ts_common_1.BadImplementationException("MUST provide a folderName"); const folders = yield this.queryFolders({ parentId: parentFolderId, folderName }); let parentFolder; if (folders.length > 1) throw new ts_common_1.ThisShouldNotHappenException("too many folders for query..."); else if (folders.length === 1) parentFolder = folders[0]; else parentFolder = yield this.createFolder({ parentId: parentFolderId, folderName }); if (!parentFolder) throw new ts_common_1.BadImplementationException("MUST be parentFolder"); return this.getFolderId(parentFolder); }); } createFolder(_request) { return __awaiter(this, void 0, void 0, function* () { const request = { parent: `folders/${_request.parentId}`, requestBody: { displayName: _request.folderName } }; this.logInfo(`Creating GCP folder "${_request.parentId}/${_request.folderName}"`); const res = yield this.cloudResourcesManagerAPI.folders.create(request); return yield this._waitForFolderOperation(res.data.name); }); } queryFolders(_query) { return __awaiter(this, void 0, void 0, function* () { const query = { query: `parent=folders/${_query.parentId} AND displayName=${_query.folderName}` }; const res = yield this.cloudResourcesManagerAPI.folders.search({ requestBody: query }); return res.data.folders || []; }); } getFolderId(folder) { return folder.name.replace("folders/", ""); } _waitForFolderOperation(name) { return __awaiter(this, void 0, void 0, function* () { let retry = 5; while (retry >= 0) { yield (0, ts_common_1.timeout)(2000); const res = yield this.cloudResourcesManagerAPI.operations.get({ name }); if (res.data.done) return res.data.response; retry--; } throw new ts_common_1.ImplementationMissingException("need better handling here.."); }); } // PROJECTS listProjects() { return __awaiter(this, arguments, void 0, function* (filter = () => true) { const results = yield this.cloudResourcesManagerAPIv1.projects.list(); const projects = results.data.projects || []; return projects.filter(filter); }); } getOrCreateProjects(parentId, ...projects) { return __awaiter(this, void 0, void 0, function* () { const existingProjects = yield this.listProjects(gcproject => !!projects.find(project => project.name === gcproject.name)); const projectsToCreate = projects .filter((project) => !existingProjects.find((gcproject) => gcproject.name === project.name)); const newProjects = yield Promise.all(projectsToCreate.map(project => this.createProject(parentId, project.projectId, project.name))); const allProjects = (0, ts_common_1.filterInstances)([...existingProjects, ...newProjects]); return projects.map(project => allProjects.find(gcpProject => gcpProject.name === project.name)); }); } createProject(parentId_1, projectId_1) { return __awaiter(this, arguments, void 0, function* (parentId, projectId, name = projectId) { const options = { projectId, name, parent: { type: "folder", id: parentId } }; this.logInfo(`Creating GCP Project "${parentId}/${projectId}/${name}"`); const response = yield this.cloudResourcesManagerAPIv1.projects.create({ requestBody: options }); return this._waitForProjectOperation(response.data.name); }); } _waitForProjectOperation(name) { return __awaiter(this, void 0, void 0, function* () { let retry = 5; while (retry >= 0) { yield (0, ts_common_1.timeout)(2000); const res = yield this.cloudResourcesManagerAPIv1.operations.get({ name }); if (res.data.done) return res.data.response; retry--; } throw new ts_common_1.ImplementationMissingException("need better handling here.."); }); } // SERVICES getService(serviceKey, projectId) { return __awaiter(this, void 0, void 0, function* () { const res = yield this.cloudServicesManagerAPI.services.get({ name: `projects/${projectId}/services/${serviceKey}` }); return res.data; }); } enableService(serviceKey, enable, ...projectIds) { return __awaiter(this, void 0, void 0, function* () { this.logInfo(`Enabling Service "${serviceKey}" for projects: ${(0, ts_common_1.__stringify)(projectIds)}`); return Promise.all(projectIds.map(projectId => this._enableService(serviceKey, projectId, enable))); }); } // @ts-ignore _enableService(serviceKey_1, projectId_1) { return __awaiter(this, arguments, void 0, function* (serviceKey, projectId, enable = true) { let service = yield this.getService(serviceKey, projectId); if (this._isEnabled(service) === enable) return this.logVerbose(`Service "${serviceKey}" was already enabled for project: ${projectId}`); const name = service.name; let res; if (enable) res = yield this.cloudServicesManagerAPI.services.enable({ name }); else res = yield this.cloudServicesManagerAPI.services.disable({ name }); service = yield this._waitForServiceOperation(res.data.name); if (this._isEnabled(service)) this.logVerbose(`Service "${serviceKey}" is now enabled for project: ${projectId}`); else this.logError(`Service "${serviceKey}" is now disabled for project: ${projectId}`); return service; }); } _waitForServiceOperation(name) { return __awaiter(this, void 0, void 0, function* () { var _a; let retry = 5; while (retry >= 0) { yield (0, ts_common_1.timeout)(2000); const res = yield this.cloudServicesManagerAPI.operations.get({ name }); if (res.data.done) return (_a = res.data.response) === null || _a === void 0 ? void 0 : _a.service; retry--; } throw new ts_common_1.ImplementationMissingException("need better handling here.."); }); } isEnabled(serviceKey, projectId) { return __awaiter(this, void 0, void 0, function* () { const service = yield this.getService(serviceKey, projectId); return this._isEnabled(service); }); } _isEnabled(service) { return service.state === "ENABLED"; } } exports.GoogleCloudManager_Class = GoogleCloudManager_Class; exports.GoogleCloudManager = new GoogleCloudManager_Class(); //# sourceMappingURL=GoogleCloudModule.js.map