Name

global.CiDeleter

Description

No description available

Script

var CiDeleter = Class.create();

CiDeleter.createConnection = function(parentTable, childTable, referenceField){
  return {
  	"parentTable": parentTable,
  	"childTable" : childTable,
  	"referenceField" : referenceField
  };
},

CiDeleter.prototype = {

  initializeMainCiSysId: function () {
  	this.mainCiSysId = g_device.getCmdbCi();
  },

  initializeConfiguration: function(ciModelConfiguration){
  	this.ciModel = ciModelConfiguration.modelConnections;
  	this.mainCiType = ciModelConfiguration.mainCiType;
  },

  initialize: function (ciModelConfiguration) {

  if (!ciModelConfiguration) {
  			return;
  	}

  this.initializeMainCiSysId();
  this.initializeConfiguration(ciModelConfiguration);
  	
  this.ciDeleterCounter = 0;	
  },

  isMainCi: function (ci) {
  	return ci.sysId == this.mainCiSysId;
  },

doesSysIdExistInPayload: function (sysIdToCheck, sysIdsOfParentType) {
  	return (sysIdsOfParentType.indexOf(sysIdToCheck) > -1);
  },

  getExistingSysIds: function (valuesToSearch, parentTable, referenceField) {

  	var existingSysIds = [];
  	var glideRecord = new GlideRecord(parentTable);

  	glideRecord.addQuery(referenceField, 'IN', valuesToSearch);
  	glideRecord.query();

  	while (glideRecord.next()) {
  		existingSysIds.push(glideRecord.getValue("sys_id"));
  	}

  	return existingSysIds;
  },

  deleteRecords: function (sysIdsToDelete, tableToDeleteFrom) {
  	var glideRecord = new GlideRecord(tableToDeleteFrom);

  	glideRecord.addQuery("sys_id", 'IN', sysIdsToDelete);
  	glideRecord.query();

  	glideRecord.deleteMultiple();
  },

  findSysIdsToDelete: function (valuesToSearch, parentTable, childTable, referenceField, sysIdsOfParentType) {

  	var sysIdsToDelete = [];
  	var existingSysIdsInDb = this.getExistingSysIds(valuesToSearch, parentTable, referenceField);

  	if (existingSysIdsInDb) {

  		for (var index in existingSysIdsInDb) {

  			if (!this.doesSysIdExistInPayload(existingSysIdsInDb[index], sysIdsOfParentType)) {
  				sysIdsToDelete.push(existingSysIdsInDb[index]);
  			}

  		}

  	}
  	this.ciDeleterCounter += sysIdsToDelete.length;
  	return sysIdsToDelete;
  },

  getSysIdsToDelete: function (sysIdsByCiType) {

  	var sysIdsToDeleteByType = {};
  	var sysIdsToDelete;

  	for (var index in this.ciModel) {

  		if(!sysIdsToDeleteByType[this.ciModel[index].parentTable]){
  			sysIdsToDeleteByType[this.ciModel[index].parentTable] = [];
  		}

  		sysIdsToDelete = this.findSysIdsToDelete(
  			sysIdsByCiType[this.ciModel[index].childTable] || [],
  			this.ciModel[index].parentTable,
  			this.ciModel[index].childTable,
  			this.ciModel[index].referenceField,
  			sysIdsByCiType[this.ciModel[index].parentTable] || []
  		);

  		sysIdsToDeleteByType[this.ciModel[index].parentTable] =
  			sysIdsToDeleteByType[this.ciModel[index].parentTable].concat(sysIdsToDelete);
  	}

  	return sysIdsToDeleteByType;

  },

  sortPaylodByClassType: function (payloadFromIE) {
  	var traveredCiItem;
  	var cisByTypeHashmap = {};

  	for (var index in payloadFromIE) {

  		traveredCiItem = payloadFromIE[index];

  			if(traveredCiItem.className){

  				if (this.isMainCi(traveredCiItem)) {
  						traveredCiItem.className = this.mainCiType;
  				}

  				if (!cisByTypeHashmap[traveredCiItem.className]) {
  					cisByTypeHashmap[traveredCiItem.className] = [];
  				}
  				cisByTypeHashmap[traveredCiItem.className].push(traveredCiItem.sysId);
  			}
  		}

  		return cisByTypeHashmap;
  	},

  	deleteUnusedCis: function(sysIdsToDeleteByType){

  		for(var tableName in sysIdsToDeleteByType){
  			this.deleteRecords(sysIdsToDeleteByType[tableName] ,tableName);
  		}
  	},

  	compareAndDeleteUnusedCisFromDB: function (payloadFromIE) {

  		var sysIdsByCiType, sysIdsToDeleteByType;

  		sysIdsByCiType = this.sortPaylodByClassType(payloadFromIE);
  		sysIdsToDeleteByType = this.getSysIdsToDelete(sysIdsByCiType);
  		
  		if (this.ciDeleterCounter > 0) {
  			DiscoveryLogger.info("Old Ci's number deleted: " + this.ciDeleterCounter, 'CiDeleter' ,this.getEccQueueId(), null);
  		}
  		
  		this.deleteUnusedCis(sysIdsToDeleteByType);
  	},

  	type: 'CiDeleter'
};

Sys ID

2312deb0dbb4a200d8c976231f96198c

Offical Documentation

Official Docs: