UNPKG

@broadcom/endevor-for-zowe-cli

Version:

Endevor Plug-in for Zowe CLI

221 lines 24.8 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 }); 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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