Name

global.CloudApplicationsCounter

Description

No description available

Script

var CloudApplicationsCounter = Class.create();
CloudApplicationsCounter.prototype = {

  dbom : undefined,
  cmdbMetadata : undefined,

  initialize: function() {
  	this.dbom = GlideDBObjectManager.get();
  	this.cmdbMetadata = new SNC.CmdbMetadataWrapper();

  },

  /*
   *	This function returns map, that contains all
   *	logical datacenters, that belong to some business service.
   *	Key  : sysClassName of datacenter
   *	Value: array of SysIDs of datacenters, that have this type
  */
  getAllLogicalDatacenters : function() {
  	var res = {};
  	var ldcGr = new GlideRecord('cmdb_ci_logical_datacenter');
  	ldcGr.addJoinQuery('svc_ci_assoc', 'sys_id', 'ci_id');
  	ldcGr.query();
  	while (ldcGr.next()) {
  		var ldcClassName = ldcGr.sys_class_name;
  		var ldcSysId = ldcGr.getUniqueValue();
  		if (!(ldcClassName in res))
  			res[ldcClassName] = [];
  		res[ldcClassName][res[ldcClassName].length] = ldcSysId;
  	}
  	return res;
  },

  /*
   * This function returns array of HostingLink objects,
   * that are relevant for logical datacenters in DB
  */
  getAllHostingLinks : function(ldcClassNames) {
  	var res = [];
  	var resIds = {};

  	for (var i = 0; i < ldcClassNames.length; i++) {
  		var curHostingLinksList = this.cmdbMetadata.getHostedWithInheritance(ldcClassNames[i]);
  		for (var j = 0; j < curHostingLinksList.size(); j++) {
  			var curHl = curHostingLinksList.get(j);
  			var curHlId = '' + curHl.id;
  			if (!(curHlId in resIds)) {
  				res[res.length] = curHl;
  				resIds[curHlId] = 0;
  			}
  		}
  	}

  	return res;
  },


  /*
   * This function returns candidates to be counted as hosted applications
   * Parameters:
   * side1SysIds  - array of logical datacenter SysIDs of same type
   * relTypeSysId - relation type from datacenter of this type to hosted applications
   * side2Types   - array of possible hosted application types
   * side1IsParent - boolean, that says who is parent on relation
   *
   * returns vector of hosted CI SysIDs
   *
  */
  searchHostedApplications : function (side1SysIds, relTypeSysId, side2Types, side1IsParent) {
  	var gr = new GlideRecord('cmdb_rel_ci');
  	gr.addQuery(side1IsParent ? 'parent' : 'child', side1SysIds);
  	gr.addQuery('type', relTypeSysId);
  	gr.addQuery((side1IsParent ? 'child' : 'parent') + '.sys_class_name', side2Types);
  	gr.addJoinQuery('svc_model_assoc_ci', (side1IsParent ? 'child' : 'parent'), 'ci_id');
  	gr.query();

  	var res = [];
  	while (gr.next())
  		res[res.length] = gr.getValue(side1IsParent ? 'child' : 'parent');

  	return res;
  },

  isLdcTypeRelevant : function(ldcType, datacenterType) {
  	var childNames = this.dbom.getAllExtensions(datacenterType);
  	for (var i = 0; i < childNames.size(); i++)
  		if (ldcType == '' + childNames.get(i)) {
  			return true;
  		}
  	return false;

  },

  /*
   * This function returns all hosted applications
   */
  getApplications : function() {
  	var ldcMap = this.getAllLogicalDatacenters();
  	var ldcSysClassNames = [];
  	var res = [];

  	for (var ldcSysClassName in ldcMap)
  		ldcSysClassNames[ldcSysClassNames.length] = ldcSysClassName;
  	if (ldcSysClassNames.length == 0)
  		return res;

  	var hostingLinks = this.getAllHostingLinks(ldcSysClassNames);
  	for (var hl = 0; hl < hostingLinks.length; hl++) {
  		var hostingLink = hostingLinks[hl];
  		var hostedCiType       = hostingLink.parentType;
          var datacenterType     = '' + hostingLink.childType;
          var relTypeId          = '' + hostingLink.relationId;
          var datacenterIsParent = (hostingLink.isReverseRelation == 'true');

  		var isLdcFound = false;

  		for (var ldcTypeIndex = 0;  ldcTypeIndex < ldcSysClassNames.length; ldcTypeIndex++) {
  			if (this.isLdcTypeRelevant(ldcSysClassNames[ldcTypeIndex], datacenterType)) {
  				isLdcFound = true;
  				break;
  			}
  		}

  		if (isLdcFound) {
  			var childNames = this.dbom.getAllExtensions(hostedCiType);
  			if (childNames == null)
  				continue;
  			var hostedClassNames = [];
  			for (var t = 0; t < childNames.size(); t++)
  				hostedClassNames[hostedClassNames.length] = '' + childNames.get(t);

  			for (var existingLdcType in ldcMap) {
  				if (!this.isLdcTypeRelevant(existingLdcType, datacenterType))
  					continue;
  				var candidates = this.searchHostedApplications(ldcMap[existingLdcType],
  															   relTypeId,
  															   hostedClassNames,
  															   datacenterIsParent);
  				for (var c = 0; c < candidates.length; c++)
  					res[res.length] = candidates[c];
  			}
  		}

  	}
  	return res;

  },

  /*
   * This function is external API
   * It returns map : domain to integer counter of applications
   */
  getCloudApplicationCounters : function () {
  	var res = {};
  	var applicationsToCount = this.getApplications();

  	for (var c = 0; c < applicationsToCount.length; c++) {
  		var applGr = new GlideRecord('cmdb_ci');
  		applGr.get(applicationsToCount[c]);

  		var domain = applGr.sys_domain;
  		if (!(domain in res))
  			res[domain] = 1;
  		else
  			res[domain]++;
  	}
  	return res;
  },

  /*
   * This function is external API
   * It returns map : domain to list of objects, each one has
   * properties: sys_id and name
   */
  getCloudApplications : function () {
  	var res = {};
  	var applicationsToCount = this.getApplications();

  	for (var c = 0; c < applicationsToCount.length; c++) {
  		var applGr = new GlideRecord('cmdb_ci');
  		applGr.get(applicationsToCount[c]);

  		var domain = applGr.sys_domain;
  		if (!(domain in res))
  			res[domain] = [];

  		var appl = {};
  		appl.sys_id = applicationsToCount[c];
  		appl.name   = applGr.name;
  		appl.sys_class_name   = applGr.sys_class_name;

  		res[domain][res[domain].length] = appl;
  	}
  	return res;
  },


  type: 'CloudApplicationsCounter'
};

Sys ID

c8c24d23f33132007b25ae4716612bb9

Offical Documentation

Official Docs: