@sap/adp-cf
Version:
cf service logic for all yeoman generators
157 lines • 7.6 kB
JavaScript
;
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 __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 __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 });
const cf_tools_1 = require("@sap/cf-tools");
const types_1 = require("@sap/cf-tools/out/src/types");
const cfLocal = __importStar(require("@sap/cf-tools/out/src/cf-local"));
const ENV = { env: { "CF_COLOR": "false" } };
const excludeList = ["portal", "html5-apps-repo"];
const serviceNameText = "service-name";
class CFCredentials {
static getCredentials(mtaYaml) {
return __awaiter(this, void 0, void 0, function* () {
const resources = mtaYaml.resources;
return resources.reduce((updatedServiceAccumulator, service) => __awaiter(this, void 0, void 0, function* () {
const result = yield updatedServiceAccumulator;
if (!excludeList.includes(service.parameters.service)) {
const tags = yield CFCredentials.getServiceTags(service.parameters.service);
const guid = yield CFCredentials.getServiceInstance(service.parameters[serviceNameText]);
const keys = yield CFCredentials.getOrCreateServiceKeys(guid[0].guid, service.parameters[serviceNameText]);
result[service.parameters.service] = [
{
label: service.parameters.service,
name: service.parameters[serviceNameText],
tags: tags[0].tags,
credentials: keys[0]
}
];
}
return result;
}), Promise.resolve({}));
});
}
static updateServiceInstance(serviceInstanceName, xsSecurityJson) {
return __awaiter(this, void 0, void 0, function* () {
const cliResult = yield cf_tools_1.Cli.execute(["update-service", serviceInstanceName, "-c", JSON.stringify(xsSecurityJson)], ENV);
if (cliResult.exitCode !== 0) {
throw new Error(cliResult.stdout || `couldn't update service instance: ${serviceInstanceName}`);
}
});
}
static getServiceInstance(serviceInstanceName) {
return __awaiter(this, void 0, void 0, function* () {
const query = yield cf_tools_1.Cli.execute(["curl", `/v3/service_instances?names=${serviceInstanceName}`], ENV);
const json = CFCredentials.parseStdOut(query, query.error || `Failed to get service instance ${serviceInstanceName}`);
return json.resources.map((resource) => {
return {
guid: resource.guid
};
});
});
}
static createServiceKey(serviceInstanceName, serviceKeyName) {
return __awaiter(this, void 0, void 0, function* () {
const cliResult = yield cf_tools_1.Cli.execute(["create-service-key", serviceInstanceName, serviceKeyName], ENV);
if (cliResult.exitCode !== 0) {
throw new Error(cliResult.stdout || `couldn't create a service instance: ${serviceInstanceName}`);
}
});
}
static getServiceTags(serviceName) {
return __awaiter(this, void 0, void 0, function* () {
const query = yield cf_tools_1.Cli.execute(["curl", `/v3/service_offerings?names=${serviceName}`], ENV);
const json = CFCredentials.parseStdOut(query, query.error || `Failed to get service tags for ${serviceName}'`);
return json.resources.map((resource) => {
return {
tags: resource.tags
};
});
});
}
static getServiceKeys(serviceInstanceGuid) {
return __awaiter(this, void 0, void 0, function* () {
return cfLocal.cfGetInstanceCredentials({
filters: [
{
key: types_1.eFilters.service_instance_guid,
value: serviceInstanceGuid
}
]
});
});
}
static getOrCreateServiceKeys(serviceInstanceGuid, serviceInstanceName) {
return __awaiter(this, void 0, void 0, function* () {
const credentials = yield CFCredentials.getServiceKeys(serviceInstanceGuid);
if (credentials.length !== 0) {
return credentials;
}
yield CFCredentials.createServiceKey(serviceInstanceName, serviceInstanceName + "_key");
return CFCredentials.getServiceKeys(serviceInstanceGuid);
});
}
static parseStdOut(query, message) {
if (query.exitCode !== 0) {
throw new Error(message);
}
const json = JSON.parse(query.stdout);
if (json.errors && json.errors.length) {
const errorMessage = CFCredentials.parseCFError(json.errors[0]);
throw new Error(errorMessage);
}
return json;
}
static parseCFError(error) {
switch (error.code) {
case 10005:
return "An invalid query parameter was given";
case 1000:
return "An invalid auth token was given";
case 10002:
return "No auth token was given, but authentication is required for this endpoint. Please login in CF";
case 10003:
return "The authenticated user does not have permission to perform this operation";
case 10010:
return "The specified resource does not exist, or the authenticated user cannot read it";
case 10008:
return error.detail;
case 10001:
return "An unexpected, uncaught error occurred; the CC logs will contain more information";
default:
return "An unexpected, uncaught error occurred";
}
}
}
exports.default = CFCredentials;
//# sourceMappingURL=CFCredentials.js.map