@broadcom/mat-detect-for-zowe-cli
Version:
MAT Detect plug-in for Zowe CLI
240 lines • 23.1 kB
JavaScript
;
/*
* 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
const jobname = this.arguments.jobname;
let jobStepn = "";
let jobProcs = "";
let errorstepn;
let errorprocs;
let errorJobn;
// const pmaProfile: IProfile = params.profiles.get("pma", false);
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 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("*")) || (jobStepn.includes("*"))) {
errorJobn = "STEPNAME or PROCSTEP can be added if JOBNAME contains *";
}
}
else {
jobProcs = " ";
}
if ((0, util_1.isNullOrUndefined)(errorJob) && (0, util_1.isNullOrUndefined)(errorLib) && (0, util_1.isNullOrUndefined)(errorClass)
&& (0, util_1.isNullOrUndefined)(errorMClass) && (0, util_1.isNullOrUndefined)(errorAcct) && (0, util_1.isNullOrUndefined)(errorJobn)
&& (0, util_1.isNullOrUndefined)(errorprocs) && (0, util_1.isNullOrUndefined)(errorstepn)) {
// 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_process(params, parms, sysparm, jobname, jobStepn, jobProcs);
}
else {
ErrorValidationPlan.throwparmerrorALT(errorJobn, "jobname", jobname);
ErrorValidationPlan.throwparmerror(errorJob, "KSDSEXC");
ErrorValidationPlan.throwparmerror(errorLib, "lib");
ErrorValidationPlan.throwparmerror(errorClass, "class");
ErrorValidationPlan.throwparmerror(errorMClass, "Mclass");
ErrorValidationPlan.throwparmerror(errorAcct, "Acct");
}
});
}
sub_process(params, parms, sysparm, jobname, jobStepn, jobProcs) {
return __awaiter(this, void 0, void 0, function* () {
let apiObj; // API Object to set in the command JSON response
const pmajob = "job$$$";
let jobname1 = "jobname";
const pmastpn = "stp$$$";
const pmaprcn = "prc$$$";
// 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);
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", "DelJob.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/DelJob.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");
if (jobStepn === undefined) {
const number1 = 8;
jobStepn = pmastpn.toUpperCase().padEnd(number1);
}
else {
const number1 = 8;
jobStepn = jobStepn.toUpperCase().padEnd(number1);
}
if (jobProcs === undefined) {
const number1 = 8;
jobProcs = pmaprcn.toUpperCase().padEnd(number1);
}
else {
const number1 = 8;
jobProcs = jobProcs.toUpperCase().padEnd(number1);
}
jobText = jobText.replace(pmajob, jobname1); // replacing the template pmajob 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(Fileavail1.apiResponse.items.length, "KSDSEXC", sysparm.dsn_ksdsexc);
ErrorValidationPlan.throwfileerrorALT(Fileavail.apiResponse.items.length, "lib", sysparm.dsn_steplib);
}
});
}
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";
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGVsam9iLmhhbmRsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY2xpL3Njb3BlL2RlbF9qb2IvRGVsam9iLmhhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxQkc7Ozs7Ozs7Ozs7O0FBRUgsaURBQTRHO0FBQzVHLG1DQUF1RTtBQUV2RSwrQkFBeUM7QUFDekMseUJBQXlCO0FBQ3pCLHFDQUFxQztBQUNyQywyRUFBNEU7QUFDNUUsaUVBQWtFO0FBRWxFOzs7OztHQUtHO0FBQ0gsTUFBcUIsbUJBQW1CO0lBMEJwQzs7Ozs7T0FLRztJQUNVLE9BQU8sQ0FBQyxNQUEwQjs7WUFDM0MsNkNBQTZDO1lBQzdDLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUM7WUFDdkMsSUFBSSxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztZQUNqQyxxREFBcUQ7WUFDckQsMkNBQTJDO1lBQzNDLCtFQUErRTtZQUMvRSxJQUFJLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUM7WUFDbEMsTUFBTSxLQUFLLEdBQWlCO2dCQUN4QixTQUFTLEVBQUUsU0FBUztnQkFDcEIsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxtQkFBbUI7YUFDMUQsQ0FBQztZQUNGLEtBQUssQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsQ0FBRSxpQ0FBaUM7WUFFcEUsTUFBTSxPQUFPLEdBQVcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUM7WUFFL0MsSUFBSSxRQUFRLEdBQVcsRUFBRSxDQUFDO1lBQzFCLElBQUksUUFBUSxHQUFXLEVBQUUsQ0FBQztZQUUxQixJQUFJLFVBQWtCLENBQUM7WUFDdkIsSUFBSSxVQUFrQixDQUFDO1lBQ3ZCLElBQUksU0FBaUIsQ0FBQztZQUN0QixrRUFBa0U7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