@sap/adp-cf
Version:
cf service logic for all yeoman generators
212 lines • 10.5 kB
JavaScript
;
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());
});
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const messages_1 = require("../i18n/messages");
const CFLocal = require("@sap/cf-tools/out/src/cf-local");
const CFToolsCli = require("@sap/cf-tools/out/src/cli");
const types_1 = require("@sap/cf-tools/out/src/types");
const fs_1 = __importDefault(require("fs"));
const path_1 = __importDefault(require("path"));
const _1 = require("./");
const adp_common_1 = require("@sap/adp-common");
class CFUtils {
static getServiceInstanceKeys(serviceInstanceQuery) {
var _a, _b;
return __awaiter(this, void 0, void 0, function* () {
try {
const serviceInstances = yield this.getServiceInstance(serviceInstanceQuery);
if ((serviceInstances === null || serviceInstances === void 0 ? void 0 : serviceInstances.length) > 0) {
// we can use any instance in the list to connect to HTML5 Repo
(_a = adp_common_1.Logger.getLogger) === null || _a === void 0 ? void 0 : _a.log(`Use '${serviceInstances[0].name}' HTML5 Repo instance`);
return {
credentials: yield this.getOrCreateServiceKeys(serviceInstances[0]),
serviceInstance: serviceInstances[0]
};
}
return null;
}
catch (error) {
const errorMessage = messages_1.Messages.FAILED_TO_GET_SERVICE_INSTANCE_KEYS(error.message);
(_b = adp_common_1.Logger.getLogger) === null || _b === void 0 ? void 0 : _b.error(errorMessage);
throw new Error(errorMessage);
}
});
}
static createService(spaceGuid, plan, serviceInstanceName, tags = [], securityFilePath = null, serviceName = null) {
return __awaiter(this, void 0, void 0, function* () {
try {
if (!serviceName) {
const json = yield this.requestCfApi(`/v3/service_offerings?per_page=1000&space_guids=${spaceGuid}`);
serviceName = json.resources.find((resource) => resource.tags && tags.every((tag) => resource.tags.includes(tag))).name;
}
adp_common_1.Logger.getLogger.log(`Creating service instance '${serviceInstanceName}' of service '${serviceName}' with '${plan}' plan`);
const commandParameters = ["create-service", serviceName, plan, serviceInstanceName];
if (securityFilePath) {
let xsSecurity = null;
try {
const filePath = path_1.default.resolve(__dirname, "../templates/cf/xs-security.json");
const xsContent = fs_1.default.readFileSync(filePath, "utf-8");
xsSecurity = JSON.parse(xsContent);
xsSecurity.xsappname = _1.YamlUtils.getProjectNameForXsSecurity();
}
catch (err) {
throw new Error("xs-security.json could not be parsed.");
}
commandParameters.push("-c");
commandParameters.push(JSON.stringify(xsSecurity));
}
const query = yield CFToolsCli.Cli.execute(commandParameters);
if (query.exitCode !== 0) {
throw new Error(query.stderr);
}
}
catch (error) {
adp_common_1.Logger.getLogger.error(messages_1.Messages.FAILED_TO_CREATE_SERVICE_INSTANCE(serviceInstanceName, spaceGuid, error.message));
throw new Error(messages_1.Messages.FAILED_TO_CREATE_SERVICE_INSTANCE(serviceInstanceName, spaceGuid, error.message));
}
});
}
static requestCfApi(url) {
return __awaiter(this, void 0, void 0, function* () {
try {
const response = yield CFToolsCli.Cli.execute(["curl", url], this.ENV);
if (response.exitCode === 0) {
try {
return JSON.parse(response.stdout);
}
catch (error) {
throw new Error(messages_1.Messages.FAILED_TO_PARSE_RESPONSE_FROM_CF(error.message));
}
}
throw new Error(response.stderr);
}
catch (error) {
// log error: CFUtils.ts=>requestCfApi(params)
throw new Error(messages_1.Messages.REQUEST_TO_CF_API_FAILED(error.message));
}
});
}
static getAuthToken() {
return __awaiter(this, void 0, void 0, function* () {
const response = yield CFToolsCli.Cli.execute(["oauth-token"], this.ENV);
if (response.exitCode === 0) {
return response.stdout;
}
return response.stderr;
});
}
static checkForCf() {
return __awaiter(this, void 0, void 0, function* () {
try {
const response = yield CFToolsCli.Cli.execute(["version"], this.ENV);
if (response.exitCode !== 0) {
throw new Error(response.stderr);
}
}
catch (error) {
// log error: CFUtils.ts=>checkForCf
throw new Error(messages_1.Messages.CLOUD_FOUNDRY_NOT_INSTALLED);
}
});
}
static cFLogout() {
return __awaiter(this, void 0, void 0, function* () {
yield CFToolsCli.Cli.execute(["logout"]);
});
}
static getServiceInstance(params) {
return __awaiter(this, void 0, void 0, function* () {
const PARAM_MAP = new Map([
["spaceGuids", "space_guids"],
["planNames", "service_plan_names"],
["names", "names"]
]);
const parameters = Object.entries(params)
.filter(([key, value]) => (value === null || value === void 0 ? void 0 : value.length) > 0)
.map(([key, value]) => `${PARAM_MAP.get(key)}=${value.join(",")}`);
const uriParameters = parameters.length > 0 ? `?${parameters.join("&")}` : "";
const uri = `/v3/service_instances` + uriParameters;
try {
const json = yield this.requestCfApi(uri);
if (json && json.resources && Array.isArray(json.resources)) {
return json.resources.map((service) => ({
name: service.name,
guid: service.guid
}));
}
throw new Error(messages_1.Messages.NO_VALID_JSON_FOR_SERVICE_INSTANCE);
}
catch (error) {
// log error: CFUtils.ts=>getServiceInstance with uriParameters
throw new Error(messages_1.Messages.FAILED_TO_GET_SERVICE_INSTANCE(uriParameters, error.message));
}
});
}
static getOrCreateServiceKeys(serviceInstance) {
return __awaiter(this, void 0, void 0, function* () {
try {
const credentials = yield this.getServiceKeys(serviceInstance.guid);
if ((credentials === null || credentials === void 0 ? void 0 : credentials.length) > 0) {
return credentials;
}
else {
const serviceKeyName = serviceInstance.name + "_key";
adp_common_1.Logger.getLogger.log(`Creating service key '${serviceKeyName}' for service instance '${serviceInstance.name}'`);
yield this.createServiceKey(serviceInstance.name, serviceKeyName);
return this.getServiceKeys(serviceInstance.guid);
}
}
catch (error) {
// log error: CFUtils.ts=>getOrCreateServiceKeys with param
throw new Error(messages_1.Messages.FAILED_TO_GET_OR_CREATE_SERVICE_KEYS(serviceInstance.name, error.message));
}
});
}
static getServiceKeys(serviceInstanceGuid) {
return __awaiter(this, void 0, void 0, function* () {
try {
return yield CFLocal.cfGetInstanceCredentials({
filters: [
{
value: serviceInstanceGuid,
key: types_1.eFilters.service_instance_guid
}
]
});
}
catch (error) {
// log error: CFUtils.ts=>getServiceKeys for guid
throw new Error(messages_1.Messages.FAILED_TO_GET_INSTANCE_CREDENTIALS(serviceInstanceGuid, error.message));
}
});
}
static createServiceKey(serviceInstanceName, serviceKeyName) {
return __awaiter(this, void 0, void 0, function* () {
try {
const cliResult = yield CFToolsCli.Cli.execute([this.CREATE_SERVICE_KEY, serviceInstanceName, serviceKeyName], this.ENV);
if (cliResult.exitCode !== 0) {
throw new Error(cliResult.stderr);
}
}
catch (error) {
// log error: CFUtils.ts=>createServiceKey for serviceInstanceName
throw new Error(messages_1.Messages.FAILED_TO_CREATE_SERVICE_KEY_FOR_INSTANCE(serviceInstanceName, error.message));
}
});
}
}
exports.default = CFUtils;
CFUtils.ENV = { env: { "CF_COLOR": "false" } };
CFUtils.CREATE_SERVICE_KEY = "create-service-key";
//# sourceMappingURL=CFUtils.js.map