@broadcom/endevor-for-zowe-cli
Version:
Endevor Plug-in for Zowe CLI
332 lines • 33.1 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());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.EndevorRestClient = void 0;
const imperative_1 = require("@zowe/imperative");
const index_1 = require("../index");
const stream_1 = require("stream");
class EndevorRestClient extends imperative_1.AbstractRestClient {
static putJSONExpectJSON(session, resource, payload, versionRequired = "2.0", headers) {
const requestOptions = {
resource,
request: imperative_1.HTTP_VERB.PUT,
reqHeaders: [index_1.EndevorHeaders.CONTENT_APPLICATION_JSON, index_1.EndevorHeaders.ACCEPT_APPLICATION_JSON],
writeData: payload
};
headers === null || headers === void 0 ? void 0 : headers.forEach((header) => {
var _a;
(_a = requestOptions.reqHeaders) === null || _a === void 0 ? void 0 : _a.push(header);
});
return EndevorRestClient.sendRequest(session, requestOptions, versionRequired);
}
static getJSONtoQueryExpectJSON(session_1, resource_1, payload_1) {
return __awaiter(this, arguments, void 0, function* (session, resource, payload, versionRequired = "2.0", headers) {
const requestOptions = {
resource: index_1.EndevorRestUtils.queryParameterString(resource, payload),
request: imperative_1.HTTP_VERB.GET,
reqHeaders: [index_1.EndevorHeaders.ACCEPT_APPLICATION_JSON]
};
headers === null || headers === void 0 ? void 0 : headers.forEach((header) => {
var _a;
(_a = requestOptions.reqHeaders) === null || _a === void 0 ? void 0 : _a.push(header);
});
return EndevorRestClient.sendRequest(session, requestOptions, versionRequired);
});
}
static deleteJSONtoQuery(session_1, resource_1, payload_1) {
return __awaiter(this, arguments, void 0, function* (session, resource, payload, versionRequired = "2.0", headers) {
const requestOptions = {
resource: index_1.EndevorRestUtils.queryParameterString(resource, payload),
request: imperative_1.HTTP_VERB.DELETE,
reqHeaders: []
};
headers === null || headers === void 0 ? void 0 : headers.forEach((header) => {
var _a;
(_a = requestOptions.reqHeaders) === null || _a === void 0 ? void 0 : _a.push(header);
});
return EndevorRestClient.sendRequest(session, requestOptions, versionRequired);
});
}
static getJSONtoQueryExpectSTREAM(session_1, resource_1, payload_1) {
return __awaiter(this, arguments, void 0, function* (session, resource, payload, versionRequired = "2.0", headers) {
const requestOptions = {
resource: index_1.EndevorRestUtils.queryParameterString(resource, payload),
request: imperative_1.HTTP_VERB.GET,
reqHeaders: [index_1.EndevorHeaders.ACCEPT_OCTET_STREAM]
};
headers === null || headers === void 0 ? void 0 : headers.forEach((header) => {
var _a;
(_a = requestOptions.reqHeaders) === null || _a === void 0 ? void 0 : _a.push(header);
});
return EndevorRestClient.sendRequest(session, requestOptions, versionRequired);
});
}
static getJSONtoQueryExpectTEXT(session_1, resource_1, payload_1) {
return __awaiter(this, arguments, void 0, function* (session, resource, payload, versionRequired = "2.0", headers) {
const requestOptions = {
resource: index_1.EndevorRestUtils.queryParameterString(resource, payload),
request: imperative_1.HTTP_VERB.GET,
reqHeaders: [index_1.EndevorHeaders.ACCEPT_TEXT_PLAIN]
};
headers === null || headers === void 0 ? void 0 : headers.forEach((header) => {
var _a;
(_a = requestOptions.reqHeaders) === null || _a === void 0 ? void 0 : _a.push(header);
});
return EndevorRestClient.sendRequest(session, requestOptions, versionRequired);
});
}
static postForm(session_1, resource_1, postForm_1) {
return __awaiter(this, arguments, void 0, function* (session, resource, postForm, versionRequired = "2.0", headers) {
const pass = new stream_1.Stream.PassThrough();
postForm.pipe(pass);
const requestOptions = {
resource,
request: imperative_1.HTTP_VERB.POST,
reqHeaders: [{ "content-type": postForm.getHeaders()["content-type"] }],
requestStream: pass
};
headers === null || headers === void 0 ? void 0 : headers.forEach((header) => {
var _a;
(_a = requestOptions.reqHeaders) === null || _a === void 0 ? void 0 : _a.push(header);
});
return EndevorRestClient.sendRequest(session, requestOptions, versionRequired);
});
}
static putForm(session_1, resource_1, postForm_1) {
return __awaiter(this, arguments, void 0, function* (session, resource, postForm, versionRequired = "2.0", headers) {
const pass = new stream_1.Stream.PassThrough();
postForm.pipe(pass);
const requestOptions = {
resource,
request: imperative_1.HTTP_VERB.PUT,
reqHeaders: [{ "content-type": postForm.getHeaders()["content-type"] }],
requestStream: pass
};
headers === null || headers === void 0 ? void 0 : headers.forEach((header) => {
var _a;
(_a = requestOptions.reqHeaders) === null || _a === void 0 ? void 0 : _a.push(header);
});
return EndevorRestClient.sendRequest(session, requestOptions, versionRequired);
});
}
static getInstances(session_1) {
return __awaiter(this, arguments, void 0, function* (session, versionRequired = "2.0") {
const requestOptions = {
resource: "/",
request: imperative_1.HTTP_VERB.GET
};
const instancesResponse = yield EndevorRestClient.sendRequest(session, requestOptions, versionRequired);
const normalizedResponse = {
headers: instancesResponse.headers,
body: {
returnCode: 0,
reasonCode: 0,
data: [],
messages: [],
reports: {},
statusCode: instancesResponse.body.statusCode
},
isResponseJSON: true
};
if (instancesResponse.body.description) {
normalizedResponse.body.data.push(instancesResponse.body);
}
else {
for (const value of Object.values(instancesResponse.body)) {
if (value.description)
normalizedResponse.body.data.push(value);
}
}
return normalizedResponse;
});
}
static getReport(session, instance, reportURI) {
return __awaiter(this, void 0, void 0, function* () {
const requestOptions = {
resource: `/${instance}/${reportURI}`.replace(/\/\//g, "/"),
request: imperative_1.HTTP_VERB.GET
};
index_1.EndevorRestUtils.failIfUsingV1(session);
const response = yield EndevorRestClient.sendRequest(session, requestOptions).catch((err) => {
return {
body: {
data: [
`report not downloaded due to HTTP error: ${JSON.stringify(err, null, 2).replace(/^(\s*)(.*\\n.*)$/gm, (line, indent) => line.replace(/\\n/g, "\n" + indent))}`
]
}
};
});
return response.body.data[0] ? response.body.data[0].toString() : "";
});
}
static sendRequest(session_1, requestOptions_1) {
return __awaiter(this, arguments, void 0, function* (session, requestOptions, versionRequired = "2.0") {
return new Promise((resolve, reject) => {
var _a;
index_1.EndevorRestUtils.failIfUsingV1(session);
if (requestOptions.resource && requestOptions.resource.startsWith("/")) {
requestOptions.resource = requestOptions.resource.substring(1);
}
if (requestOptions.resource == "") {
requestOptions.resource += "/.";
}
const client = new EndevorRestClient(session);
const reqHeaders = (_a = requestOptions.reqHeaders) !== null && _a !== void 0 ? _a : [];
reqHeaders.push(index_1.EndevorHeaders.ACCEPT_GZIP_DEFLATE);
reqHeaders.push(index_1.EndevorClient.getUserAgentHeader());
const pass = new stream_1.Stream.PassThrough();
pass.on("error", (err) => {
reject(err);
});
const resDataBuffer = [];
pass.on("data", (chunk) => {
resDataBuffer.push(chunk);
});
const resolveSuccessfulRequest = () => {
var _a, _b, _c, _d;
if (client.response && client.response.headers) {
const statusCode = client.response.statusCode;
try {
EndevorRestClient.checkRestVersion((_a = client.response) === null || _a === void 0 ? void 0 : _a.headers, versionRequired);
}
catch (error) {
reject(error);
}
const produceContentType = client.response.headers["content-type"];
if (produceContentType != undefined && produceContentType.startsWith("application/json")) {
try {
let resBody = imperative_1.JSONUtils.parse(Buffer.concat(resDataBuffer).toString(), "The request appeared to succeed, but the response was not in the expected format");
resBody = Object.assign(Object.assign({}, resBody), { returnCode: Number(resBody.returnCode), reasonCode: Number(resBody.reasonCode), statusCode: statusCode });
resolve({ headers: (_b = client.response) === null || _b === void 0 ? void 0 : _b.headers, body: resBody, isResponseJSON: true });
}
catch (error) {
reject(error);
}
}
else {
const response = {
headers: (_c = client.response) === null || _c === void 0 ? void 0 : _c.headers,
body: {
returnCode: 0,
reasonCode: 0,
data: [],
reports: index_1.EndevorRestUtils.getHeaderLinks((_d = client.response) === null || _d === void 0 ? void 0 : _d.headers),
messages: [],
statusCode: statusCode
},
isResponseJSON: false
};
if (produceContentType != undefined && produceContentType.startsWith("text/plain")) {
response.body.data.push(Buffer.concat(resDataBuffer).toString());
}
else {
response.body.data.push(Buffer.concat(resDataBuffer));
}
resolve(response);
}
}
};
pass.on("end", () => {
if (client.requestSuccess) {
resolveSuccessfulRequest();
}
});
requestOptions = Object.assign(Object.assign({}, requestOptions), { reqHeaders, responseStream: pass });
client.log.debug(`Endevor - Sending request to session: ${JSON.stringify(session.ISession)}`);
client
.request(requestOptions)
.then(() => {
client.log.debug(`Endevor - Request finished with HTTP status 2xx`);
})
.catch((requestErr) => {
var _a, _b, _c;
client.log.debug(`Endevor - Request finished with HTTP status > 200`);
const errData = requestErr.causeErrors;
const statusCode = (_a = client.response) === null || _a === void 0 ? void 0 : _a.statusCode;
if (index_1.EndevorRestUtils.isEndevorRestResponseBody(errData)) {
client.log.debug(`Endevor - Response is in Endevor response format: ${JSON.stringify(errData)}`);
let resBody;
try {
EndevorRestClient.checkRestVersion((_b = client.response) === null || _b === void 0 ? void 0 : _b.headers, versionRequired);
resBody = imperative_1.JSONUtils.parse(errData.toString(), "The request appeared to succeed, but the response was not in the expected format");
resBody = Object.assign(Object.assign({}, resBody), { returnCode: Number(resBody.returnCode), reasonCode: Number(resBody.reasonCode), statusCode: statusCode });
resolve({ headers: (_c = client.response) === null || _c === void 0 ? void 0 : _c.headers, body: resBody, isResponseJSON: true });
}
catch (error) {
reject(error);
}
}
else {
if (index_1.EndevorRestUtils.isHTTPProtocolError(errData, session)) {
const httpError = new imperative_1.ImperativeError({
msg: "This combination of host and port requires TLS. ",
additionalDetails: `The Endevor Web Services at ${session.ISession.hostname}:${session.ISession.port} require HTTPS protocol but Endevor profile is configured with HTTP protocol.\n` +
`Update Endevor profile or use '--protocol https' option with each command.`
});
reject(httpError);
}
else {
if (requestErr.msg == undefined && requestErr.additionalDetails == undefined) {
requestErr.msg = `HTTP(S) client encountered an error. Request could not be initiated to host.
${requestErr.causeErrors}
Protocol: ${session.ISession.protocol}
Host: ${session.ISession.hostname}
Port: ${session.ISession.port}
Base Path: ${session.ISession.basePath}
Reject Unauthorized: ${session.ISession.rejectUnauthorized}`;
reject(requestErr);
}
else
reject(requestErr);
}
}
});
});
});
}
static checkRestVersion(resHeader, versionRequired = "2.0") {
if (resHeader != null) {
const versionReceived = resHeader === null || resHeader === void 0 ? void 0 : resHeader.version;
if (versionReceived != null) {
if (!index_1.EndevorRestUtils.isSemVer(versionReceived)) {
throw new imperative_1.ImperativeError({
msg: "Illegal value found on the Version response header: " + versionReceived
});
}
if (index_1.EndevorRestUtils.isSemVerGreater(versionRequired, versionReceived)) {
throw new imperative_1.ImperativeError({
msg: `You are using Endevor Rest API v${versionReceived}. The request requires Endevor Rest API to be upgraded to v${versionRequired} or higher`
});
}
}
else {
const legacyVersion = resHeader["API-Version"];
if (legacyVersion != null && legacyVersion >= 1) {
throw new imperative_1.ImperativeError({
msg: "API v1 Version response header found, and this command requires API v2. Please upgrade your basepath to use Endevor Rest API v2.0 and above"
});
}
else {
throw new imperative_1.ImperativeError({
msg: "No Version response header found. Please upgrade your basepath to use Endevor Rest API v2.0 and above"
});
}
}
}
else {
throw new imperative_1.ImperativeError({
msg: "No response header found"
});
}
}
}
exports.EndevorRestClient = EndevorRestClient;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRW5kZXZvclJlc3RDbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBpL3V0aWxzL0VuZGV2b3JSZXN0Q2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQXVCQSxpREFRMEI7QUFFMUIsb0NBT2tCO0FBQ2xCLG1DQUFnQztBQVNoQyxNQUFhLGlCQUFrQixTQUFRLCtCQUFrQjtJQWNoRCxNQUFNLENBQUMsaUJBQWlCLENBQzdCLE9BQWdCLEVBQ2hCLFFBQWdCLEVBQ2hCLE9BQVksRUFDWixlQUFlLEdBQUcsS0FBSyxFQUN2QixPQUEwQjtRQUUxQixNQUFNLGNBQWMsR0FBaUI7WUFDbkMsUUFBUTtZQUNSLE9BQU8sRUFBRSxzQkFBUyxDQUFDLEdBQUc7WUFDdEIsVUFBVSxFQUFFLENBQUMsc0JBQWMsQ0FBQyx3QkFBd0IsRUFBRSxzQkFBYyxDQUFDLHVCQUF1QixDQUFDO1lBQzdGLFNBQVMsRUFBRSxPQUFPO1NBQ25CLENBQUM7UUFFRixPQUFPLGFBQVAsT0FBTyx1QkFBUCxPQUFPLENBQUUsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7O1lBQzFCLE1BQUEsY0FBYyxDQUFDLFVBQVUsMENBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzFDLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLGNBQWMsRUFBRSxlQUFlLENBQUMsQ0FBQztJQUNqRixDQUFDO0lBaUJNLE1BQU0sQ0FBTyx3QkFBd0I7NkRBQzFDLE9BQWdCLEVBQ2hCLFFBQWdCLEVBQ2hCLE9BQVksRUFDWixlQUFlLEdBQUcsS0FBSyxFQUN2QixPQUEwQjtZQUsxQixNQUFNLGNBQWMsR0FBaUI7Z0JBQ25DLFFBQVEsRUFBRSx3QkFBZ0IsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDO2dCQUNsRSxPQUFPLEVBQUUsc0JBQVMsQ0FBQyxH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