Name
sn_reacf.RemedialActionEngineSNC
Description
No description available
Script
var RemedialActionEngineSNC = Class.create();
RemedialActionEngineSNC.prototype = {
initialize: function() {
this.remedialActionHelper = new RemedialActionHelper();
},
TABLES: {
REMEDIAL_ACTION: "sn_reacf_remedial_action",
ACTION_EXECUTION: "sn_reacf_remedial_action_execution",
},
FIELDS: {
ACTION: {
ACTION: "action_id",
ACTION_TABLE: "action_table"
},
ACTION_EXECUTION: {
ACTION: "remedial_action",
TARGET_TABLE: "target_table",
MATCH_TARGET_EXTENSIONS: "match_target_extensions",
TARGET_CONDITIONS: "target_conditions",
TARGET_RECORD_ID: "target_record_id",
ACTION_RECORD_TABLE: "action_record_table",
ACTION_RECORD_ID: "action_record_id",
},
SYS_DOMAIN: "sys_domain",
MODEL: "model",
ELEMENT: "element",
},
STATES: {
FAILED: "failed",
IN_PROGRESS: "in_progress"
},
beginRemediation: function(remedialAction, parentTable, parentRecord, actionParams, targetRecord, originRecord) {
if (!remedialAction) {
gs.error("[RemedialActionEngine]: provide either the GlideRecord reference or sys_id or internal_name of the remedial action record");
return;
} else if (typeof remedialAction === 'string') {
if (this.remedialActionHelper.isSysId(remedialAction)) {
remedialAction = this.remedialActionHelper.getGlideRecord(this.TABLES.REMEDIAL_ACTION, remedialAction);
} else {
remedialAction = this.remedialActionHelper.getGlideRecordByInternalName(this.TABLES.REMEDIAL_ACTION, remedialAction);
}
}
if (!remedialAction || !remedialAction.isValidRecord()) {
gs.error("[RemedialActionEngine]: Provided remedial action is not a valid record");
return;
}
var targetTable = remedialAction.getValue(this.FIELDS.ACTION_EXECUTION.TARGET_TABLE);
if (targetTable && typeof targetRecord === 'string') {
targetRecord = this.remedialActionHelper.getGlideRecord(targetTable, targetRecord);
}
if (targetTable && (!targetRecord || !targetRecord.isValidRecord())) {
gs.error("[RemedialActionEngine]: TargetRecord is missing or not valid");
return;
}
if (!parentTable) {
gs.error("[RemedialActionEngine]: provide the table name of the parent record from where the remedial action is initiated");
return;
}
if (!parentRecord) {
gs.error("[RemedialActionEngine]: provide the sys id of the parent record from where the remedial action is initiated");
return;
}
if (targetTable) {
if (remedialAction.getValue(this.FIELDS.ACTION_EXECUTION.MATCH_TARGET_EXTENSIONS) == 1) {
var allowedTables = new GlideTableHierarchy(targetTable).getAllExtensions();
} else {
allowedTables = [targetTable];
}
var targetConditions = remedialAction.getValue(this.FIELDS.ACTION_EXECUTION.TARGET_CONDITIONS);
if ((allowedTables.indexOf(targetRecord.getTableName() + "") == -1) ||
(!gs.nil(targetConditions) && !GlideFilter.checkRecord(targetRecord, targetConditions))) {
gs.error("[RemedialActionEngine]: Target table or conditions don't match with the remedial action definition");
return;
}
}
if (typeof actionParams === 'string') {
try {
actionParams = JSON.parse(actionParams);
} catch (ex) {
gs.error("[RemedialActionEngine]: Invalid actionParams Error: " + ex.message);
return;
}
} else {
actionParams = actionParams || {};
}
if (!this.remedialActionHelper.isActionParamsValid(remedialAction, actionParams, true)) {
gs.error("[RemedialActionEngine]: Action parameters missing or not valid for remedial action " + remedialAction.getDisplayValue());
return;
}
var matchingImplementation = this.remedialActionHelper.getExtensionPointImplementation(remedialAction);
if (gs.nil(matchingImplementation)) {
gs.error("[RemedialActionEngine]: Unable to find a matching implementation for " + remedialAction.getDisplayValue());
return;
}
if (!matchingImplementation.isAuthorized(this._getTargetAction(remedialAction), remedialAction)) {
gs.error("[RemedialActionEngine]: Unauthorized execution request for " + remedialAction.getDisplayValue());
return;
}
var actionExecutionRequestId;
try {
var createActionExecutionRequestInputs = {};
createActionExecutionRequestInputs['remedial_action_sys_id'] = remedialAction.getUniqueValue();
createActionExecutionRequestInputs['action_parameters'] = actionParams;
createActionExecutionRequestInputs['parent_table'] = parentTable;
createActionExecutionRequestInputs['parent_record_sys_id'] = parentRecord;
if (targetTable) {
createActionExecutionRequestInputs['target_sys_id'] = targetRecord.getUniqueValue();
}
if (originRecord) {
if (originRecord instanceof GlideRecord && originRecord.isValidRecord()) {
createActionExecutionRequestInputs['origin_sys_id'] = originRecord.getUniqueValue();
} else {
createActionExecutionRequestInputs['origin_sys_id'] = originRecord;
}
}
var result = sn_fd.FlowAPI.getRunner()
.action('sn_reacf.create_remedial_action_execution_record')
.inForeground()
.withInputs(createActionExecutionRequestInputs)
.run();
var outputs = result.getOutputs();
actionExecutionRequestId = outputs['remedial_action_sys_id'];
} catch (ex) {
gs.error("[RemedialActionEngine]: Error while creating action request record with inputs " + JSON.stringify(createActionExecutionRequestInputs) + ". Error: " + ex.message);
return;
}
if (!actionExecutionRequestId) {
gs.error("[RemedialActionEngine]: Could not create action execution request record for " + remedialAction.getDisplayValue());
return;
}
return actionExecutionRequestId;
},
executeRemedialAction: function(remedialActionExecution) {
if (!remedialActionExecution) {
gs.error("[RemedialActionEngine]: provide either the GlideRecord reference or sys_id of the remedial action execution record");
return;
} else if (typeof remedialActionExecution === 'string') {
remedialActionExecution = this.remedialActionHelper.getGlideRecord(this.TABLES.ACTION_EXECUTION, remedialActionExecution);
}
if (!remedialActionExecution || !remedialActionExecution.isValidRecord()) {
gs.error("[RemedialActionEngine]: Provided remedial action execution is not a valid record");
return;
}
var remedialAction = remedialActionExecution[this.FIELDS.ACTION_EXECUTION.ACTION].getRefRecord();
if (remedialAction.isValidRecord()) {
var matchingImplementation = this.remedialActionHelper.getExtensionPointImplementation(remedialAction);
if (gs.nil(matchingImplementation)) {
gs.error("[RemedialActionEngine]: Unable to find a matching implementation for " + remedialAction.getDisplayValue());
return;
}
if (!matchingImplementation.isAuthorized(this._getTargetAction(remedialAction), remedialAction)) {
gs.error("[RemedialActionEngine]: Unauthorized execution request for " + remedialAction.getDisplayValue());
return;
}
try {
//actionGr, targetRecordGr, actionParams
var targetActionGr = this._getTargetAction(remedialAction);
var targetRecordGr = remedialActionExecution[this.FIELDS.ACTION_EXECUTION.TARGET_RECORD_ID] ? remedialActionExecution[this.FIELDS.ACTION_EXECUTION.TARGET_RECORD_ID].getRefRecord() : null;
var actionParams = this.remedialActionHelper.getActionParams(remedialActionExecution);
var response = matchingImplementation.execute(targetActionGr, targetRecordGr, actionParams);
if (response) {
this.remedialActionHelper.updateRemedialActionExecutionRequest(remedialActionExecution, this.STATES.IN_PROGRESS, response.action_execution_table, response.action_execution_id);
}
return response;
} catch (ex) {
this.remedialActionHelper.updateRemedialActionExecutionRequest(remedialActionExecution, this.STATES.FAILED);
gs.error("[RemedialActionEngine]: Error while executing action " + remedialAction.getDisplayValue() + ". Error: " + ex.message);
return;
}
} else {
gs.error("[RemedialActionEngine]: Unable to determine the remedial action from execution record");
}
},
getRemedialActionOutput: function(remedialActionExecution) {
if (!remedialActionExecution) {
gs.error("[RemedialActionEngine]: provide either the GlideRecord reference or sys_id of the remedial action execution record");
return;
} else if (typeof remedialActionExecution === 'string') {
remedialActionExecution = this.remedialActionHelper.getGlideRecord(this.TABLES.ACTION_EXECUTION, remedialActionExecution);
}
if (!remedialActionExecution || !remedialActionExecution.isValidRecord()) {
gs.error("[RemedialActionEngine]: Provided remedial action execution is not a valid record");
return;
}
var remedialAction = remedialActionExecution[this.FIELDS.ACTION_EXECUTION.ACTION].getRefRecord();
if (remedialAction.isValidRecord()) {
var matchingImplementation = this.remedialActionHelper.getExtensionPointImplementation(remedialAction);
return matchingImplementation.getOutput(this._getTargetActionRequest(remedialActionExecution));
}
},
isAuthorized: function(remedialAction) {
if (!remedialAction) {
gs.error("[RemedialActionEngine]: provide either the GlideRecord reference or sys_id or internal_name of the remedial action record");
return;
} else if (typeof remedialAction === 'string') {
if (this.remedialActionHelper.isSysId(remedialAction)) {
remedialAction = this.remedialActionHelper.getGlideRecord(this.TABLES.REMEDIAL_ACTION, remedialAction);
} else {
remedialAction = this.remedialActionHelper.getGlideRecordByInternalName(this.TABLES.REMEDIAL_ACTION, remedialAction);
}
}
if (!remedialAction || !remedialAction.isValidRecord()) {
gs.error("[RemedialActionEngine]: Provided remedial action is not a valid record");
return;
}
var matchingImplementation = this.remedialActionHelper.getExtensionPointImplementation(remedialAction);
return matchingImplementation.isAuthorized(this._getTargetAction(remedialAction), remedialAction);
},
isApplicable: function(remedialAction, targetRecord) {
if (!remedialAction) {
return;
} else if (typeof remedialAction === 'string') {
if (this.remedialActionHelper.isSysId(remedialAction)) {
remedialAction = this.remedialActionHelper.getGlideRecord(this.TABLES.REMEDIAL_ACTION, remedialAction);
} else {
remedialAction = this.remedialActionHelper.getGlideRecordByInternalName(this.TABLES.REMEDIAL_ACTION, remedialAction);
}
}
if (!remedialAction || !remedialAction.isValidRecord()) {
return;
}
var targetTable = remedialAction.getValue(this.FIELDS.ACTION_EXECUTION.TARGET_TABLE);
if (targetTable && typeof targetRecord === 'string') {
targetRecord = this.remedialActionHelper.getGlideRecord(targetTable, targetRecord);
}
if (targetTable && (!targetRecord || !targetRecord.isValidRecord())) {
return;
}
if (targetTable) {
var allowedTables = null;
if (remedialAction.getValue(this.FIELDS.ACTION_EXECUTION.MATCH_TARGET_EXTENSIONS) == 1) {
allowedTables = new GlideTableHierarchy(targetTable).getAllExtensions();
} else {
allowedTables = [targetTable];
}
var targetConditions = remedialAction.getValue(this.FIELDS.ACTION_EXECUTION.TARGET_CONDITIONS);
return (allowedTables.indexOf(targetRecord.getTableName() + "") != -1) && (gs.nil(targetConditions) || GlideFilter.checkRecord(targetRecord, targetConditions));
}
return false;
},
_getTargetAction: function(remedialAction) {
var actionTable = remedialAction.getValue(this.FIELDS.ACTION.ACTION_TABLE);
var actionId = remedialAction.getValue(this.FIELDS.ACTION.ACTION);
return this.remedialActionHelper.getGlideRecord(actionTable, actionId);
},
_getTargetActionRequest: function(remedialActionExecutionGr) {
var actionRequestTable = remedialActionExecutionGr.getValue(this.FIELDS.ACTION_EXECUTION.ACTION_RECORD_TABLE);
var actionRequestId = remedialActionExecutionGr.getValue(this.FIELDS.ACTION_EXECUTION.ACTION_RECORD_ID);
return this.remedialActionHelper.getGlideRecord(actionRequestTable, actionRequestId);
},
type: 'RemedialActionEngineSNC'
};
Sys ID
97b7620443f06110cd5b8beeaab8f20f