@intuitionrobotics/google-services
Version:
191 lines • 9.61 kB
JavaScript
"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