Name

global.VCenterVMTagsSensor

Description

No description available

Script

/* jshint -W030 */

var VCenterVMTagsSensor;

(function() {

var vCenterSysId, vCenterUuid, datacenterMorId, datacenterSysId,
  tagSchema = {
  	cmdb_key_value: {
  		index: [['configuration_item', 'key', 'value']]
  	}
  },
  args = {
  	schema: tagSchema
  };

VCenterVMTagsSensor = {
  process: process,
  type: 'DiscoverySensor'
};

/*
Sample data:
  {
    'cmdb_key_value': [
  	{
  		"morid":"vm-5260",
  		"key":"Dev_lab",
  		"value":"User",
  		"tag":"Tags",
  		"configuration_item":"69d7ee3d674c330018da6c706785ef6c"
  	}
    ]
  }
*/
//////////////////////////////////////////////////////////////////////////
function process(result) {

  var outputData, vmLookUpTableNames = ['cmdb_ci_vmware_instance', 'cmdb_ci_vmware_template'];
  var morIDs = JSON.parse(g_probe.getParameter('mor_ids') + '');
  output = JSON.parse(output);

  getProbeParms();

  args.location = this.getLocationID();
  args.statusId = new DiscoveryStatus(g_probe.getParameter('agent_correlator') + '');

  // During normal discovery g_probe_parameters should always be defined.
  // It's only undefined during test execution.
  if (typeof g_probe_parameters != 'undefined') {
  	g_probe_parameters.cidata = this.getParameter('cidata');
  	g_probe_parameters.source = this.getParameter('source');
  }

  this.statusID = new DiscoveryStatus(g_probe.getParameter('agent_correlator') + '');

  /*
  	We have only mor ids in the output but we need respective sys_ids to persist
  	the tags data into cmdb_key_value table so we retrieve the sys_id in
  	persist in the key called 'configuration_item' that is added for the entries in
  	"output" object

  	Sample data:
  		[
  			{
  				"morid":"vm-5260",
  				"key":"Dev_lab",
  				"value":"User",
  				"tag":"Tags",
  				"configuration_item":"371b127a6780330018da6c706785ef03"
  			},
  			{
  				"morid":"vm-4564",
  				"key":"Dev_lab",
  				"value":"User : System Administrator",
  				"tag":"Tags",
  				"configuration_item":"331b127a6780330018da6c706785ef06"
  			}
  		]
  */
  outputData = output['cmdb_key_value'];
  VMUtils.lookupSysIdsInTables(outputData, vmLookUpTableNames, vCenterSysId, 'object_id', 'configuration_item');

  output['cmdb_key_value'] = outputData;
  args.results = output;
  args.results = JsonCi.prepare(args);
  JsonCi.writeJsObject(args);

  // Fetching Sys ids for the mor ids provided to the pribe
  VMUtils.lookupSysIdsInTables(morIDs, vmLookUpTableNames, vCenterSysId, 'object_id', 'sys_id');

  // Cleaning up the existing old tags data for the VMs Mor IDs provided
  cleanUpOldTagsDataForGivenVMs(output, morIDs);
}


//////////////////////////////////////////////////////////////////////////
function getProbeParms() {
  vCenterSysId = '' + g_probe.getParameter('vcenter_sys_id');
  vCenterUuid = '' + g_probe.getParameter('vcenter_uuid');
  datacenterSysId = '' + g_probe.getParameter('datacenter_sys_id');
  datacenterMorId = '' + g_probe.getParameter('datacenter_mor_id');
}


/*
  Below is the function used to clean-up the old existing tags data for the set of
  VMs provided to the probe. "output" and  "morIDs" are the inputs passed to this.

  Inputs Sample Data is -

  output = {
  			"cmdb_key_value":[
  				{
  					"morid":"vm-5260",
  					"key":"Dev_lab",
  					"value":"User",
  					"tag":"Tags",
  					"configuration_item":"371b127a6780330018da6c706785ef03",
  					"sys_class_name":"cmdb_key_value",
  					"sys_id":"4f99e3ba6700330018da6c706785eff4",
  					"isClean":true,
  					"gr":0
  				},
  				{
  					"morid":"vm-4564",
  					"key":"Dev_lab",
  					"value":"User : System Administrator",
  					"tag":"Tags",
  					"configuration_item":"331b127a6780330018da6c706785ef06",
  					"sys_class_name":"cmdb_key_value",
  					"sys_id":"d7bc223267c0330018da6c706785ef7e",
  					"gr":0,
  					"isClean":true
  				}
  			]
  		}

  morIDs = [
  			{
  				"type":"VirtualMachine",
  				"morid":"vm-5260",
  				"sys_id":"371b127a6780330018da6c706785ef03"
  			},
  			{
  				"type":"VirtualMachine",
  				"morid":"vm-4564",
  				"sys_id":"331b127a6780330018da6c706785ef06"
  			}
  		]
*/
//////////////////////////////////////////////////////////////////////////
function cleanUpOldTagsDataForGivenVMs(output, morIDs) {
  var vCenterTagsSource = 'Tags';
  var obj = {};
  var dataMap = {};
  var updatedCMDBKeyValueRecords = output.cmdb_key_value;

  /*
  	We create a map. Each vm sys_id is the key

  	Sample Data for "dataMap"
  	{
  		"371b127a6780330018da6c706785ef03": [],
  		"331b127a6780330018da6c706785ef06": [],
  		"65d7ee3d674c330018da6c706785ef76": []
  	}
  */
  morIDs.forEach(function(morObj){
  	if (morObj.sys_id)
  		dataMap[morObj.sys_id + ''] = [];
  });

  /*
  	We update the map in such a way that for each VM sys id,
  	any records in cmdb_key_value table are created/updated
  	if so then add all the sys_ids of the cmdb_key_value records
  	in corresponding arrays.

  	Updated Data for "dataMap"
  	{
  		"371b127a6780330018da6c706785ef03": [ 4f99e3ba6700330018da6c706785eff4 ],
  		"331b127a6780330018da6c706785ef06": [ d7bc223267c0330018da6c706785ef7e ],
  		"65d7ee3d674c330018da6c706785ef76": []
  	}

  */
  updatedCMDBKeyValueRecords.forEach(function(obj){
  	var vmSysID = obj.configuration_item + '';
  	if (dataMap.hasOwnProperty(vmSysID))
  		dataMap[vmSysID].push(obj.sys_id);
  });

  for (var i in dataMap) {
  	var vmSysID = i;
  	var keyValueCMDBRecords = dataMap[i];

  	var gr = new GlideRecord('cmdb_key_value');
  	gr.addQuery('tag', vCenterTagsSource);
  	gr.addQuery('configuration_item', vmSysID);
  	gr.addQuery('sys_id', 'NOT IN', keyValueCMDBRecords);
  	gr.deleteMultiple();
  }
}

})();

Sys ID

5a5905d9674c330018da6c706785ef58

Offical Documentation

Official Docs: