Name

global.EvtMgmtHealthMapBuilder

Description

No description available

Script

var EvtMgmtHealthMapBuilder = Class.create();
EvtMgmtHealthMapBuilder.prototype = {
  
  //Please note, this script is used from HLA script HLASelfHealthManager
  
  initialize: function() {
  	this.DISCOVERY_SOURCE = 'discovery_source';
  },
  
  serviceName:function(){
  	return "ServiceNow Event Management";
  },
  
  eventSourcesName:function(){
  	return "Event Sources";
  },

  eventSourcesInternalName:function(){
  	return "Event Sources";
  },
  
  midServersName:function(){
  	return "MID Servers";
  },

  midServersInternalName:function(){
  	return "MID Servers";
  },
  
  createService:function(){
  	
  	var healthCommon = new EvtMgmtHealthMonitorCommon();
  	
  	if (!healthCommon.allowHealthToRun() || healthCommon.selfHealthOnlyAlertsActive()){
  		return false;
  	}

  	var createdNewService = false;
  					
  	/*********************************************/
  	// -------------- Helper methods -------------/

  	/*********************************************/
  	// --- Static Service Component Modeling -----/
  
  	var service = this.createServiceName();
  
  	var em = this.createEmApp();

  	var mids = new GlideRecord("cmdb_ci_appl_now_app_comp");
  	this.insertOrUpdate(mids, {internal_name: this.midServersInternalName(), name: this.midServersName(), 
  							   discovery_source: "EventManagement"});

  	var evProc = new GlideRecord("cmdb_ci_appl_now_app_comp");
  	this.insertOrUpdate(evProc, {internal_name: "Event Processing", name: "Event Processing", 
  								 discovery_source: "EventManagement"});

  	var evSources = new GlideRecord("cmdb_ci_appl_now_app_comp");
  	this.insertOrUpdate(evSources, {internal_name: this.eventSourcesInternalName(), name: this.eventSourcesName(), 
  									discovery_source: "EventManagement"});

  	var alertProc = new GlideRecord("cmdb_ci_appl_now_app_comp");
  	this.insertOrUpdate(alertProc, {internal_name: "Alert Processing", name: "Alert Processing", 
  									discovery_source: "EventManagement"});
  	
  	var impactCalc = new GlideRecord("cmdb_ci_appl_now_app_comp");
  	this.insertOrUpdate(impactCalc, {internal_name: "Impact Calculation", name: "Impact Calculation", 
  									discovery_source: "EventManagement"});

  	this.createRel(service, em);
  	this.createRel(service, mids);
  	this.createRel(em, evProc);
  	this.createRel(em, evSources);
  	this.createRel(em, alertProc);
  	this.createRel(em, impactCalc);


  	/*********************************************/
  	// ------- Dynamic Connector Modeling --------/
  	gs.info("createConnectorCIs - start");
  	var existingCis={};
  	var grConnectorCis = new GlideRecord('cmdb_ci_appl_now_connector');	
  	this.query (grConnectorCis, {category: "Connector"});
  	while (grConnectorCis.next()){
  		existingCis["" + grConnectorCis.correlation_id] = "Delete";
  	}
  	var grConnectors = new GlideRecord('em_connector_instance');
  	this.query(grConnectors, {active:true});
  		
  	while (grConnectors.next()){
  		this.addOrUpdateConnector(grConnectors);
  		var id = grConnectors.sys_id;
  		if (existingCis[id]) {
  			existingCis[id] = "Exists";
  			gs.debug("Connector Exists - "+grConnectors.name+" "+id);
  		} else {
  			// no CI for this connector, add it.
  			gs.debug("Connector Added - "+grConnectors.name+" "+id);
  		}			
  	}
  	var ci;
  	for (var connectorId in existingCis){
  		if (existingCis[connectorId]=="Delete"){
  			var grConnectorCi = new GlideRecord("cmdb_ci_appl_now_connector");
  			this.query(grConnectorCi, {"correlation_id": connectorId, category:"Connector"});
  			while (grConnectorCi.next()){
  				this.removeDynamicCi(grConnectorCi);
  			}

  			//delete this one
  		}				
  	}

  	/*********************************************/
  	// ------- Dynamic MID Modeling --------/
  	// add mid servers
  	var ecc_agent = new GlideRecord("ecc_agent");
  	ecc_agent.addQuery('validated', 'true');
  	ecc_agent.query();
  	var activeMids = {};
  	var mid;
  	while (ecc_agent.next()) {
  		mid = this.addOrUpdateMid(ecc_agent);
  		// ci already exists for this connector, flag it
  		activeMids["" + mid.sys_id] = true;
  	}

  	// delete rels to not found mids
  	mid = new GlideRecord("cmdb_ci_appl_now_mid");
  	this.query(mid, {category: "MID"});
  	while(mid.next()) {
  		if (!activeMids["" + mid.sys_id]) {
  			this.removeDynamicCi(mid);
  		}
  	}

  	
  	/*********************************************/
  	// ------ Call Manual Service Builder --------/
  	return this.buildService(service);
  },
  
  buildService : function (service){
  	/*********************************************/
  	// ------ Call Manual Service Builder --------/
  	var bsm = new SNC.BusinessServiceManager(); 
  	var exclusionListRelations = gs.getProperty("sa.mapping.system.manual.rel_type.blacklist","");
  	exclusionListRelations = exclusionListRelations.split(',');
  	
  	var emExclusionListRelations = gs.getProperty("evt_mgmt.hlt_monitor_rel_type_exclusive_list","");
  	emExclusionListRelations = emExclusionListRelations.split(',');
  	// Always exclude "Runs on::Runs" type by default
  	emExclusionListRelations.push('60bc4e22c0a8010e01f074cbe6bd73c3');
  	
  	
  	var exclusions = exclusionListRelations.concat(emExclusionListRelations).filter(function(s) { return s }).join(',');
  	
  	if (!bsm.populateDiscoveredService(service.getUniqueValue(), 5, exclusions)) {
  		gs.log('Failed to populate Self Health service. ' + bsm.error);
  		return bsm.error;
  	}
  	return null;
  },
  
  /*********************************************/
  // ------ Dynamic Add Remove --------/
  
  removeDynamicCi : function (grToRemove){
  	var service = new GlideRecord("cmdb_ci_service_discovered");
  	this.query(service, {name: this.serviceName()});
  	if (service.next()){
  		this.removeRel(grToRemove);
  		this.removeFromModel(service, grToRemove);
  		gs.debug("Delete CI relationship -"+grToRemove.name);			
  	} else {
  		gs.debug("Cound not retrieve service");
  	}
  },
  
  addOrUpdateConnector : function (grConnector){
  	var grSources = new GlideRecord("cmdb_ci_appl_now_app_comp");
  	this.query(grSources, {internal_name: this.eventSourcesInternalName()});
  	if (grSources.next()){
  		var id = "" + grConnector.sys_id;
  		var name = "" + grConnector.name;
  		//var host = "" + grConnector.host;
  		var flds = {name: name, correlation_id:id, category: "Connector", 
  					connector:id, discovery_source: "EventManagement"};
  		this.updateDynamicCi("cmdb_ci_appl_now_connector", flds, grSources, id);
  		
  	} else {
  		gs.debug("Cound not retrieve parent: Event Sources");
  	}
  },
  
  addOrUpdateMid : function (grEccAgent){
  	var mids = new GlideRecord("cmdb_ci_appl_now_app_comp");
  	this.query(mids, {internal_name: this.midServersInternalName()});
  	if (mids.next()){
  		var name = "" + grEccAgent.name;
  		var fqdn = "" + grEccAgent.host_name;
  		var ip = "" + grEccAgent.ip_address;
  		var id = "" + grEccAgent.sys_id;
  		var version = "" + grEccAgent.version;
  		var midFlds = {name: name, fqdn: fqdn, ip_address: ip, 
  					   correlation_id: id, version: version, category: "MID", 
  					   mid_server:id, discovery_source: "EventManagement"};
  		var mid = this.updateDynamicCi("cmdb_ci_appl_now_mid", midFlds, mids, id);
  		
  		return mid;			
  	} else {
  		gs.debug("Cound not retrieve parent: MIDs");
  	}

  },
  
  updateDynamicCi : function (type, fields, parent, id){
  	var grCi = new GlideRecord(type);
  	this.insertOrUpdateById(grCi, fields, id);
  	this.createRel(parent, grCi);
  	return grCi;
  },
  
  /*********************************************/
  // -------------- Helper methods -------------/
  query: function(gr, vals) {
  	gs.debug("query " + gr.getTableName() + ", fields: " + JSON.stringify(vals));
  	for (var key in vals) {
  		if (key === "name" && vals.internal_name) //ignore 'name' in case internal name exists - use  internal name to query
  			continue;
  		if (key === this.DISCOVERY_SOURCE) // Skip 'discovery_source' in query as it's a dynamic field that might return inconsistent results
  			continue;
  		gr.addQuery(key, vals[key]);
  	}
  	return gr.query();
  },

  queryByCorrelationId: function(gr, correlationId) {
  	gs.debug("query " + gr.getTableName() + ", correlationId: " + correlationId);
  	gr.addQuery("correlation_id", correlationId);
  	return gr.query();
  },

  update: function(gr, vals) {
  	var sessionId = this.changeDomain();
  	
  	for (var key in vals) {
  		gr.setValue(key, vals[key]);
  	}
  	var ret = gr.update();
  	
  	gs.getSession().setDomainID(sessionId);
  	
  	return ret;
  		
  },

  insert : function(gr, vals) {
  	var sessionId = this.changeDomain();
  	for (var key in vals) {
  		gr.setValue(key, vals[key]);
  	}
  	var ret =  gr.insert();  
  	
  	gs.getSession().setDomainID(sessionId);
  	
  	return ret;
  },

  deleteRecord : function(gr, vals) {
  	var sessionId = this.changeDomain();
  	for (var key in vals) {
  		gr.addQuery(key, vals[key]);
  	}
  	var ret = gr.deleteMultiple();

  	gs.getSession().setDomainID(sessionId);
  	
  	return ret;
  },

  insertOrUpdate : function(gr, vals) {
  	this.query(gr, vals);
  	if (gr.next())
  		return this.update(gr, vals);

  	return this.insert(gr, vals);
  },

  insertOrUpdateById : function(gr, vals, id) {
  	this.queryByCorrelationId(gr, id);
  	if (gr.next())
  		return this.update(gr, vals);

  	return this.insert(gr, vals);
  },

  createRel : function(source, target) {
  	var gr = new GlideRecord("cmdb_rel_ci");
  	// create Depends On::Used By relation
  	var fields = {parent: "" + source.sys_id, child: "" + target.sys_id, type: "1a9cb166f1571100a92eb60da2bce5c5"};
  	gs.debug("createRel: " + JSON.stringify(fields));
  	this.insertOrUpdate(gr, fields);
  },

  removeRel : function(target) {
  	var gr = new GlideRecord("cmdb_rel_ci");
  	// create Depends On::Used By relation
  	var fields = { child: "" + target.sys_id, type: "1a9cb166f1571100a92eb60da2bce5c5"};
  	gs.debug("removeRel: " + JSON.stringify(fields));
  	this.deleteRecord(gr, fields);
  },

  removeFromModel : function(manualService, ci) {
  	var sm = new SNC.BusinessServiceManager();
  	if (!sm.removeManualCi(ci.getUniqueValue(), manualService.getUniqueValue())) {  
  		gs.log('Self health: Failed to remove CI ' + sm.error);
  		return sm.error;
  	}
  	return null;          
  },
  
  changeDomain: function (){
  	var orgSessionID = gs.getSession().getCurrentDomainID();		
           
  	var domainForSessionChange = GlideProperties.get("evt_mgmt.domain_self_monitoring", "");

  	if (orgSessionID != domainForSessionChange && GlideStringUtil.notNil(domainForSessionChange)) {
  		gs.debug("Changing domain from "+orgSessionID+" to "+domainForSessionChange);
  		gs.getSession().setDomainID(domainForSessionChange);
  		return orgSessionID;
  	}
  	
  	return null;
  },
  
  createServiceName: function() {
  	
  	var service = new GlideRecord("cmdb_ci_service_discovered");
  	this.query(service, {name: this.serviceName()});
  	if (!service.next()) {
  		createdNewService = true;
  		this.insert(service, {name: this.serviceName(), operational_status: 1});
  	}
  	
  	return service;
  },
  
  createEmApp: function() {
  	
  	var em = new GlideRecord("cmdb_ci_appl_now_app");
  	this.insertOrUpdate(em, {internal_name: "Event Management",
  						name: "Event Management", discovery_source: "EventManagement"});
  	return em;
  },
  
  createMonitoringApp: function() {
  	
  	var service = this.createServiceName();
  	var em = this.createEmApp();
  	
  	var monitoring = new GlideRecord("cmdb_ci_appl_now_app_comp");
  	this.insertOrUpdate(monitoring, {internal_name: "Monitoring", name: "Monitoring", 
  									discovery_source: "EventManagement"});

  	this.createRel(em, monitoring);
  },


  type: 'EvtMgmtHealthMapBuilder'
};

Sys ID

9ada5de37f00030002d31ccebefa911e

Offical Documentation

Official Docs: