Skip to content

Commit b4edf77

Browse files
committed
Merge pull request saltstack#31412 from lomeroe/vmware_add_hw_grains
Vmware ESXi proxy - add hw grains
2 parents 1fc2b71 + 5409581 commit b4edf77

File tree

2 files changed

+72
-1
lines changed

2 files changed

+72
-1
lines changed

salt/modules/vsphere.py

+6-1
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,7 @@
168168
import salt.utils
169169
import salt.utils.vmware
170170
import salt.utils.http
171+
from salt.utils import dictupdate
171172
from salt.exceptions import CommandExecutionError
172173

173174
# Import Third Party Libs
@@ -1670,7 +1671,11 @@ def system_info(host, username, password, protocol=None, port=None):
16701671
password=password,
16711672
protocol=protocol,
16721673
port=port)
1673-
return salt.utils.vmware.get_inventory(service_instance).about.__dict__
1674+
ret = salt.utils.vmware.get_inventory(service_instance).about.__dict__
1675+
if 'apiType' in ret:
1676+
if ret['apiType'] == 'HostAgent':
1677+
ret = dictupdate.update(ret, salt.utils.vmware.get_hardware_grains(service_instance))
1678+
return ret
16741679

16751680

16761681
def list_datacenters(host, username, password, protocol=None, port=None):

salt/utils/vmware.py

+66
Original file line numberDiff line numberDiff line change
@@ -307,6 +307,72 @@ def _get_dvs_uplink_portgroup(dvs, portgroup_name):
307307
return None
308308

309309

310+
def get_hardware_grains(service_instance):
311+
'''
312+
Return hardware info for standard minion grains if the service_instance is a HostAgent type
313+
314+
service_instance
315+
The service instance object to get hardware info for
316+
317+
.. versionadded:: Carbon
318+
'''
319+
hw_grain_data = {}
320+
if get_inventory(service_instance).about.apiType == 'HostAgent':
321+
view = service_instance.content.viewManager.CreateContainerView(service_instance.RetrieveContent().rootFolder,
322+
[vim.HostSystem], True)
323+
if view:
324+
if view.view:
325+
if len(view.view) > 0:
326+
hw_grain_data['manufacturer'] = view.view[0].hardware.systemInfo.vendor
327+
hw_grain_data['productname'] = view.view[0].hardware.systemInfo.model
328+
329+
for _data in view.view[0].hardware.systemInfo.otherIdentifyingInfo:
330+
if _data.identifierType.key == 'ServiceTag':
331+
hw_grain_data['serialnumber'] = _data.identifierValue
332+
333+
hw_grain_data['osfullname'] = view.view[0].summary.config.product.fullName
334+
hw_grain_data['osmanufacturer'] = view.view[0].summary.config.product.vendor
335+
hw_grain_data['osrelease'] = view.view[0].summary.config.product.version
336+
hw_grain_data['osbuild'] = view.view[0].summary.config.product.build
337+
hw_grain_data['os_family'] = view.view[0].summary.config.product.name
338+
hw_grain_data['os'] = view.view[0].summary.config.product.name
339+
hw_grain_data['mem_total'] = view.view[0].hardware.memorySize /1024/1024
340+
hw_grain_data['biosversion'] = view.view[0].hardware.biosInfo.biosVersion
341+
hw_grain_data['biosreleasedate'] = view.view[0].hardware.biosInfo.releaseDate.date().strftime('%m/%d/%Y')
342+
hw_grain_data['cpu_model'] = view.view[0].hardware.cpuPkg[0].description
343+
hw_grain_data['kernel'] = view.view[0].summary.config.product.productLineId
344+
hw_grain_data['num_cpu_sockets'] = view.view[0].hardware.cpuInfo.numCpuPackages
345+
hw_grain_data['num_cpu_cores'] = view.view[0].hardware.cpuInfo.numCpuCores
346+
hw_grain_data['num_cpus'] = hw_grain_data['num_cpu_sockets'] * hw_grain_data['num_cpu_cores']
347+
hw_grain_data['ip_interfaces'] = {}
348+
hw_grain_data['ip4_interfaces'] = {}
349+
hw_grain_data['ip6_interfaces'] = {}
350+
hw_grain_data['hwaddr_interfaces'] = {}
351+
for _vnic in view.view[0].configManager.networkSystem.networkConfig.vnic:
352+
hw_grain_data['ip_interfaces'][_vnic.device] = []
353+
hw_grain_data['ip4_interfaces'][_vnic.device] = []
354+
hw_grain_data['ip6_interfaces'][_vnic.device] = []
355+
356+
hw_grain_data['ip_interfaces'][_vnic.device].append(_vnic.spec.ip.ipAddress)
357+
hw_grain_data['ip4_interfaces'][_vnic.device].append(_vnic.spec.ip.ipAddress)
358+
if _vnic.spec.ip.ipV6Config:
359+
hw_grain_data['ip6_interfaces'][_vnic.device].append(_vnic.spec.ip.ipV6Config.ipV6Address)
360+
hw_grain_data['hwaddr_interfaces'][_vnic.device] = _vnic.spec.mac
361+
hw_grain_data['host'] = view.view[0].configManager.networkSystem.dnsConfig.hostName
362+
hw_grain_data['domain'] = view.view[0].configManager.networkSystem.dnsConfig.domainName
363+
hw_grain_data['fqdn'] = '{0}{1}{2}'.format(
364+
view.view[0].configManager.networkSystem.dnsConfig.hostName,
365+
('.' if view.view[0].configManager.networkSystem.dnsConfig.domainName else ''),
366+
view.view[0].configManager.networkSystem.dnsConfig.domainName)
367+
368+
for _pnic in view.view[0].configManager.networkSystem.networkInfo.pnic:
369+
hw_grain_data['hwaddr_interfaces'][_pnic.device] = _pnic.mac
370+
371+
hw_grain_data['timezone'] = view.view[0].configManager.dateTimeSystem.dateTimeInfo.timeZone.name
372+
view = None
373+
return hw_grain_data
374+
375+
310376
def get_inventory(service_instance):
311377
'''
312378
Return the inventory of a Service Instance Object.

0 commit comments

Comments
 (0)