@broadcom/endevor-for-zowe-cli
Version:
Endevor Plug-in for Zowe CLI
221 lines • 24.8 kB
JavaScript
"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 });
const imperative_1 = require("@zowe/imperative");
const path = require("path");
const api_1 = require("../../../api");
const AsyncUtils_1 = require("../../../api/utils/AsyncUtils");
const index_1 = require("../../../index");
const fs = require("fs");
class RetrieveElementHandler extends index_1.AbstractElementActionHandler {
process(commandParameters) {
const _super = Object.create(null, {
process: { get: () => super.process }
});
return __awaiter(this, void 0, void 0, function* () {
if (commandParameters.arguments["to-dir"] == null) {
yield _super.process.call(this, commandParameters);
}
else {
yield this.processBulkRetrieve(commandParameters);
}
});
}
sendRequest() {
return __awaiter(this, void 0, void 0, function* () {
if (this.actionName.startsWith("VIEW")) {
return api_1.EndevorClient.viewElement(this.session)(this.instance)(this.args);
}
else {
return api_1.EndevorClient.retrieveElement(this.session)(this.instance)(this.args);
}
});
}
processBulkRetrieve(commandParameters) {
return __awaiter(this, void 0, void 0, function* () {
this.args = commandParameters.arguments;
this.commandConsole = commandParameters.response.console;
this.actionName = this.args._[1].trim().toUpperCase();
this.instance = api_1.EndevorRestUtils.setInstance(this.args);
this.session = yield api_1.EndevorRestUtils.setupEndevorSession(this.args, true);
const task = {
percentComplete: 0,
statusMessage: "Preparing a list of elements to be retrieved",
stageName: imperative_1.TaskStage.IN_PROGRESS
};
commandParameters.response.progress.startBar({ task });
const listElementResponse = yield api_1.EndevorClient.listElement(this.session)(this.instance)(this.args);
const listElementResponseBody = listElementResponse.body;
const listElementResult = listElementResponseBody.data;
if (listElementResponseBody.returnCode !== 0) {
this.errorHandling(listElementResponseBody);
return;
}
const fileExtensionResolution = this.args["file-extension"];
const types = [];
if (fileExtensionResolution == api_1.FileExtensionResolution.FILE_EXT ||
fileExtensionResolution == api_1.FileExtensionResolution.MIXED) {
const listTypeResponse = yield api_1.EndevorClient.listType(this.session)(this.instance)(this.args);
if (listTypeResponse.body.returnCode !== 0) {
this.errorHandling(listTypeResponse.body);
return;
}
listTypeResponse.body.data.forEach((type) => types.push(type));
}
let excludeFromListAction = undefined;
let listOfElementsTobeRetrieved;
if (this.args["with-dependencies"] == null || !this.args["with-dependencies"]) {
listOfElementsTobeRetrieved = listElementResult;
}
else {
this.args.search = "yes";
this.args.excCirculars = "yes";
this.args.excIndirect = "no";
this.args.excRelated = "no";
task.percentComplete = 50;
const queryacmCompResponse = yield api_1.EndevorClient.queryAcmComponent(this.session)(this.instance)(this.args);
const queryacmCompResponseBody = queryacmCompResponse.body;
const queryacmCompResult = queryacmCompResponseBody.data;
if (queryacmCompResponseBody.returnCode !== 0) {
const nomatch = api_1.QueryACMComponents.isNoMatch(queryacmCompResponseBody.returnCode, queryacmCompResult, queryacmCompResponseBody.messages);
if (nomatch) {
listOfElementsTobeRetrieved = listElementResult;
}
else {
this.errorHandling(queryacmCompResponseBody, false);
return;
}
}
excludeFromListAction = listElementResult.map((elm) => api_1.EndevorUtils.endevorElmToElmBasicData(elm));
listOfElementsTobeRetrieved = api_1.BulkRetrieveElement.processACMandListElmResult(queryacmCompResult, listElementResult);
}
commandParameters.response.progress.endBar();
yield this.bulkRetrieveListOfElements(this.session, this.instance, listOfElementsTobeRetrieved, commandParameters.response.progress, commandParameters.response.format, excludeFromListAction);
return;
});
}
errorHandling(responseBody, nomatch) {
return __awaiter(this, void 0, void 0, function* () {
const isWriteReport = index_1.HandlerUtils.ifWriteReportsToFile(this.args["write-report"], responseBody.returnCode);
if (isWriteReport && responseBody.reports != null) {
const logStack = [];
yield api_1.EndevorRestUtils.writeConsoleOutput(this.session, this.instance, responseBody.reports, isWriteReport, logStack, this.args["report-file"], this.args["report-dir"], this.args["suppress-messages"]);
if (logStack.length > 0) {
this.commandConsole.log(logStack.join("\n"));
}
}
if (nomatch == null)
nomatch = api_1.ListElement.isNoMatch(responseBody.returnCode, responseBody.data, responseBody.messages);
const errMsg = `Unable to prepare a list of elements to be retrieved`;
if (responseBody.returnCode > this.args.maxrc) {
if (nomatch) {
throw new imperative_1.ImperativeError({
msg: `[ERROR] ${errMsg}\n[ERROR] No matching ELEMENT found.`
});
}
else {
throw new imperative_1.ImperativeError({
msg: `[ERROR] ${errMsg}\n` +
index_1.HandlerUtils.getWarnErrorInfo(responseBody.returnCode, responseBody.reasonCode, responseBody.messages).join("\n")
});
}
}
else if (this.args["suppress-messages"] == null || !this.args["suppress-messages"]) {
if (nomatch) {
this.commandConsole.log(`[WARN] ${errMsg}\n[WARN] No matching ELEMENT found.`);
}
else {
this.commandConsole.log(`[WARN] ${errMsg}\n` +
index_1.HandlerUtils.getWarnErrorInfo(responseBody.returnCode, responseBody.reasonCode, responseBody.messages).join("\n"));
}
}
});
}
bulkRetrieveListOfElements(session, instance, elmsTobeRet, progressApi, commandConsoleFormat, excludeFromList) {
return __awaiter(this, void 0, void 0, function* () {
var _a;
const now = new Date(Date.now());
const reportFileName = path.join((_a = this.args["report-dir"]) !== null && _a !== void 0 ? _a : this.args["to-dir"], api_1.ApiConstants.REPORT_FILE_NAME_PREFIX +
"bulkRetrieve-" +
api_1.EndevorUtils.formatDate(now, false) +
"-" +
api_1.EndevorUtils.formatTime(now, true, "") +
".txt");
api_1.WorkspaceUtils.ensureDirectoryExistence(reportFileName);
const fileExtensionResolution = this.args["file-extension"]
? this.args["file-extension"].toUpperCase()
: api_1.FileExtensionResolution.MIXED;
const retrieveFailed = [];
const retrieveFailedWithinMaxRC = [];
const retrieveOptions = api_1.RetrieveElement.setupRetrieveRequest(this.args);
let maxConcurrentRequests = 1;
if (elmsTobeRet.length > 2) {
const serverConfig = yield api_1.WorkspaceUtils.getServerConfig(session, instance);
maxConcurrentRequests = AsyncUtils_1.AsyncUtils.getRecommendedThreadCount(serverConfig);
}
yield AsyncUtils_1.AsyncUtils.pooledParallelExec(elmsTobeRet, (elmTobeRet) => __awaiter(this, void 0, void 0, function* () {
const elmBasicData = api_1.EndevorUtils.endevorElmToElmBasicData(elmTobeRet);
const performListElements = this.args["with-dependencies"] != null && this.args["with-dependencies"];
const fileSuffix = api_1.WorkspaceUtils.getFileSuffix(elmTobeRet.typeName, elmTobeRet.fileExt, fileExtensionResolution);
let retries = 0;
let result = api_1.EndevorActionStatusDetailed.NOT_RUN;
do {
result = yield api_1.BulkRetrieveElement.performIndividualRetrieve(session, instance, elmBasicData, this.args["to-dir"], this.args["flat"], retrieveOptions, this.args["maxrc"], fileSuffix, this.args["write-report"], this.args["report-dir"], reportFileName, this.args["suppress-messages"], this.args["charset"], performListElements, excludeFromList);
retries++;
} while (result == api_1.EndevorActionStatusDetailed.FAILURE_STC_SHORTAGE && retries < 5);
if (result == api_1.EndevorActionStatusDetailed.FAILURE) {
retrieveFailed.push(elmBasicData);
return false;
}
if (result == api_1.EndevorActionStatusDetailed.FAILURE_MAX_RC) {
retrieveFailedWithinMaxRC.push(elmBasicData);
return false;
}
return true;
}), maxConcurrentRequests, `Retrieving ${elmsTobeRet.length} elements`, progressApi);
this.commandConsole.log(`Processing the bulk retrieve of ${elmsTobeRet.length} elements in total complete. Result is written in ${path.resolve(this.args["to-dir"])}`);
this.commandConsole.log(`Retrieve succeeded ` +
`for ${elmsTobeRet.length - retrieveFailedWithinMaxRC.length - retrieveFailed.length} of ${elmsTobeRet.length} elements`);
const fieldFilter = ["element", "type", "environment", "stageNumber", "system", "subsystem"];
if (retrieveFailedWithinMaxRC.length > 0) {
this.commandConsole.log(`Retrieve failed because of exceeding the maxrc ${this.args.maxrc} ` +
`for ${retrieveFailedWithinMaxRC.length} of ${elmsTobeRet.length} elements`);
commandConsoleFormat.output({
fields: fieldFilter,
output: retrieveFailedWithinMaxRC,
format: "table",
header: true
});
}
if (retrieveFailed.length > 0) {
this.commandConsole.log(`[ERROR] Retrieve failed for ${retrieveFailed.length} of ${elmsTobeRet.length} elements`);
commandConsoleFormat.output({
fields: fieldFilter,
output: retrieveFailed,
format: "table",
header: true
});
}
if (fs.existsSync(reportFileName)) {
if (this.args["suppress-messages"] == null || !this.args["suppress-messages"]) {
this.commandConsole.log(`[INFO] Endevor reports written in ${reportFileName}`);
}
}
if (retrieveFailed.length > 0) {
throw new imperative_1.ImperativeError({
msg: `[ERROR] Bulk action was not successful for all elements.`
});
}
});
}
}
exports.default = RetrieveElementHandler;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmV0cmlldmVFbGVtZW50LmhhbmRsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY2xpL3JldHJpZXZlL2VsZW1lbnQvUmV0cmlldmVFbGVtZW50LmhhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUF1QkEsaURBTzBCO0FBQzFCLDZCQUE4QjtBQUM5QixzQ0F5QnNCO0FBQ3RCLDhEQUEyRDtBQUMzRCwwQ0FBNEU7QUFDNUUseUJBQTBCO0FBUTFCLE1BQXFCLHNCQUF1QixTQUFRLG9DQUE0QjtJQUNqRSxPQUFPLENBQUMsaUJBQXFDOzs7OztZQUN4RCxJQUFJLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQztnQkFFbEQsTUFBTSxPQUFNLE9BQU8sWUFBQyxpQkFBaUIsQ0FBQyxDQUFDO1lBQ3pDLENBQUM7aUJBQU0sQ0FBQztnQkFDTixNQUFNLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1lBQ3BELENBQUM7UUFDSCxDQUFDO0tBQUE7SUFFSyxXQUFXOztZQUNmLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztnQkFDdkMsT0FBTyxtQkFBYSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUMzRCxJQUFJLENBQUMsSUFBc0UsQ0FDNUUsQ0FBQztZQUNKLENBQUM7aUJBQU0sQ0FBQztnQkFDTixPQUFPLG1CQUFhLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQy9ELElBQUksQ0FBQyxJQUFzRSxDQUM1RSxDQUFDO1lBQ0osQ0FBQztRQUNILENBQUM7S0FBQTtJQVNZLG1CQUFtQixDQUFDLGlCQUFxQzs7WUFDcEUsSUFBSSxDQUFDLElB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