Name

sn_sow_inc.SOWRemedialActionPlaybookUtil

Description

No description available

Script

var SOWRemedialActionPlaybookUtil = Class.create();
SOWRemedialActionPlaybookUtil.prototype = {
  initialize: function(parentRecordTable, parentRecordId) {
      this.parentRecordTable = parentRecordTable;
      this.parentRecordId = parentRecordId;
      this.origin = new sn_sow.SOWInvestigateConfig().SERVICE_OPERATIONS_WORKSPACE_ORIGIN_RECORD;
      this.currentQuery = 'stateINnew,in_progress';
      this.historyQuery = 'stateINcompleted,failed,canceled';
      this.HIGHLIGHTED_STATE_CONFIG = {
          'new': {
              'color': 'purple',
              'icon': 'presence-fill',
              'variant': 'tertiary'
          },
          'in_progress': {
              'color': 'blue',
              'icon': 'circle-semi-check-fill',
              'variant': 'tertiary'
          },
          'completed': {
              'color': 'positive',
              'icon': 'check-fill',
              'variant': 'tertiary'
          },
          'failed': {
              'color': 'gray',
              'icon': 'ban-outline',
              'variant': 'secondary'
          },
          'canceled': {
              'color': 'low',
              'icon': 'close-fill',
              'variant': 'tertiary'
          }
      };
  },

  TABLES: {
      REMEDIAL_ACTION: "sn_reacf_remedial_action",
      PLAYBOOK_CONTEXT: "sys_pd_context",
      PLAYBOOK_ACTIVITY_CONTEXT: "sys_pd_activity_context",
      ACTION_EXECUTION: "sn_reacf_remedial_action_execution",
      CONFIGURATION_ITEM: "cmdb_ci",
      SN_REACF_REMEDIAL_ACTION_PARAMETER: "sn_reacf_remedial_action_parameter"
  },

  TAB_LABELS: {
      'Current': gs.getMessage('Current'),
      'History': gs.getMessage('History')
  },

  getRecord: function(table, sysId) {
      var gr = new GlideRecord(table);
      if (gr.get(sysId))
          return gr;
  },

  getActionExcecutionRecordsAggregate: function(type) {
      var ga = new GlideAggregate(this.TABLES.ACTION_EXECUTION);
      ga.addQuery('parent_record_table', this.parentRecordTable);
      ga.addQuery('parent_record_id', this.parentRecordId);
      ga.addQuery('origin', this.origin);
      if (type == 'Current')
          ga.addEncodedQuery(this.currentQuery);
      else
          ga.addEncodedQuery(this.historyQuery);
      ga.addAggregate('COUNT', 'target_record_id');
      ga.query();
      return ga;
  },

  getActionExcecutionRecords: function(type, query) {
      var gr = new GlideRecord(this.TABLES.ACTION_EXECUTION);
      gr.addQuery('parent_record_table', this.parentRecordTable);
      gr.addQuery('parent_record_id', this.parentRecordId);
      gr.addQuery('origin', this.origin);
      if (!gs.nil(query))
          gr.addEncodedQuery(query);
      if (type == 'Current')
          gr.addEncodedQuery(this.currentQuery);
      else
          gr.addEncodedQuery(this.historyQuery);
      gr.orderByDesc('sys_created_on');
      gr.query();
      return gr;
  },

  getPlaybookGrFromInputRecord: function(inputRecord) {
      var gr = new GlideRecord(this.TABLES.PLAYBOOK_CONTEXT);
      gr.addQuery('input_record', inputRecord);
      gr.setLimit(1);
      gr.query();
      return gr;
  },

  getActivityGrFromPlaybookContext: function(playbookGr, query) {
      var gr = new GlideRecord(this.TABLES.PLAYBOOK_ACTIVITY_CONTEXT);
      gr.addQuery('context', playbookGr);
      if (!gs.nil(query))
          gr.addEncodedQuery(query);
      gr.query();
      return gr;
  },

  getEmptyState: function(type) {
      var obj = {};
      if (type == 'Current') {
          obj['emptyStateHeading'] = {
              "label": gs.getMessage('Select a remedial action to start'),
              "level": 1
          };
          obj['emptyStateContent'] = gs.getMessage('From the Investigate tab, select a remedial action to start its playbook.');
          obj['emptyStateIllustration'] = 'first-time-user';
      } else {
          obj['emptyStateHeading'] = {
              "label": gs.getMessage('No completed remedial actions yet'),
              "level": 1
          };
          obj['emptyStateIllustration'] = 'no-activities';
      }
      return obj;
  },

  getDataForPlaybook: function(type) {
      var array = {};
      array['label'] = this.TAB_LABELS[type] ? this.TAB_LABELS[type] : type;
      var ga = this.getActionExcecutionRecordsAggregate(type);
      var count = ga.getRowCount();
      if (count == 0) {
          array['hideEmpty'] = false;
          array['hideTabs'] = true;
          array['emptyState'] = this.getEmptyState(type);
      } else {
          var cardCount = 0;
          array['hideTabs'] = false;
          array['hideEmpty'] = true;
          array['hidePlaybook'] = true;
          var content = [];
          content = this.getActionExecutionsDataForPlaybook(ga, type);
          for (var i = 0; i < content.length; i++)
              cardCount += content[i]['actionCount'];
          array['content'] = content;
          array['count'] = cardCount;
      }
      return array;
  },

  getActionExecutionsDataForPlaybook: function(ga, type) {
      var content = [];
      while (ga.next()) {
          var obj = {};
          var ciId = ga.getValue('target_record_id');
          var ciGr = this.getRecord(this.TABLES.CONFIGURATION_ITEM, ciId);
          var ciName = ciGr.getDisplayValue('name');
          obj['ci_sys_id'] = ciId;
          obj['ci_name'] = ciName;
          obj['accordion'] = this.getAccordionObj([ciGr.getDisplayValue('sys_class_name'), ': ', ciName].join(''));
          obj['action'] = this.getActionsByCI(type, ciId);
          obj['actionCount'] = obj['action'].length;
          if (Object.keys(obj).length > 0)
              content.push(obj);
      }
      return content;
  },

  getAccordionObj: function(label) {
      var accordion = {
          "variant": "primary",
          "weight": "normal",
          "size": "md",
          'label': label
      };
      return accordion;
  },

  getTime: function(type, playbookGr) {
      var labelValue = {};
      if (type == 'Start') {
          labelValue['label'] = gs.getMessage('Start time');
          labelValue['value'] = {
              "type": "string",
              "value": playbookGr.getDisplayValue('sys_created_on')
          };
      } else {
          var playbookActivityGr = this.getActivityGrFromPlaybookContext(playbookGr.getUniqueValue(), 'state!=PENDING^nameLIKEremediate$end');
          if (playbookActivityGr.next()) {
              labelValue['label'] = gs.getMessage('End time');
              labelValue['value'] = {
                  "type": "string",
                  "value": playbookActivityGr.getDisplayValue('sys_updated_on')
              };
          }
      }
      return labelValue;
  },

  getRemedialActionParams: function(execGr) {
      var params = (execGr.remedial_action_parameters);
      var labelParams = [];
      var labelMap = {};
      var remedialActionParamGr = new GlideRecord(this.TABLES.SN_REACF_REMEDIAL_ACTION_PARAMETER);
      remedialActionParamGr.addQuery("model", execGr.getValue("remedial_action"));
      remedialActionParamGr.query();
      while (remedialActionParamGr.next()) {
          labelMap[remedialActionParamGr.getValue("element")] = remedialActionParamGr.getDisplayValue("label");
      }
      for (var param in params) {
          if (param != 'sys_meta' && param != 'sys_id' && !gs.nil(params[param])) {
              var labelValue = {};
              labelValue['label'] = labelMap[param];
              labelValue['value'] = {
                  "type": "string",
                  "value": params[param].getDisplayValue()
              };
              labelParams.push(labelValue);
          }
      }
      return labelParams;
  },

  getActionsByCI: function(type, ci) {
      var action = [];
      var gr = this.getActionExcecutionRecords(type, 'target_record_id=' + ci);
      while (gr.next()) {
          var obj = {};
          obj['action_name'] = gr.getDisplayValue('remedial_action');
          obj['sys_id'] = gr.getUniqueValue();
          var playbookGr = this.getPlaybookGrFromInputRecord(gr.getUniqueValue());
          if (playbookGr.next()) {
              var state = gr.getValue('state');
              obj['state'] = gr.getDisplayValue('state');
              if (!gs.nil(this.HIGHLIGHTED_STATE_CONFIG[state])) {
                  obj['color'] = this.HIGHLIGHTED_STATE_CONFIG[state]['color'];
                  obj['icon'] = this.HIGHLIGHTED_STATE_CONFIG[state]['icon'];
                  obj['variant'] = this.HIGHLIGHTED_STATE_CONFIG[state]['variant'];
              }
              obj['label_value_pair'] = this.getRemedialActionParams(gr);
              obj['label_value_pair'].push(this.getTime('Start', playbookGr));
              action.push(obj);
              if (state == 'COMPLETE' || state == 'ERROR' || state == 'CANCELLED') {
                  obj['label_value_pair'].push(this.getTime('End', playbookGr));
              }
          }
      }
      return action;
  },

  type: 'SOWRemedialActionPlaybookUtil'
};

Sys ID

cae0a5ad77152110583f78dabd5a9903

Offical Documentation

Official Docs: