UNPKG

@broadcom/endevor-for-zowe-cli

Version:

Endevor Plug-in for Zowe CLI

320 lines 39.5 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.MergeElement = void 0; const imperative_1 = require("@zowe/imperative"); const __1 = require(".."); const IEndevorWorkspaceEnums_1 = require("./doc/IEndevorWorkspaceEnums"); const SubmitSCL_1 = require("../submitSCL/SubmitSCL"); const FormData = require("form-data"); class MergeElement { static mergeElement(session, instance, location, workspaceArgs, progressApi) { return __awaiter(this, void 0, void 0, function* () { var _a, _b, _c, _d; const filter = new __1.EndevorWorkspaceFilter(); filter.addLocation(location); const mergeLocation = { environment: (_a = workspaceArgs["merge-environment"]) !== null && _a !== void 0 ? _a : location.environment, stageNumber: (_b = workspaceArgs["merge-stage-number"]) !== null && _b !== void 0 ? _b : location.stageNumber, system: (_c = workspaceArgs["merge-system"]) !== null && _c !== void 0 ? _c : location.system, subsystem: (_d = workspaceArgs["merge-subsystem"]) !== null && _d !== void 0 ? _d : location.subsystem, type: location.type, element: location.element }; const result = yield this.mergeElementImpl(session, instance, location, mergeLocation, filter, workspaceArgs["dry-run"], workspaceArgs["signout"], workspaceArgs["override-signout"], workspaceArgs.limit, workspaceArgs["merge-out-of-sync"], workspaceArgs["ccid"], workspaceArgs["comment"], workspaceArgs["workspace-dir"], progressApi); return new __1.EndevorWorkspaceResponse(result); }); } static mergeElementImpl(session, instance, location, mergeLocation, filter, optDryRun, optSignout, optOveSign, optLimit, optMergeOSS, optCcid, optComment, optWorkspace, progressApi) { return __awaiter(this, void 0, void 0, function* () { if (__1.EndevorUtils.areBasicDataEqual(mergeLocation, location) && !optMergeOSS) { return { errorMessages: [ "You need to specify either a merge location (different from target location), or the merge-out-of-sync option." ] }; } const serverConfig = yield __1.WorkspaceUtils.getServerConfig(session, instance); const maxConcurrentRequests = __1.AsyncUtils.getRecommendedThreadCount(serverConfig); let state; try { state = yield __1.SyncWorkspace.buildWorkspaceState(session, instance, optWorkspace, filter, serverConfig, progressApi); } catch (reponse) { return reponse; } const oosCount = this.checkWorkspaceSync(state); if (oosCount > 0) { state.errorMessages.push(`'${state.workspaceDir}' is not in sync with the specified Endevor location. Merge can only be used when the affected local workspace files are fully synchronized.`); state.infoMessages.push(`${oosCount} element${oosCount == 1 ? "" : "s"} need${oosCount == 1 ? "s" : ""} synchronization. Use the following command to synchronize ${oosCount == 1 ? "it" : "them"} first:`); state.infoMessages.push(" "); state.infoMessages.push(` zowe endevor synchronize workspace ${optWorkspace == undefined || optWorkspace == "." ? "" : state.workspaceDir} --env ${location.environment} --sn ${location.stageNumber} --sys ${location.system} --sub ${location.subsystem} --type ${location.type} --ele ${location.element}`); state.infoMessages.push(" "); return state; } let mergeActions = []; if (optMergeOSS) { mergeActions = yield this.generateActionsForResync(state, session, instance, progressApi); if (mergeActions.length == 0) { state.infoMessages.push("No elements out of sync with their next version up the map have been found."); } } else { mergeActions = yield this.generateActions(state, session, instance, mergeLocation, progressApi); if (mergeActions.length == 0) { state.infoMessages.push("No elements to merge."); } } state.mergeActions = mergeActions; const actionCount = mergeActions.length; const ccid = optCcid == null ? "" : optCcid; const comment = optComment == null ? "" : optComment; if (actionCount != 0) { if (optDryRun) { state.infoMessages.push("No actions executed, because 'dry-run' option was specified."); } else if (optLimit != 0 && actionCount > optLimit) { state.warningMessages.push(`Number of required actions (${actionCount}) exceeded the specified limit of ${optLimit}. No actions were performed.`); } else { yield __1.AsyncUtils.pooledParallelExec(mergeActions, (action) => __awaiter(this, void 0, void 0, function* () { yield action.performAction(session, instance, ccid, comment, optSignout, optOveSign); }), maxConcurrentRequests, `Merging ${mergeActions.length} element${mergeActions.length == 1 ? "" : "s"}..`, progressApi); yield __1.WorkspaceUtils.saveState(state); mergeActions.forEach((action) => { if (action.statusDetailed == IEndevorWorkspaceEnums_1.EndevorActionStatusDetailed.FAILURE_SIGNOUT) { state.signoutOverrideNeeded = true; } if (action.statusDetailed == IEndevorWorkspaceEnums_1.EndevorActionStatusDetailed.SUCCESS_MANUAL_MERGE_STARTED) { state.unresolvedMergeConflicts = true; } if (action.statusDetailed == IEndevorWorkspaceEnums_1.EndevorActionStatusDetailed.NOT_RUN_MANUAL_MERGE_IN_PROGRESS) { state.unresolvedMergeConflicts = true; } }); } } __1.WorkspaceUtils.composeActionsSummaryMsgs(state); return state; }); } static checkWorkspaceSync(state) { let elementCount = 0; let outOfSyncCount = 0; for (const stageKey in state.environments) { const stage = state.environments[stageKey]; for (const systemKey in stage.systems) { const system = stage.systems[systemKey]; for (const subsystemKey in system.subsystems) { const subsystem = system.subsystems[subsystemKey]; for (const elementKey in subsystem.elements) { elementCount++; const element = subsystem.elements[elementKey]; if ((element.localStatus != IEndevorWorkspaceEnums_1.ElementVersionStatus.INSYNC && element.localStatus != IEndevorWorkspaceEnums_1.ElementVersionStatus.CONFLICT_RESOLUTION) || element.remoteStatus != IEndevorWorkspaceEnums_1.ElementVersionStatus.INSYNC) { outOfSyncCount++; } } } } } state.elementCount = elementCount; state.inSync = outOfSyncCount == 0; return outOfSyncCount; } static generateActionsForResync(state, session, instance, progressApi) { return __awaiter(this, void 0, void 0, function* () { if (state.filter == undefined) throw new Error("Internal error: workspace state object needs to have a defined filter"); if (state.filter.getElementListData().length > 1) { throw new Error("Internal error: not implemented - merge doesn't support multi-location workspaces yet"); } const promisedTask = { percentComplete: 0, statusMessage: "Determining which elements are out of sync..", stageName: imperative_1.TaskStage.IN_PROGRESS }; progressApi === null || progressApi === void 0 ? void 0 : progressApi.startBar({ task: promisedTask }); const mergeActions = []; const location = state.filter.getElementListData()[0]; const validateSyncSCL = `validate element '${location.element}' from env '${location.environment}' stage num '${location.stageNumber}' system '${location.system}' subsystem '${location.subsystem}' type '${location.type}' options synchronization .`; const validateFormData = new FormData(); validateFormData.append("sclString", validateSyncSCL); validateFormData.append("submitType", "element"); try { const validateRestResponse = yield SubmitSCL_1.SubmitSCL.submitSCL(session, instance, validateFormData); if (validateRestResponse.isResponseJSON && validateRestResponse.body != undefined) { let notFound = false; validateRestResponse.body.messages.forEach((message) => { if (message.startsWith("API0000W ELEMENT NOT FOUND")) { notFound = true; } }); if (notFound) { progressApi === null || progressApi === void 0 ? void 0 : progressApi.endBar(); return []; } if (validateRestResponse.body.returnCode > 8) { state.errorMessages.push(`Failed to validate elements to verify their sync status (rc ${validateRestResponse.body.returnCode}):`); state.errorMessages.push(...validateRestResponse.body.messages); progressApi === null || progressApi === void 0 ? void 0 : progressApi.endBar(); return []; } if (validateRestResponse.body.reports == undefined) { state.errorMessages.push(`Failed to validate elements to verify their sync status (report file missing):`); state.errorMessages.push(...validateRestResponse.body.messages); progressApi === null || progressApi === void 0 ? void 0 : progressApi.endBar(); return []; } const getMessagesResponse = yield __1.EndevorRestUtils.writeConsoleOutput(session, instance, validateRestResponse.body.reports, false, []); const C1MSGS2index = getMessagesResponse.indexOf(" E N D E V O R A C T I O N S U M M A R Y R E P O R T"); if (C1MSGS2index >= 0) { const C1MSGS2 = getMessagesResponse.substring(C1MSGS2index); __1.ElementUtils.parseElementC1MSGS2reports(C1MSGS2).forEach((reportLine) => { const sectionStart = getMessagesResponse.indexOf(`C1G0202I ACTION #${reportLine.actionNumber} / STMT #${reportLine.stmtNumber}`); if (sectionStart < 0) { state.warningMessages.push(`[WARN] Failed to parse C1MSGS1 report - ACTION #${reportLine.actionNumber} / STMT #${reportLine.stmtNumber} not found, element sync status not verified.`); return; } const nextSection = getMessagesResponse.indexOf(`C1G0202I ACTION #${parseInt(reportLine.actionNumber) + 1} / STMT #${reportLine.stmtNumber}`, sectionStart); const oosMessage = getMessagesResponse.indexOf(`SYNCHRONIZATION CONFLICT DETECTED FOR ELEMENT VVLL`, sectionStart); const oos = oosMessage > sectionStart && (nextSection < 0 || oosMessage < nextSection); if (oos) { let stage; if (state.environments[`${reportLine.environment}-1`] != undefined && state.environments[`${reportLine.environment}-1`].stageId == reportLine.stage) { stage = state.environments[`${reportLine.environment}-1`]; } else if (state.environments[`${reportLine.environment}-2`] != undefined && state.environments[`${reportLine.environment}-2`].stageId == reportLine.stage) { stage = state.environments[`${reportLine.environment}-2`]; } else { state.errorMessages.push("Environment ${environment} stage id ${stageId} not found in workspace"); } if (stage != undefined) { const system = stage.systems[reportLine.system]; const subsystem = system.subsystems[reportLine.subsystem]; const element = system.subsystems[reportLine.subsystem].elements[`${reportLine.elementName}.${reportLine.type}`]; const currentLocation = { environment: reportLine.environment, stageNumber: `${stage.stageNumber}`, system: reportLine.system, subsystem: reportLine.subsystem, type: reportLine.type, element: reportLine.elementName }; let fromLocation = { environment: reportLine.environment, stageNumber: "2", system: reportLine.system, subsystem: reportLine.subsystem, type: reportLine.type, element: reportLine.elementName }; if (location.stageNumber == "2") { fromLocation = { environment: stage.nextEnv, stageNumber: stage.nextStgNum, system: system.nextSystem == undefined ? system.name : system.nextSystem, subsystem: subsystem.nextSubsystem == undefined ? subsystem.name : subsystem.nextSubsystem, type: reportLine.type, element: reportLine.elementName }; } const eol = __1.WorkspaceUtils.getEndOfLineChars(system.types[element.type]); mergeActions.push(new __1.EndevorSyncActionMerge(element, currentLocation, state.nodeEncoding, eol, fromLocation, true, true, state.fileEncoding)); } } }); } } } catch (err) { state.errorMessages.push(`Failed to validate elements to verify their sync status: ` + err); } progressApi === null || progressApi === void 0 ? void 0 : progressApi.endBar(); return mergeActions; }); } static generateActions(state, session, instance, fromLocation, progressApi) { return __awaiter(this, void 0, void 0, function* () { var _a, _b, _c; if (state.filter == undefined) throw new Error("Internal error: workspace state object needs to have a defined filter"); if (state.filter.getElementListData().length > 1) { throw new Error("Internal error: not implemented - merge doesn't support multi-location workspaces yet"); } const promisedTask = { percentComplete: 0, statusMessage: "Determining which elements have a version in the merged location", stageName: imperative_1.TaskStage.IN_PROGRESS }; progressApi === null || progressApi === void 0 ? void 0 : progressApi.startBar({ task: promisedTask }); const listResults = yield __1.WorkspaceUtils.listElement(state, session, instance, fromLocation, false, true, true); if (listResults == null) return []; const mergeActions = []; for (const stageKey in state.environments) { const stage = state.environments[stageKey]; for (const systemKey in stage.systems) { const system = stage.systems[systemKey]; for (const subsystemKey in system.subsystems) { const subsystem = system.subsystems[subsystemKey]; for (const elementKey in subsystem.elements) { const element = subsystem.elements[elementKey]; const foundInList = listResults.filter((listItem) => { const elmMatch = listItem.fullElmName != undefined && listItem.fullElmName == element.fullName && listItem.typeName != undefined && listItem.typeName == element.type; return elmMatch; }); if (foundInList.length > 1) { state.warningMessages.push(`${element.fullName}.${element.type} matches more than 1 element at the merge location, merge skipped to prevent unintended results.`); } else if (foundInList.length == 1) { const currentLocation = { environment: stage.envName, stageNumber: `${stage.stageNumber}`, system: system.name, subsystem: subsystem.name, type: element.type, element: element.fullName }; const mergeLocation = { environment: (_a = foundInList[0].envName) !== null && _a !== void 0 ? _a : fromLocation.environment, stageNumber: foundInList[0].stgNum ? `${foundInList[0].stgNum}` : fromLocation.stageNumber, system: (_b = foundInList[0].sysName) !== null && _b !== void 0 ? _b : fromLocation.system, subsystem: (_c = foundInList[0].sbsName) !== null && _c !== void 0 ? _c : fromLocation.subsystem, type: element.type, element: element.fullName }; if (__1.EndevorUtils.areBasicDataEqual(currentLocation, mergeLocation)) { state.warningMessages.push(`Same version of ${element.fullName}.${element.type} was found at both the merge and target location, merge skipped.`); } else { const eol = __1.WorkspaceUtils.getEndOfLineChars(system.types[element.type]); mergeActions.push(new __1.EndevorSyncActionMerge(element, currentLocation, state.nodeEncoding, eol, mergeLocation, false, false, state.fileEncoding)); } } } } } } progressApi === null || progressApi === void 0 ? void 0 : progressApi.endBar(); return mergeActions; }); } } exports.MergeElement = MergeElement; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWVyZ2VFbGVtZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwaS93b3Jrc3BhY2UvTWVyZ2VFbGVtZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQXVCQSxpREFBNEY7QUFDNUYsMEJBZ0JZO0FBQ1oseUVBQWlHO0FBQ2pHLHNEQUFtRDtBQUNuRCxzQ0FBdUM7QUFFdkMsTUFBYSxZQUFZO0lBZWhCLE1BQU0sQ0FBTyxZQUFZLENBQzlCLE9BQWdCLEVBQ2hCLFFBQWdCLEVBQ2hCLFFBQTJCLEVBQzNCLGFBQWtDLEVBQ2xDLFdBQWlDOzs7WUFFakMsTUFBTSxNQUFNLEdBQTJCLElBQUksMEJBQXNCLEVBQUUsQ0FBQztZQUNwRSxNQUFNLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBRTdCLE1BQU0sYUFBYSxHQUFzQjtnQkFDdkMsV0FBVyxFQUFFLE1BQUEsYUFBYSxDQUFDLG1CQUFtQixDQUFDLG1DQUFJLFFBQVEsQ0FBQyxXQUFXO2dCQUN2RSxXQUFXLEVBQUUsTUFBQSxhQUFhLENBQUMsb0JBQW9CLENBQUMsbUNBQUksUUFBUSxDQUFDLFdBQVc7Z0JBQ3hFLE1BQU0sRUFBRSxNQUFBLGFBQWEsQ0FBQyxjQUFjLENBQUMsbUNBQUksUUFBUSxDQUFDLE1BQU07Z0JBQ3hELFNBQVMsRUFBRSxNQUFBLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxtQ0FBSSxRQUFRLENBQUMsU0FBUztnQkFDakUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJO2dCQUNuQixPQUFPLEVBQUUsUUFBUSxDQUFDLE9BQU87YUFDMUIsQ0FBQztZQUNGLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUN4QyxPQUFPLEVBQ1AsUUFBUSxFQUNSLFFBQVEsRUFDUixhQUFhLEVBQ2IsTUFBTSxFQUNOLGFBQWEsQ0FBQyxTQUFTLENBQUMsRUFDeEIsYUFBYSxDQUFDLFNBQVMsQ0FBQyxFQUN4Qixh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