Name
sn_sow_chg.ChangeRequestActionProvider
Description
Implements extension point sn_reacf.RemedialActionProvider Implements above extension point for change_request as a provider
Script
var ChangeRequestActionProvider = Class.create();
ChangeRequestActionProvider.prototype = {
TABLES: {
"CHANGE_REQUEST": "change_request",
"CHANGE_RECORD_PRODUCER": "std_change_record_producer"
},
CONSTANTS: {
ACTION_EXECUTION_TABLE: "action_execution_table",
ACTION_EXECUTION_ID: "action_execution_id"
},
FIELDS: {
STATE: "state",
CMDB_CI: "cmdb_ci"
},
STATES: {
NEW: "-5",
SCHEDULED: "-2",
CANCELED: "4"
},
initialize: function() {},
/**
* @param String className - class name to check which action is being executed
**/
handles: function(className) {
return className === this.TABLES.CHANGE_RECORD_PRODUCER;
},
/**
* @param Object standardChangeTemplateGr - GlideRecord reference to the standard change template defined in the remedial action
* @param Object remedialActionGr - GlideRecord reference to the remedial action record
* @return Boolean value indicating if logged-in user is authorized to execute defined action
**/
isAuthorized: function(standardChangeTemplateGr, remedialActionGr) {
var chgGr = new GlideRecord(this.TABLES.CHANGE_REQUEST);
return chgGr.canCreate() && chgGr.canWrite() && standardChangeTemplateGr.canRead();
},
/**
* @param Object standardChangeTemplateGr - GlideRecord reference to the std_change_record_producer record defined in the remedial action
* @param Object ci - GlideRecord reference to the the target ci from remedial action execution record
* @param JSON object actionParams - params from the remedial action execution record
* @return JSON with attributes action_execution_table and action_execution_id
**/
execute: function(standardChangeTemplateGr, ci, actionParams) {
if (!standardChangeTemplateGr || !standardChangeTemplateGr.isValidRecord()) {
gs.error("[ChangeRequestActionProvider][execute]: Provide a valid std_change_record_producer record");
return;
}
if (!ci || !ci.isValidRecord()) {
gs.error("[ChangeRequestActionProvider][execute]: Provide a valid ci record");
return;
}
var state = null;
if (actionParams.state) {
state = actionParams.state;
delete actionParams.state;
}
if (gs.nil(actionParams[this.FIELDS.CMDB_CI]))
actionParams[this.FIELDS.CMDB_CI] = ci.getUniqueValue();
var changeProcess = global.StandardChangeProcess.newChangeProcess(standardChangeTemplateGr.getUniqueValue(), actionParams);
if (state && !changeProcess.canMoveTo(state)) {
gs.error("[ChangeRequestActionProvider][execute]: Standard Change Request cannot move to state: " + state);
return;
}
if ((!state && changeProcess.insert()) || (state && changeProcess.moveTo(state) && changeProcess.insert())) {
var output = {};
output[this.CONSTANTS.ACTION_EXECUTION_TABLE] = this.TABLES.CHANGE_REQUEST;
output[this.CONSTANTS.ACTION_EXECUTION_ID] = changeProcess.getGlideRecord().getUniqueValue();
return output;
}
},
/**
* @param Object changeRequestGr - GlideRecord reference to the change_request record from the remedial action execution record
* Checks associated action execution status and return response if available
* @return JSON with attributes state and output Payload
**/
getOutput: function(changeRequestGr) {
if (!changeRequestGr || !changeRequestGr.isValidRecord()) {
gs.error("[ChangeRequestActionProvider][getOutput]: Provide a valid change_request record");
return;
}
var output = {
"status": {
"value": changeRequestGr.getValue(this.FIELDS.STATE),
"displayValue": changeRequestGr.getDisplayValue(this.FIELDS.STATE)
},
"payload": []
};
return output;
},
/**
* @param Object changeRequestGr - GlideRecord reference to the change_request record from the remedial action execution record
* Checks associated action execution can be canceled or not
* @return Boolean value indicating if action execution can be canceled or not
**/
canCancel: function(changeRequestGr) {
if (gs.nil(changeRequestGr))
return true;
if (!changeRequestGr.isValidRecord()) {
gs.error("[ChangeRequestActionProvider][canCancel]: Provide a valid change_request record");
return false;
}
var changeState = changeRequestGr.getValue(this.FIELDS.STATE);
if (changeState == this.STATES.NEW || changeState == this.STATES.SCHEDULED) {
var changeProcess = new global.StandardChangeProcess(changeRequestGr);
if (changeProcess && changeProcess.canMoveTo(this.STATES.CANCELED))
return true;
}
return false;
},
/**
* @param Object changeRequestGr - GlideRecord reference to the change_request record from the remedial action execution record
* Update associated action execution as canceled
* @return Boolean value indicating if action execution is canceled or not
**/
cancelExecution: function(changeRequestGr) {
if (gs.nil(changeRequestGr))
return true;
if (!changeRequestGr.isValidRecord()) {
gs.error("[ChangeRequestActionProvider][cancelExecution]: Provide a valid change_request record");
return false;
}
var changeProcess = new global.StandardChangeProcess(changeRequestGr);
if (changeProcess && changeProcess.moveTo(this.STATES.CANCELED)) {
changeProcess.update();
return true;
}
return false;
},
type: 'ChangeRequestActionProvider'
};
Sys ID
b084445f434121108ff4ff53e9b8f28d