Name

global.VCenterNetworksSensor

Description

Implementation of the VMWare - vCenter Networks sensor. Create network records. Relate networks to VMs, ESX hosts and the datacenter.

Script

/* jshint -W030 */

var VCenterNetworksSensor;

// DiscoveryCMPUtils won't be available if cloud management isn't active.  Declaring
// this ensures that we won't get an exception when we check to see if it's active.
var DiscoveryCMPUtils;

(function() {

var vCenterSysId, vCenterUuid, datacenterMorId, datacenterSysId,esxSysId,
  _this, enableCmpApi,lookUpSysIds,
  dvsMap = { },
  networkDvpgDvsSchema = {
  	index: [ 'object_id', 'vcenter_uuid', 'server' ],
  	fixup: fixup,
  	preWriteRels: preWriteRels,
  	parentOf: {
  		cmdb_ci_esx_server: 'Provided by::Provides',
  		cmdb_ci_vcenter_dv_port_group: 'Connected by::Connects',
  		hostedOn: 'Hosted on::Hosts'

  	},
  	childOf: {
  		cmdb_ci_vcenter_datacenter: 'Contains::Contained by',
  		cmdb_ci_vmware_instance: 'Connected by::Connects',
  		cmdb_ci_vmware_template: 'Connected by::Connects'
  	}
  },
  networkSchema = {
  	cmdb_ci_vcenter_network: Object.create(networkDvpgDvsSchema),
  	cmdb_ci_vcenter_dv_port_group: Object.create(networkDvpgDvsSchema),
  	cmdb_ci_vcenter_dvs: Object.create(networkDvpgDvsSchema)
  },
  args = {
  	schema: networkSchema
  };

VCenterNetworksSensor = {
  process: process,
  type: "DiscoverySensor"
};

/*
Sample data.  Truncated for brevity, so possibly inconsistent:
{
"cmdb_ci_vcenter_network": [
  {
    "type": "DistributedVirtualPortgroup",
    "morid": "dvportgroup-28",
    "accessible": true,
    "name": "DC1_DVPG0",
    "dvs_ref": "dvs-2500",
    "vm": [
      "vm-1612",
      "vm-9068"
    ],
    "cmdb_ci_esx_server": [
      "host-5624",
      "host-7452"
    ]
  }
]
}
*/
//////////////////////////////////////////////////////////////////////////
function process(result) {

  getProbeParms();

  _this = this;

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

  if (esxSysId)
  	lookUpSysIds = VMUtils.lookupSysIdsESX; 
  else
  	lookUpSysIds = VMUtils.lookupSysIds;
  

  // 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.root = g_probe.getDocument().getDocumentElement();
  this.statusID = new DiscoveryStatus(g_probe.getParameter('agent_correlator')+'');

  args.results = JSON.parse(output);

  VMUtils.triggerNextPage(_this, args.results.leftOverMors);

  args.results.cmdb_ci_vcenter_dvs.forEach(
  	function(dvs) {
  		dvsMap[dvs.morid] = dvs;
  	});

  JsonCi.prepare(args);
  JsonCi.writeJsObject(args);
  JsonCi.updateRelationships(args);
  enableCmpApi && DiscoveryCMPUtils.callCmpApi(args.results, vCenterUuid, datacenterMorId);

  // Trigger probes configured to run after the networks sensor.
  VMUtils.triggerProbes(_this, {
  	network: args.results.cmdb_ci_vcenter_network,
  	portGroup: args.results.cmdb_ci_vcenter_dv_port_group,
  	dvs: args.results.cmdb_ci_vcenter_dvs
  });
}

//////////////////////////////////////////////////////////////////////////
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') || '') + '';
  enableCmpApi = DiscoveryCMPUtils.isCmpActive() && (('' + g_probe.getParameter('enable_cmp_qa')) == 'true');
  esxSysId = (g_probe.getParameter('esx_sys_id') || '') + '';
}

//////////////////////////////////////////////////////////////////////////
function fixup(networkDvpgDvs) {
  var dvsMorId = networkDvpgDvs.dvs_ref;

  networkDvpgDvs.cmdb_ci_vcenter_datacenter = datacenterSysId;

  if (DiscoveryCMPUtils.isCmpActive())
  	networkDvpgDvs.hostedOn = datacenterSysId;

  networkDvpgDvs.vcenter_ref = vCenterSysId;
  networkDvpgDvs.vcenter_uuid = vCenterUuid;
  networkDvpgDvs.object_id = networkDvpgDvs.morid;
  networkDvpgDvs.accessible = !!networkDvpgDvs.accessible;
  networkDvpgDvs.server = esxSysId;

  // We may or may not have the DVS for a port group in this payload and/or in the database.
  // We've mapped the DVSs in the payload into dvsMap.  Try to use one of those first.  If
  // the DVS isn't in this payload then try to look it up in the database.
  if (dvsMorId) {
  	networkDvpgDvs.dvs_ref = dvsMap[dvsMorId] || lookUpSysIds(dvsMorId, 'cmdb_ci_vcenter_dvs', vCenterSysId || esxSysId);
  }


  // The DVS isn't in this payload or the DB.  Create a placeholder for it.
  if (dvsMorId && !networkDvpgDvs.dvs_ref)
  	networkDvpgDvs.dvs_ref = {
  		vcenter_uuid: vCenterUuid,
  		vcenter_ref: vCenterSysId,
  		object_id: dvsMorId,
  		morid: dvsMorId,
  		server:esxSysId
  	};
}

//////////////////////////////////////////////////////////////////////////
function preWriteRels(networkDvpgDvs) {

  var instanceSysMor = [],
  	templateSysMor = [];
  
  	networkDvpgDvs.cmdb_ci_esx_server = lookUpSysIds(networkDvpgDvs.cmdb_ci_esx_server, 'cmdb_ci_esx_server', esxSysId || vCenterSysId, 'morid');
  	networkDvpgDvs.cmdb_ci_vmware_instance = lookUpSysIds(networkDvpgDvs.vm, 'cmdb_ci_vmware_instance', esxSysId || vCenterSysId, 'object_id', instanceSysMor);
  	networkDvpgDvs.cmdb_ci_vmware_template = lookUpSysIds(networkDvpgDvs.vm, 'cmdb_ci_vmware_template', esxSysId || vCenterSysId, 'object_id', templateSysMor);

  	if (networkDvpgDvs.portgroup)
  		networkDvpgDvs.cmdb_ci_vcenter_dv_port_group = lookUpSysIds(networkDvpgDvs.portgroup, 'cmdb_ci_vcenter_dv_port_group', esxSysId || vCenterSysId);
  
}

})();

Sys ID

de4f7b6f8f575200c2fe0b5437bdeee4

Offical Documentation

Official Docs: