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

Offical Documentation

Official Docs: