Name

global.VCenterDatastoresSensor

Description

Implementation of the VMWare - vCenter Datastores sensor. Create datastores, datastore hostmounts and datastore disks. Relate each datastore to its VMs, ESX hosts and datacenter. Relate datastore disks to their datastore.

Script

/* jshint -W030 */

var VCenterDatastoresSensor;

// 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,
  _this, enableCmpApi,esxSysId,lookUpSysIds,
  vmMap = { },
  datastoreSchema = {
  	cmdb_ci_vcenter_datastore: {
  		index: [ 'morid', 'vcenter_uuid', 'server' ],
  		fixup: fixupDatastore,
  		preWriteRels: preWriteDatastoreRels,
  		parentOf: {
  			cmdb_ci_vmware_instance: 'Provides storage for::Stored on',
  			cmdb_ci_vmware_template: 'Provides storage for::Stored on',
  			cmdb_ci_esx_server: 'Used by::Uses',
  			cmdb_ci_vcenter_datastore: 'Cluster of::Cluster',
  			hostedOn: 'Hosted on::Hosts'
  		},
  		childOf: {
  			cmdb_ci_vcenter_datacenter: 'Contains::Contained by'
  		}
  	},
  	vcenter_datastore_hostmount: {
  		index: [ 'datastore', 'esx_server' ],
  		fixup: fixupHostmount,
  		preWrite: preWriteHostMount
  	},
  	cmdb_ci_vcenter_datastore_disk: {
  		index: [ 'vcenter_uuid', 'name', 'datastore' ],
  		fixup: fixupDatastoreDisk,
  		childOf: {
  			cmdb_ci_vcenter_datastore: 'Provided by::Provides'
  		},
  		parentOf: {
  			cmdb_ci_storage_device: 'Exports to::Imports from'
  		}
  	}
  },
  args = {
  	schema: datastoreSchema
  };

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

/*
Sample data.  Truncated for brevity, so possibly inconsistent:
  {
    "cmdb_ci_vcenter_datastore": [
  	{
  	  "type": "VMFS",
  	  "morid": "datastore-490",
  	  "thin": true,
  	  "vm": [

  	  ],
  	  "host": [
  		{
  		  "host": "host-381",
  		  "accessible": true,
  		  "access_mode": "readWrite",
  		  "datastore": "<reference to datastore-490>"
  		}
  	  ],
  	  "accessible": false,
  	  "capacity": 1024,
  	  "freespace": 768,
  	  "name": "SANLAB1DS_DC0_C7_H1_0",
  	  "url": "ds:\/\/\/vmfs\/volumes\/52f01bf4-637d-bf51-2f00-f06cdf6c2984\/"
  	}
    ],
    "vcenter_datastore_hostmount": [
  	{
  	  "host": "host-381",
  	  "accessible": true,
  	  "access_mode": "readWrite",
  	  "datastore": "<reference to datastore-490>"
  	}
    ],
    "cmdb_ci_vcenter_datastore_disk": [
  	{
  	  "datastore": "<reference to datastore-490>",
  	  "name": "mpx.vmhba1:C0:T0:L0",
  	  "correlation_id": "0000000000766d686261313a303a30",
  	  "size_bytes": 587128266752
  	}
    ]
  }
*/
//////////////////////////////////////////////////////////////////////////
function process(result) {

  var datastores, hosts, networks, vms,
  	parms,
  	parentOf = datastoreSchema.cmdb_ci_vcenter_datastore.parentOf;

  _this = this;

  getProbeParms();

  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');
  }

  args.results = JSON.parse(output);
  args.results = JsonCi.prepare(args);

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

  JsonCi.writeJsObject(args);

  // Trigger probes configured to run after the datastores sensor.
  VMUtils.triggerProbes(_this, { datastore: args.results.cmdb_ci_vcenter_datastore });

  args.results.cmdb_ci_vcenter_datastore_disk.forEach(
  	function(dsd) {
  		dsd.cmdb_ci_vcenter_datastore = dsd.datastore;
  	});
  JsonCi.updateRelationships(args, vCenterUuid);

  enableCmpApi && DiscoveryCMPUtils.callCmpApi(args.results, vCenterUuid, datacenterMorId);
}

//////////////////////////////////////////////////////////////////////////
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 fixupHostmount(hm) {
  hm.esx_server = lookUpSysIds(hm.host, 'cmdb_ci_esx_server', esxSysId || vCenterSysId, 'morid');
  hm.vcenter_ref = vCenterSysId;
}

//////////////////////////////////////////////////////////////////////////
function preWriteHostMount(hm) {
  // Normally this function would call the default preWrite function to set first & last
  // discovered, etc.  The hostmount table, though, doesn't extend cmdb_ci, so it doesn't
  // have any of those fields.
  return !!hm.esx_server;
}

//////////////////////////////////////////////////////////////////////////
function fixupDatastore(ds) {
  ds.vcenter_ref = vCenterSysId;
  ds.vcenter_uuid = vCenterUuid;
  ds.accessible = !!ds.accessible;
  ds.server =  esxSysId;
  ds.object_id = ds.morid;

  ds.cmdb_ci_vcenter_datacenter = datacenterSysId;

  if (DiscoveryCMPUtils.isCmpActive())
  	ds.hostedOn = datacenterSysId;
}

//////////////////////////////////////////////////////////////////////////
function preWriteDatastoreRels(ds) {

  ds.cmdb_ci_esx_server = [ ];
  // ESX Standalone discovery else vCenter discovery
  if (esxSysId)
  	ds.cmdb_ci_esx_server.push(esxSysId);
  else {
  	ds.host.forEach(
  	function(host) {
  		var sysId = VMUtils.lookupSysIds(host.host, 'cmdb_ci_esx_server', vCenterSysId, 'morid');
  		if (sysId)
  			ds.cmdb_ci_esx_server.push(sysId);
  	});
  }

  ds.cmdb_ci_vcenter_datastore = lookUpSysIds(ds.stores, 'cmdb_ci_vcenter_datastore', vCenterSysId || esxSysId);
  ds.cmdb_ci_vmware_instance = lookUpSysIds(ds.vm, 'cmdb_ci_vmware_instance', vCenterSysId || esxSysId);
  if(!esxSysId)
  	ds.cmdb_ci_vmware_template = VMUtils.lookupSysIds(ds.vm, 'cmdb_ci_vmware_template', vCenterSysId);

}

//////////////////////////////////////////////////////////////////////////
function fixupDatastoreDisk(dsd) {
  var gr,
  	hosts = [];
  
  dsd.vcenter_uuid = vCenterUuid;

  dsd.datastore.host.forEach(function(host) { hosts.push(host.host); });
  hosts = lookUpSysIds(hosts, 'cmdb_ci_esx_server', vCenterSysId || esxSysId, 'morid');

  dsd.cmdb_ci_storage_device = [ ];
  gr = new GlideRecord('cmdb_ci_storage_device');
  gr.addQuery('computer.sys_class_name', 'cmdb_ci_esx_server');
  gr.addQuery('device_id', dsd.name);
  gr.addQuery('computer', 'IN', hosts);
  gr.query();
  while (gr.next())
  	dsd.cmdb_ci_storage_device.push('' + gr.sys_id);
}

})();

Sys ID

b42700228f1b1200c2fe0b5437bdeef2

Offical Documentation

Official Docs: