UNPKG

@broadcom/endevor-for-zowe-cli

Version:

Endevor Plug-in for Zowe CLI

321 lines 32 kB
"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.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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