UNPKG

@broadcom/mat-detect-for-zowe-cli

Version:

MAT Detect plug-in for Zowe CLI

273 lines 27.5 kB
"use strict"; /* * Copyright (c) 2019 Broadcom. All Rights Reserved. The term * "Broadcom" refers to Broadcom Inc. and/or its subsidiaries. * * This software and all information contained therein is * confidential and proprietary and shall not be duplicated, * used, disclosed, or disseminated in any way except as * authorized by the applicable license agreement, without the * express written permission of Broadcom. All authorized * reproductions must be marked with this language. * * EXCEPT AS SET FORTH IN THE APPLICABLE LICENSE AGREEMENT, TO * THE EXTENT PERMITTED BY APPLICABLE LAW, BROADCOM PROVIDES THIS * SOFTWARE WITHOUT WARRANTY OF ANY KIND, INCLUDING WITHOUT * LIMITATION, ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR * FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL BROADCOM * BE LIABLE TO THE END USER OR ANY THIRD PARTY FOR ANY LOSS OR * DAMAGE, DIRECT OR INDIRECT, FROM THE USE OF THIS SOFTWARE, * INCLUDING WITHOUT LIMITATION, LOST PROFITS, BUSINESS * INTERRUPTION, GOODWILL, OR LOST DATA, EVEN IF BROADCOM IS * EXPRESSLY ADVISED OF SUCH LOSS OR DAMAGE. */ 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 cli_1 = require("@zowe/cli"); const util_1 = require("util"); const fs = require("fs"); const mustache = require("mustache"); const PMAProfileValidationPlan = require("../../PMAProfileValidationPlan"); const ErrorValidationPlan = require("../../ErrorValidationPlan"); /** * "pma get-perf" command handler. Get the performance test result for the jobname. * @export * @class SubmitJobHandler * @implements {ICommandHandler} */ class SharedSubmitHandler { /** * Command handler process * @param {IHandlerParameters} params - Command handler parameters * @returns {Promise<void>} - Fulfilled when the command completes successfully OR rejected with imperative error * @memberof SubmitDataSetHandler */ process(params) { return __awaiter(this, void 0, void 0, function* () { // Save the needed parameters for convenience this.console = params.response.console; this.data = params.response.data; // this.profile = params.profiles.get("zosmf", true); // Create a z/OSMF session & submit the JCL // const session: Session = ZosmfSession.createBasicZosmfSession(this.profile); this.arguments = params.arguments; const parms = { jclSource: undefined, viewAllSpoolContent: this.arguments.viewAllSpoolContent, }; parms.viewAllSpoolContent = true; // setting default viewspool true // let apiObj: any; // API Object to set in the command JSON response // let spoolFilesResponse: ISpoolFile[]; // Response from view all spool content option const pmajob = "job$$$"; const jobname = this.arguments.jobname; // let jobname1: string = "jobname"; const pmadsc = "Included"; const pmadscd = "Included using Zowe CLI"; const pmastpn = "stp$$$"; const pmaprcn = "prc$$$"; let jobExldsc; let jobStepn = ""; let jobProcs = ""; const letterNumber = /^[0-9a-zA-Z]+$/; const ALLOWED_NUMBER = "0123456789"; // let Fileavail: IZosFilesResponse; // let Fileavail1: IZosFilesResponse; // const pmaProfile: IProfile = // params.profiles.get("pma", false); let errorJobn; let errorstepn; let errorprocs; const sysparm = { job_acct: params.arguments.job_acct, job_class: params.arguments.job_class, job_mclass: params.arguments.job_mclass, dsn_steplib: params.arguments.job_load, dsn_ksdsexc: params.arguments.job_pmahlq, }; // sysparm.job_class = ErrorValidationPlan.valarg(params.arguments.job_class, pmaProfile.job_class); // sysparm.job_mclass = ErrorValidationPlan.valarg(params.arguments.job_mclass, pmaProfile.job_mclass); // sysparm.job_acct = ErrorValidationPlan.valarg(params.arguments.job_acct, pmaProfile.job_acct); // sysparm.dsn_steplib = ErrorValidationPlan.valarg(params.arguments.job_load, pmaProfile.job_load); // sysparm.dsn_ksdsexc = ErrorValidationPlan.valarg(params.arguments.job_pmahlq, pmaProfile.job_pmahlq); if (!(0, util_1.isNullOrUndefined)(sysparm.dsn_ksdsexc)) { sysparm.dsn_ksdsexc = sysparm.dsn_ksdsexc + ".KSDSEXC"; } // validating pma parameters provided const errorClass = PMAProfileValidationPlan.checkJobClass(sysparm.job_class); const errorMClass = PMAProfileValidationPlan.checkJobMClass(sysparm.job_mclass); const errorAcct = PMAProfileValidationPlan.checkJobAcct(sysparm.job_acct); const errorJob = PMAProfileValidationPlan.checkDsName(sysparm.dsn_ksdsexc); const errorLib = PMAProfileValidationPlan.checkDsName(sysparm.dsn_steplib); errorJobn = PMAProfileValidationPlan.checkpmajobname(jobname); if (!(0, util_1.isNullOrUndefined)(params.arguments.st)) { jobStepn = params.arguments.st; errorstepn = PMAProfileValidationPlan.checkpmajobname(jobStepn); if (jobname.includes("*")) { errorJobn = "STEPNAME or PROCSTEP can not be added if JOBNAME contains *"; } } else { jobStepn = ""; } if (!(0, util_1.isNullOrUndefined)(params.arguments.ps)) { jobProcs = params.arguments.ps; errorprocs = PMAProfileValidationPlan.checkpmaproname(jobProcs); if (jobname.includes("*")) { errorJobn = "STEPNAME or PROCSTEP can not be added if JOBNAME contains *"; } } else { jobProcs = ""; } if (!(0, util_1.isNullOrUndefined)(params.arguments.dc)) { jobExldsc = params.arguments.dc; } yield this.sub_process(params, sysparm, parms, jobname, jobExldsc, jobStepn, jobProcs, pmadscd, pmastpn, pmaprcn, pmajob, pmadsc, errorJob, errorLib, errorClass, errorAcct, errorJobn, errorMClass, errorstepn, errorprocs); }); } sub_process(params, sysparm, parms, jobname, jobExldsc, jobStepn, jobProcs, pmadscd, pmastpn, pmaprcn, pmajob, pmadsc, errorJob, errorLib, errorClass, errorAcct, errorJobn, errorMClass, errorstepn, errorprocs) { return __awaiter(this, void 0, void 0, function* () { // let Fileavail: IZosFilesResponse; // let Fileavail1: IZosFilesResponse; if ((0, util_1.isNullOrUndefined)(errorJob) && (0, util_1.isNullOrUndefined)(errorLib) && (0, util_1.isNullOrUndefined)(errorClass) && (0, util_1.isNullOrUndefined)(errorAcct) && (0, util_1.isNullOrUndefined)(errorJobn) && (0, util_1.isNullOrUndefined)(errorMClass) && (0, util_1.isNullOrUndefined)(errorstepn) && (0, util_1.isNullOrUndefined)(errorprocs)) { // this.profile = params.profiles.get("zosmf", true); sysparm.dsn_steplib = sysparm.dsn_steplib.toUpperCase(); sysparm.dsn_ksdsexc = sysparm.dsn_ksdsexc.toUpperCase(); sysparm.job_class = PMAProfileValidationPlan.toUpperclass(sysparm.job_class); sysparm.job_mclass = PMAProfileValidationPlan.toUpperclass(sysparm.job_mclass); yield this.sub_process1(params, sysparm, parms, jobname, jobExldsc, jobStepn, jobProcs, pmadscd, pmastpn, pmaprcn, pmajob, pmadsc); } else { ErrorValidationPlan.throwparmerrorALT(errorJobn, "jobname", jobname); ErrorValidationPlan.throwparmerrorALT(errorprocs, "proc", jobProcs); ErrorValidationPlan.throwparmerrorALT(errorstepn, "step", jobStepn); ErrorValidationPlan.throwparmerror(errorJob, "KSDSEXC"); ErrorValidationPlan.throwparmerror(errorLib, "lib"); ErrorValidationPlan.throwparmerror(errorClass, "class"); ErrorValidationPlan.throwparmerror(errorMClass, "Mclass"); ErrorValidationPlan.throwparmerror(errorAcct, "Acct"); } }); } sub_process1(params, sysparm, parms, jobname, jobExldsc, jobStepn, jobProcs, pmadscd, pmastpn, pmaprcn, pmajob, pmadsc) { return __awaiter(this, void 0, void 0, function* () { // Create a z/OSMF session & submit the JCL const sessCfg = cli_1.ZosmfSession.createSessCfgFromArgs(params.arguments); const sessCfgWithCreds = yield imperative_1.ConnectionPropsForSessCfg.addPropsOrPrompt(sessCfg, params.arguments, { parms: params }); const session = new cli_1.imperative.Session(sessCfgWithCreds); let apiObj; // API Object to set in the command JSON response let jobname1 = "jobname"; const Fileavail = yield cli_1.List.dataSet(session, sysparm.dsn_steplib, { /* test */}); const Fileavail1 = yield cli_1.List.dataSet(session, sysparm.dsn_ksdsexc, { /* test */}); // checking profile data is valid or not if ((Fileavail.apiResponse.items.length > 0) && (Fileavail1.apiResponse.items.length > 0)) { const path = require("path"); const k = -17; const cliLib = __dirname.slice(0, k); let cliJcl = path.join("zossrc", "jcl", "IncJob.jcl"); let cliBuild = cliLib; cliJcl = cliLib + cliJcl; // if the build folde not created if (!fs.existsSync(cliBuild + "/build")) { fs.mkdirSync(cliBuild + "/build"); } cliBuild = cliBuild + "/build/IncJob.jcl"; // Reading the jcl template and updating with default.json values const jcl = fs.readFileSync(cliJcl).toString(); const rndrracf = mustache.render(jcl, sysparm); fs.writeFileSync(cliBuild, rndrracf); let jobText = fs.readFileSync(cliBuild).toString(); jobname1 = ErrorValidationPlan.valjobname(jobname, jobname1, "YES"); const number1 = 45; /* if (jobExldsc === undefined) { jobExldsc = pmadscd.toUpperCase().padEnd(number1); } else{ jobExldsc = jobExldsc.toUpperCase().padEnd(number1); }*/ (jobExldsc === undefined) ? jobExldsc = pmadscd.toUpperCase().padEnd(number1) : jobExldsc = jobExldsc.toUpperCase().padEnd(number1); const number2 = 8; /*if (jobStepn === undefined) { jobStepn = pmastpn.toUpperCase().padEnd(number1); } else{ jobStepn = jobStepn.toUpperCase().padEnd(number1); }*/ (jobStepn === undefined) ? jobStepn = pmastpn.toUpperCase().padEnd(number1) : jobStepn = jobStepn.toUpperCase().padEnd(number2); /*if (jobProcs === undefined) { jobProcs = pmaprcn.toUpperCase().padEnd(number1); } else{ jobProcs = jobProcs.toUpperCase().padEnd(number1); }*/ (jobProcs === undefined) ? jobProcs = pmaprcn.toUpperCase().padEnd(number1) : jobProcs = jobProcs.toUpperCase().padEnd(number2); jobText = jobText.replace(pmajob, jobname1); // replacing the template pmajob with user input job jobText = jobText.replace(pmadsc, jobExldsc); // replacing the template pmadsc with user input job jobText = jobText.replace(pmastpn, jobStepn); // replacing the template pmadsc with user input job jobText = jobText.replace(pmaprcn, jobProcs); // replacing the template pmadsc with user input job // Execute the final jobText using the submitJclString method apiObj = yield cli_1.SubmitJobs.submitJclString(session, jobText, parms); // source = "jobname"; yield this.sub_process2(params, parms, apiObj, jobname1); params.response.progress.endBar(); this.data.setMessage(`Submitted JCL jobname "PMAPERF" `); } else { ErrorValidationPlan.throwfileerrorALT(Fileavail.apiResponse.items.length, "lib", sysparm.dsn_steplib); ErrorValidationPlan.throwfileerrorALT(Fileavail1.apiResponse.items.length, "KSDSEXC", sysparm.dsn_ksdsexc); } }); } sub_process2(params, parms, apiObj, jobname1) { return __awaiter(this, void 0, void 0, function* () { let spoolFilesResponse; // Response from view all spool content option if (parms.viewAllSpoolContent === true) { spoolFilesResponse = apiObj; } // Print the response to the command if ((0, util_1.isNullOrUndefined)(spoolFilesResponse)) { params.response.format.output({ fields: ["jobid", "retcode", "jobname", "status"], output: apiObj, format: "object" }); // Set the API object to the correct this.data.setObj(apiObj); // Print data from spool content } else { yield this.sub_process3(params, apiObj, spoolFilesResponse, jobname1); } }); } sub_process3(params, apiObj, spoolFilesResponse, jobname1) { return __awaiter(this, void 0, void 0, function* () { let KSDSOUT_FOUND = "NO"; const JESMSGLG_CHECK = "NO"; for (const spoolFile of spoolFilesResponse) { if (spoolFile.ddName === "KSDSOUT") { KSDSOUT_FOUND = "YES"; spoolFile.data = spoolFile.data.replace("POSSIBLŸ", "POSSIBLE"); spoolFile.data = spoolFile.data.replace("POSSIBL.", "POSSIBLE"); this.console.log(spoolFile.data); } } ErrorValidationPlan.throwjeserrorALT(KSDSOUT_FOUND, JESMSGLG_CHECK, "PMASCOP", jobname1); // Set the API object to the correct this.data.setObj(spoolFilesResponse); }); } } exports.default = SharedSubmitHandler; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSW5jam9iLmhhbmRsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY2xpL3Njb3BlL2luY19qb2IvSW5jam9iLmhhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxQkc7Ozs7Ozs7Ozs7O0FBRUgsaURBQTRHO0FBQzVHLG1DQUF1RTtBQUV2RSwrQkFBeUM7QUFDekMseUJBQXlCO0FBQ3pCLHFDQUFxQztBQUNyQywyRUFBNEU7QUFDNUUsaUVBQWtFO0FBRWxFOzs7OztHQUtHO0FBQ0gsTUFBcUIsbUJBQW1CO0lBMEJwQzs7Ozs7T0FLRztJQUNVLE9BQU8sQ0FBQyxNQUEwQjs7WUFDM0MsNkNBQTZDO1lBQzdDLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUM7WUFDdkMsSUFBSSxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztZQUNqQyxxREFBcUQ7WUFDckQsMkNBQTJDO1lBQzNDLCtFQUErRTtZQUMvRSxJQUFJLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUM7WUFDbEMsTUFBTSxLQUFLLEdBQWlCO2dCQUN4QixTQUFTLEVBQUUsU0FBUztnQkFDcEIsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxtQkFBbUI7YUFDMUQsQ0FBQztZQUNGLEtBQUssQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsQ0FBRSxpQ0FBaUM7WUFDcEUsd0VBQXdFO1lBQ3hFLHVGQUF1RjtZQUN2RixNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUM7WUFDeEIsTUFBTSxPQUFPLEdBQVcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUM7WUFDL0Msb0NBQW9DO1lBQ3BDLE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQztZQUMxQixNQUFNLE9BQU8sR0FBRyx5QkFBeUIsQ0FBQztZQUMxQyxN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