diff --git a/experimental.js b/experimental.js index 4c319fd..98fee16 100644 --- a/experimental.js +++ b/experimental.js @@ -33,6 +33,7 @@ var nextUrl,formUrl; var finalCall; var loginStageCounter = 0; var vbid; +var format; var flowuid; var payloaduid; var projectuid; @@ -172,6 +173,16 @@ function workflowResubmit(instartOrResume, inStartDate,inEndDate, inProjectId,in loginPhase1(); } + +function vbidAnalysis(inVbid, inFormat) +{ + vbid = inVbid + format = inFormat; + finalCall = getVbidAnalysis; + loginPhase1(); +} + + function debugMonitorInfo() { debug("Monitor Project: [" + projectName + "]"); @@ -229,6 +240,18 @@ function setHeaders() return headers; } + +function getVbidAnalysis() +{ + + dbg.message("Getting VBID analysis [" + vbid + "]"); + var endPoint = "https://" + domainName + "/enterprise/v1/tenant/logs/" + vbid + "?field=created_at&direction=asc"; + debug("Next URL [" + endPoint + "]"); + var headers = setHeaders(); + rest.custom(endPoint,undefined,undefined,timeout,undefined,undefined,"GET",processVbidResponse,undefined,headers,true,false); + +} + function checkResubmissions() { debug("Check Resubmissions") @@ -357,6 +380,107 @@ function processFinalSingleResubmissionResponse(url,err,body,res){ } } + + +function logsToCSV(logsJson){ + + var csv="ActivityId,ActivityLabel,ActivityType,Message,ActionDate,ElapsedMilliSeconds\n"; + var activityId, activityLabel,activityType, message, actype, actionDate, prevDate; + var sep = ","; + + for(var i=0;i"+"CSV Conversion [" + i + "]",4); + activityId = logsJson.output.objects[i].activity_id; + activityLabel = logsJson.output.objects[i].activity_label; + activityType = logsJson.output.objects[i].type; + message = logsJson.output.objects[i].message; + actype = logsJson.output.objects[i].type; + actionDate = logsJson.output.objects[i].updated_at; + + if(activityType=="input")message="##DATA##"; + if(activityType=="output")message="##DATA##"; + if(activityType=="bill"){ + message="##DATA##"; + activityId = "bill"; + } + if(activityLabel=="Logger")message="##DATA##"; + if(activityLabel===undefined)activityLabel=actype; + activityLabel = "\"" + activityLabel + "\""; + + activitId = "\"" + activityId + "\""; + + + csv += activityId + sep + activityLabel + sep + activityType + sep + message + sep + actionDate + sep; + if(i>0) + { + dbg.message(""+"CSV Conversion Calculating delta",4); + var dateObjPrev = new Date(prevDate); + var dateObjCurr = new Date(actionDate); + var res = dateObjCurr.getTime() - dateObjPrev.getTime(); + csv += res; + + } + else + { + csv += 0; + } + csv += "\n"; + + prevDate = actionDate; + } + return csv; + +} + +function processVbidResponse(url,err,body,res){ + if(res.statusCode==200) + { + if(body.output.objects) + { + dbg.message(""+"Found Logs for - VBID",4); + + var outputFormat = format.toUpperCase(); + + switch(outputFormat) + { + + case "JSON": + dbg.message(""+"Outputting in JSON Format",4); + if(prettyprint==true){ + dbg.message(JSON.stringify(body,null,4),-1); + } + else{ + dbg.message((JSON.stringify(body)),-1); + } + break; + case "CSV": + dbg.message(""+"Outputting in CSV Format",4); + var csv = logsToCSV(body); + dbg.message(csv,-1); + break; + + default: + dbg.message("" + "Please provide a valid format - either JSON or CSV"); + break; + } + + + + } + else{ + + dbg.message(""+ "Unable to find logs for VBID",1); + } + } + else + { + dbg.message(""+"Failed to get logs for VBID",1) + dbg.message(JSON.stringify(body),1); + process.exit(99); + } +} + + function processSingleResubmissionResponse(url,err,body,res){ if(res.statusCode==200) { @@ -872,6 +996,12 @@ function loginResponse(url,err,body,res){ } -module.exports = {init,user,stages,projectWorkflows,projectFlowservices,connectorAccounts, - getProjectAccountConfig,searchProject,getMonitorInfo,workflowResubmit, - projectDeployments,messagingCreate,messagingStats,messagingDelete}; \ No newline at end of file +module.exports = {init, + user,stages, + searchProject, + projectDeployments, + projectWorkflows,projectFlowservices, + connectorAccounts,getProjectAccountConfig, + getMonitorInfo,workflowResubmit, + messagingCreate,messagingStats,messagingDelete, + vbidAnalysis}; \ No newline at end of file diff --git a/wmiocli.js b/wmiocli.js index 38df322..0c43223 100644 --- a/wmiocli.js +++ b/wmiocli.js @@ -16,6 +16,7 @@ var theme = require('./themes.js'); var recipe = require('./recipe.js'); var flowservice = require('./flowservice.js'); var experimental = require('./experimental.js'); +var hideExperimental = true; const { setLogLevel } = require('./debug.js'); @@ -61,8 +62,7 @@ function checkOptions(){ ignoreTLS = program.opts().ignoreTLSErrors; - - + if(program.opts().prettyprint == true) { prettyprint = true; @@ -154,6 +154,7 @@ program .option('--proxy ','URL for proxy server if required') .option('--caCert ','Path to a CACert PEM file if required') .option('--ignoreTLSErrors','Ignore TLS errors') + .option('--experimental','Provide help information on experimental commands') //Additional help @@ -594,7 +595,7 @@ program.command('flowservice-execute [input-json]') * experimental non-public APIs * ------------------------------------------------------------------------------------------------------------------------------------ */ - program.command('experimental-user',{hidden: true}) + program.command('experimental-user',{hidden: hideExperimental}) .addHelpCommand("HELP") .description('Get User information') .action(() => { @@ -603,7 +604,7 @@ program.command('flowservice-execute [input-json]') experimental.user(); }); - program.command('experimental-stages',{hidden: true}) + program.command('experimental-stages',{hidden: hideExperimental}) .description('Get Stage information') .action(() => { checkOptions(); @@ -611,7 +612,7 @@ program.command('flowservice-execute [input-json]') experimental.stages(); }); - program.command('experimental-project-workflows ',{hidden: true}) + program.command('experimental-project-workflows ',{hidden: hideExperimental}) .description('Get information about project workflows') .action((projectId) => { checkOptions(); @@ -619,7 +620,7 @@ program.command('flowservice-execute [input-json]') experimental.projectWorkflows(projectId); }); - program.command('experimental-project-flowservices ',{hidden: true}) + program.command('experimental-project-flowservices ',{hidden: hideExperimental}) .description('Get information about project FlowServices') .action((projectId) => { checkOptions(); @@ -627,7 +628,7 @@ program.command('flowservice-execute [input-json]') experimental.projectFlowservices(projectId); }); - program.command('experimental-project-connector-accounts ',{hidden: true}) + program.command('experimental-project-connector-accounts ',{hidden: hideExperimental}) .description('Get Information about project connector accounts') .action((projectId) => { checkOptions(); @@ -635,7 +636,7 @@ program.command('flowservice-execute [input-json]') experimental.connectorAccounts(projectId); }); - program.command('experimental-project-connector-account-wf-config ',{hidden: true}) + program.command('experimental-project-connector-account-wf-config ',{hidden: hideExperimental}) .description('Get configuration information about project connector accounts') .action((projectId) => { checkOptions(); @@ -643,7 +644,7 @@ program.command('flowservice-execute [input-json]') experimental.getProjectAccountConfig(projectId); }); - program.command('experimental-project-search ',{hidden: true}) + program.command('experimental-project-search ',{hidden: hideExperimental}) .description('Search project info by name') .action((projectName) => { checkOptions(); @@ -651,7 +652,7 @@ program.command('flowservice-execute [input-json]') experimental.searchProject(projectName); }); - program.command('experimental-project-deployments ',{hidden: true}) + program.command('experimental-project-deployments ',{hidden: hideExperimental}) .description('List all project deployments') .action((projectId) => { checkOptions(); @@ -659,7 +660,7 @@ program.command('flowservice-execute [input-json]') experimental.projectDeployments(projectId); }); - program.command('experimental-workflow-monitor [execution-status] [start-date] [end-date] [project-id] [workflow-id]',{hidden: true}) + program.command('experimental-workflow-monitor [execution-status] [start-date] [end-date] [project-id] [workflow-id]',{hidden: hideExperimental}) .description('List Workflow Monitor') .action((executionStatus,startDate,endDate,projectId,workflowId) => { checkOptions(); @@ -667,7 +668,7 @@ program.command('flowservice-execute [input-json]') experimental.getMonitorInfo(executionStatus,startDate,endDate,projectId,workflowId); }); - program.command('experimental-workflow-resubmit [restart-or-resume] [start-date] [end-date] [project-id] [workflow-id]',{hidden: true}) + program.command('experimental-workflow-resubmit [restart-or-resume] [start-date] [end-date] [project-id] [workflow-id]',{hidden: hideExperimental}) .description('Resubmit workflows from monitor') .action((restartOrResume,startDate,endDate,projectId,workflowId) => { checkOptions(); @@ -675,7 +676,7 @@ program.command('flowservice-execute [input-json]') experimental.workflowResubmit(restartOrResume, startDate, endDate, projectId,workflowId); }); - program.command('experimental-messaging-create ',{hidden: true}) + program.command('experimental-messaging-create ',{hidden: hideExperimental}) .description('Create a messaging queue or topic') .action((queueOrTopc,name,projectId) => { checkOptions(); @@ -683,7 +684,7 @@ program.command('flowservice-execute [input-json]') experimental.messagingCreate(queueOrTopc,projectId,name); }); - program.command('experimental-messaging-delete ',{hidden: true}) + program.command('experimental-messaging-delete ',{hidden: hideExperimental}) .description('Delete a messaging queue or topic') .action((queueOrTopc,name,projectId) => { checkOptions(); @@ -691,13 +692,21 @@ program.command('flowservice-execute [input-json]') experimental.messagingDelete(queueOrTopc,projectId,name); }); - program.command('experimental-messaging-stats ',{hidden: true}) + program.command('experimental-messaging-stats ',{hidden: hideExperimental}) .description('Get Messaging Stats') .action((name,projectId) => { checkOptions(); experimental.init(tenantDomain,tenantUser,tenantPw,program.opts().timeout,program.opts().prettyprint) experimental.messagingStats(projectId,name); }); + + program.command('experimental-workflow-execution-analysis [format]',{hidden: hideExperimental}) + .description('Provide workflow exedcution analysis') + .action((vbid,format) => { + checkOptions(); + experimental.init(tenantDomain,tenantUser,tenantPw,program.opts().timeout,program.opts().prettyprint) + experimental.vbidAnalysis(vbid,format); + }) program.parse();