Name

sn_itom_license.PopulateExclusionTables

Description

No description available

Script

var PopulateExclusionTables = Class.create();
PopulateExclusionTables.prototype = {
  initialize: function() {
      jobStartTime = new GlideDateTime();
      valueStreams = ['visibility', 'health', 'optimization'];
      exclusionSuffix = '_exclusions';
      batchUtil = new global.BatchCommandUtilScript();
      batchSize = 5000;
  },

  _getExclusionTableList: function(valueStream, skuTypes) {

      var valueStreamList = [];
      var exclusionTables = [];
      if (valueStream == 'discovery')
          valueStream = 'visibility'; //exclusion table for visibility and discovery are same as both licenses can not be present in an instance
      if (valueStream == 'all')
          valueStreamList = valueStreams;
      else
          valueStreamList = [valueStream];

      //get all the sku types
      var skuTypeList = skuTypes.split(',');

      skuTypeList.forEach(function(skuTypeSysId) {
          var gr = new GlideRecord('itom_lu_sku_type');
          if (gr.get(skuTypeSysId) && gr.getValue('sku')) {

              var skuName = gr.getValue('sku');
              valueStreamList.forEach(function(valueStreamName) {
                  /*
                  exclusion table name format skuName +'_'+ valueStreamName+'_exclusions'
                  eg- itom_visibility_exclusions, itom_health_exclusions, itom_optimization_exclusions
                  otm_visibility_exclusions, otm_health_exclusions, otm_optimization_exclusions
                  */
                  var tableName = skuName + '_' + valueStreamName + exclusionSuffix;
                  exclusionTables.push(tableName);
              });
          }

      });
      return exclusionTables;
  },

  updateExclusionTables: function() {

      var exGr = new GlideRecord('itom_license_exclusion_metadata');
      exGr.addActiveQuery();
      exGr.query();
      while (exGr.next()) {
          var exclusionTables = this._getExclusionTableList(exGr.getValue('value_stream'), exGr.getValue('sku_type'));

          var excludedCIsList = [];
          var ci_identifier = exGr.getValue('ci_identifier');
          //if condition type is not script
          if (exGr.getValue('condition_type') != 'script') {
              var tableName = exGr.getValue('table_name');
              var encodedQuery = exGr.getValue('query');

              var tableGr = new GlideRecord(tableName);
              tableGr.addEncodedQuery(encodedQuery);
              tableGr.query();
              while (tableGr.next()) {
                  var ciDetail = {};
                  ciDetail.ciSysId = tableGr.getValue(ci_identifier);
                  if (exGr.getValue('condition_type') == 'relationship')
                      ciDetail.domain = tableGr[ci_identifier].sys_domain + ''; // domain of parent or child
                  else
                      ciDetail.domain = tableGr.getValue('sys_domain');

                  excludedCIsList.push(ciDetail);
              }

          } else {
              var evaluator = new GlideScopedEvaluator();
              excludedCIsList = evaluator.evaluateScript(exGr, 'script', null);
          }

          this._addCIsToExclusionTables(excludedCIsList, exclusionTables, exGr);
      }

      this._removeStaleRecords();
  },

  _addCIsToExclusionTables: function(excludedCIsList, exclusionTables, exclusionMetaDataGr) {
      if (!(excludedCIsList && excludedCIsList.length != 0))
          return;

      exclusionTables.forEach(function(table) {
          var existingCISysIDs = [];
          var jsonArr = [];
          var updateJsonArr = [];
          var counter = 0;
          excludedCIsList.forEach(function(excludedCI) {
              var ciSysId = excludedCI.ciSysId;
              if (!ciSysId)
                  return;

              var domain = excludedCI.domain || 'global';

              var exclusionTableGr = new GlideRecord(table);
              exclusionTableGr.addQuery('ci', ciSysId);
              exclusionTableGr.addQuery('exclusion_reason.category', exclusionMetaDataGr.getValue('category')).addOrCondition('exclusion_reason.category', 'All');
              exclusionTableGr.addQuery('exclusion_reason.active', true);
              exclusionTableGr.query();
              if (!exclusionTableGr.next()) {
                  jsonCountRecord = {};
                  jsonCountRecord.ci = ciSysId;
                  jsonCountRecord.exclusion_reason = exclusionMetaDataGr.getValue('sys_id');
                  jsonCountRecord.sys_domain = domain;
                  jsonArr.push(jsonCountRecord);
                  counter++;
                  if(counter == batchSize){
                  	batchUtil.batchInsertMultiple(JSON.stringify(jsonArr), table, '');
  		counter = 0;
  		jsonArr = [];
                  }

              } else {
                  existingCISysIDs.push(ciSysId);
              }			
          });

          batchUtil.batchInsertMultiple(JSON.stringify(jsonArr), table, '');

          while (existingCISysIDs.length > 0) {
  	updateJsonArr = [];
              var firstBatch = existingCISysIDs.splice(0, batchSize);
              var tableGr = new GlideRecord(table);
              tableGr.addQuery('ci', 'IN', firstBatch);
              tableGr.addQuery('exclusion_reason.active', true);
              tableGr.query();
              while (tableGr.next()) {
                  jsonObj = {};
                  jsonObj.sys_id = tableGr.getValue('sys_id');
                  jsonObj.sys_updated_on = jobStartTime.toString();
                  updateJsonArr.push(jsonObj);
              }
              batchUtil.batchUpdateMultiple(JSON.stringify(updateJsonArr), table, '');
          }

      });
  },

  _removeStaleRecords: function() {
      var skuGr = new GlideRecord('itom_lu_sku_type');
      skuGr.query();
      while (skuGr.next()) {
          var skuName = skuGr.getValue('sku');
          if (!skuName)
              continue;
          valueStreams.forEach(function(valueStream) {
              /*
                  exclusion table name format skuName +'_'+ valueStream+'_exclusions'
                  eg- itom_visibility_exclusions, itom_health_exclusions, itom_optimization_exclusions
                  otm_visibility_exclusions, otm_health_exclusions, otm_optimization_exclusions
                  */
              var tableName = skuName + '_' + valueStream + exclusionSuffix;
              var tableGr = new GlideRecord(tableName);
              tableGr.addQuery('sys_updated_on', '<', jobStartTime);
              tableGr.query();
              tableGr.deleteMultiple();
          });
      }
  },

  type: 'PopulateExclusionTables'
};

Sys ID

e28b712db787601046df8985de11a991

Offical Documentation

Official Docs: