@broadcom/endevor-for-zowe-cli
Version:
Endevor Plug-in for Zowe CLI
321 lines • 32 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
};
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);
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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