Name
sn_itom_licensing.ITOMHealthCiCountsWrongDomainFixer
Description
Summarize all itom_lu_ci_counts recrods with domain that is not legal into global domain record + remove the summarized records.
Script
var OTOM_SKU_TYPE = "otm";
var ITOM_SKU_TYPE = "itom";
var APPS = ["Health", "HLA"];
var itomLicensingUtils = new ITOMLicensingUtilsStore();
var recordsInsertedForAppSkuForLog = 0;
var recordsRemovedForAppSkuForLog = 0;
var sysCreatedOnForRemove = new GlideDateTime('1970-01-01 00:00:00');
var userName = '';
var ITOMHealthCiCountsWrongDomainFixer = Class.create();
ITOMHealthCiCountsWrongDomainFixer.prototype = {
initialize: function(updateRealData) {
this.updateData = (!gs.nil(updateRealData) && updateRealData == 'true') ? true : false;
},
fixDomain: function() {
this.logMessage('Script start. this.updateData:' + this.updateData);
var skuIds = itomLicensingUtils._getSKUIDs();
userName = gs.getUser().getName();
// Loaded from domain table, or if table doesnot exist, filled with 'global' only
var domainList = itomLicensingUtils.getDomains();
this.logMessage('domains (from domain table or global if it does not exist):' + JSON.stringify(domainList));
this.logMessage('Start handling otm records.');
var otmSkuSysId = skuIds[OTOM_SKU_TYPE];
if (otmSkuSysId) {
// check if OTM is supported
if (!itomLicensingUtils.isOTDependencyPresent()) {
// updating otm records to be removed
this.removeOtmRecords(otmSkuSysId);
} else {
this.fixBySku(OTOM_SKU_TYPE, otmSkuSysId, domainList);
}
} else {
this.logMessage('Failed to find OTM sku in itom_lu_sku_type.');
}
this.logMessage('Start handling itom records.');
var itomSkuSysId = skuIds[ITOM_SKU_TYPE];
this.fixBySku(ITOM_SKU_TYPE, itomSkuSysId, domainList);
},
fixBySku: function(sku, skuTypeSysId, domainList) {
for (var i = 0; i < APPS.length; i++) {
this.summarizeRecordIntoGlobalByAppAndSku(sku, APPS[i], skuTypeSysId, domainList);
}
},
summarizeRecordIntoGlobalByAppAndSku: function(sku, app, skuTypeSysId, domainList) {
this.logMessage('Going to fix App:' + app + ' for sku:' + sku);
// select all the non aggregated records of the sku+app
var centralTableGr = new GlideRecord('itom_lu_ci_counts');
centralTableGr.addQuery('is_aggregated', 'false');
centralTableGr.addQuery('sku', skuTypeSysId);
centralTableGr.addQuery('value_stream', app);
centralTableGr.addQuery('sys_created_on', '>', sysCreatedOnForRemove);
centralTableGr.orderByDesc('sys_created_on');
centralTableGr.orderBy('category');
centralTableGr.query();
// Init counters for log
recordsInsertedForAppSkuForLog = 0;
recordsRemovedForAppSkuForLog = 0;
var prevCategory = '';
var prevSysCreatedOn = '';
var prevSysUpdatedOn = '';
var prevUserCreated = '';
var totalCount = 0;
// If we have only 1 record of global that summarized, that record will remain
var hasGlobalRecord = false;
var recordsToDelete = [];
this.logMessage('Going to check ' + centralTableGr.getRowCount() + ' records for ' + app + '-' + sku);
// loop over all none aggregated records for each sku + app
while (centralTableGr.next()) {
// If category or creation date was changed, a new summarized should start
if (prevCategory != '' &&
(prevCategory != centralTableGr.getValue('category') ||
prevSysCreatedOn != centralTableGr.getValue('sys_created_on'))) {
this.updateCentralTable(sku, skuTypeSysId, app, prevUserCreated, prevCategory, prevSysCreatedOn, prevSysUpdatedOn, hasGlobalRecord, recordsToDelete, totalCount);
totalCount = 0;
hasGlobalRecord = false;
recordsToDelete = [];
prevSysUpdatedOn = '';
}
var domain = centralTableGr.getValue('sys_domain');
// Summarize record if is a global domain or if the domain is not exist in domain list
if (domain == 'global' || !new global.ArrayUtil().contains(domainList, domain)) {
var count = parseInt(centralTableGr.getValue('count'));
totalCount = totalCount + count;
if (domain == 'global' && hasGlobalRecord == false) {
hasGlobalRecord = true;
prevSysUpdatedOn = centralTableGr.getValue('sys_updated_on');
}
recordsToDelete.push(centralTableGr.getUniqueValue());
}
prevCategory = centralTableGr.getValue('category');
prevSysCreatedOn = centralTableGr.getValue('sys_created_on');
prevUserCreated = centralTableGr.getValue('sys_created_by');
}
// insert the last combination of category+createdData, since we went out of the loop and the records weren't updated
this.updateCentralTable(sku, skuTypeSysId, app, prevUserCreated, prevCategory, prevSysCreatedOn, prevSysUpdatedOn, hasGlobalRecord, recordsToDelete, totalCount);
this.logMessage('Finished to fix App:' + app + ' for sku ' + sku + ' records insered:' + recordsInsertedForAppSkuForLog + ' records removed:' + recordsRemovedForAppSkuForLog);
},
updateCentralTable: function(sku, skuTypeSysId, app, createdUser, category, createdDateTime, updatedDateTime, hasGlobalRecord, recordsToDelete, totalCount) {
if (recordsToDelete.length > 1 || (!hasGlobalRecord && recordsToDelete.length > 0)) {
// insert global record + remove summarized records
recordsInsertedForAppSkuForLog += 1;
recordsRemovedForAppSkuForLog += recordsToDelete.length;
this.logMessage("going to insert sku:" + sku + ' app:' + app + ' category:' + category + ' created:' + createdDateTime + ' updated:' + updatedDateTime + ' totalCount:' + totalCount + ' create by:' + createdUser + ' updated by:' + userName + ' and removing ' + recordsToDelete.length + ' summarized records');
this.insertGlobalRecord(skuTypeSysId, app, createdUser, category, createdDateTime, updatedDateTime, totalCount);
this.markRecordsToDelete(recordsToDelete);
}
},
insertGlobalRecord: function(skuTypeSysId, app, createdUser, category, created, currentUpdated, totalCount) {
if (currentUpdated == '') {
currentUpdated = created;
}
var centralTableGr = new GlideRecord('itom_lu_ci_counts');
centralTableGr.initialize();
centralTableGr.setValue('sku', skuTypeSysId);
centralTableGr.setValue('sys_domain', 'global');
centralTableGr.setValue('sys_created_on', created);
centralTableGr.setValue('sys_updated_on', currentUpdated);
centralTableGr.setValue('sys_updated_by', userName);
centralTableGr.setValue('sys_created_by', createdUser);
centralTableGr.setValue('category', category);
centralTableGr.setValue('value_stream', app);
centralTableGr.setValue('count', "" + totalCount);
// Do not update sys_updated_by, sys_updated_on, sys_mod_count, sys_created_by, and sys_created_on
centralTableGr.autoSysFields(false);
if (this.updateData) {
centralTableGr.insert();
}
},
markRecordsToDelete: function(recordsToDelete) {
var gr = new GlideRecord('itom_lu_ci_counts');
gr.addQuery('sys_id', 'IN', recordsToDelete);
gr.setValue('sys_created_on', sysCreatedOnForRemove);
gr.setValue('sys_updated_on', sysCreatedOnForRemove);
if (this.updateData) {
gr.updateMultiple();
}
},
removeOtmRecords: function(skuTypeSysId) {
this.logMessage('Going to update otm records. field sys_created_on will be set to 1970-01-01 00:00:00');
var gr = new GlideRecord('itom_lu_ci_counts');
gr.addQuery('sku', skuTypeSysId);
gr.addQuery('value_stream', 'IN', APPS);
gr.setValue('sys_created_on', sysCreatedOnForRemove);
gr.setValue('sys_updated_on', sysCreatedOnForRemove);
if (this.updateData) {
gr.updateMultiple();
}
this.logMessage('otm records updated.');
},
logMessage: function(message) {
gs.info("ITOMHealthCiCountsWrongDomainFixer - " + message);
},
type: 'ITOMHealthCiCountsWrongDomainFixer'
};
Sys ID
dfba873853f291102b5dddeeff7b12f2