Skip to content

Commit ab33187

Browse files
mifrostpryorda
authored andcommitted
fix(hosts_not_found): Fixes hosts not found and nested under folders
Fixes hosts not found and nested under folders
1 parent cf3efe7 commit ab33187

File tree

2 files changed

+71
-8
lines changed

2 files changed

+71
-8
lines changed

tests/unit/test_vmware_exporter.py

Lines changed: 61 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,9 @@ def test_collect_vms():
5959
'hosts': True,
6060
'snapshots': True,
6161
}
62+
63+
# Test runtime.host not found
64+
6265
collector = VmwareCollector(
6366
'127.0.0.1',
6467
'root',
@@ -67,10 +70,38 @@ def test_collect_vms():
6770
)
6871
collector.content = _succeed(mock.Mock())
6972

70-
collector.__dict__['vm_labels'] = _succeed({
71-
'vm-1': ['vm-1', 'host-1', 'dc', 'cluster-1'],
72-
'vm-2': ['vm-2', 'host-1', 'dc', 'cluster-1'],
73-
'vm-3': ['vm-3', 'host-1', 'dc', 'cluster-1'],
73+
collector.__dict__['host_labels'] = _succeed({'': []})
74+
75+
with mock.patch.object(collector, 'batch_fetch_properties') as batch_fetch_properties:
76+
batch_fetch_properties.return_value = _succeed({
77+
'vm-1': {
78+
'name': 'vm-1',
79+
'runtime.host': vim.ManagedObject('notfound:1'),
80+
'runtime.powerState': 'poweredOn',
81+
'summary.config.numCpu': 1,
82+
'summary.config.memorySizeMB': 1024,
83+
'runtime.bootTime': boot_time,
84+
'snapshot': snapshot,
85+
'guest.disk': [disk],
86+
'guest.toolsStatus': 'toolsOk',
87+
'guest.toolsVersion': '10336',
88+
'guest.toolsVersionStatus2': 'guestToolsUnmanaged',
89+
}
90+
})
91+
assert collector.vm_labels.result == {'vm-1': ['vm-1']}
92+
93+
# Reset variables
94+
95+
collector = VmwareCollector(
96+
'127.0.0.1',
97+
'root',
98+
'password',
99+
collect_only,
100+
)
101+
collector.content = _succeed(mock.Mock())
102+
103+
collector.__dict__['host_labels'] = _succeed({
104+
'host-1': ['host-1', 'dc', 'cluster-1'],
74105
})
75106

76107
metrics = collector._create_metric_containers()
@@ -118,6 +149,11 @@ def test_collect_vms():
118149
})
119150
yield collector._vmware_get_vms(metrics)
120151
assert _check_properties(batch_fetch_properties.call_args[0][1])
152+
assert collector.vm_labels.result == {
153+
'vm-1': ['vm-1', 'host-1', 'dc', 'cluster-1'],
154+
'vm-2': ['vm-2'],
155+
'vm-3': ['vm-3', 'host-1', 'dc', 'cluster-1'],
156+
}
121157

122158
# Assert that vm-3 skipped #69/#70
123159
assert metrics['vmware_vm_power_state'].samples[1][1] == {
@@ -511,6 +547,23 @@ def test_vmware_get_inventory():
511547
folder_2.__dict__['name'] = 'compute-cluster-1'
512548
folder_2.__dict__['host'] = [host_2]
513549

550+
# Folders case
551+
host_3 = mock.Mock()
552+
host_3._moId = 'host:3'
553+
host_3.name = 'host-3'
554+
host_3.summary.config.name = 'host-3.'
555+
556+
folder_3 = mock.Mock()
557+
folder_3.host = [host_3]
558+
559+
folder_4 = vim.Folder('folder:4')
560+
folder_4.__dict__['name'] = 'folder-4'
561+
folder_4.__dict__['childEntity'] = [folder_3]
562+
563+
folder_5 = vim.Folder('folder:5')
564+
folder_5.__dict__['name'] = 'folder-5'
565+
folder_5.__dict__['childEntity'] = [folder_4]
566+
514567
# Datastore case 1
515568
datastore_1 = vim.Datastore('datastore:1')
516569
datastore_1.__dict__['name'] = 'datastore-1'
@@ -525,7 +578,7 @@ def test_vmware_get_inventory():
525578

526579
data_center_1 = mock.Mock()
527580
data_center_1.name = 'dc-1'
528-
data_center_1.hostFolder.childEntity = [folder_1, folder_2]
581+
data_center_1.hostFolder.childEntity = [folder_1, folder_2, folder_5]
529582
data_center_1.datastoreFolder.childEntity = [datastore_1, datastore_2_folder]
530583

531584
content.rootFolder.childEntity = [data_center_1]
@@ -548,6 +601,8 @@ def test_vmware_get_inventory():
548601

549602
with contextlib.ExitStack() as stack:
550603
# We have to disable the LazyObject magic on pyvmomi classes so that we can use them as fakes
604+
stack.enter_context(mock.patch.object(vim.Folder, 'name', None))
605+
stack.enter_context(mock.patch.object(vim.Folder, 'childEntity', None))
551606
stack.enter_context(mock.patch.object(vim.ClusterComputeResource, 'name', None))
552607
stack.enter_context(mock.patch.object(vim.ClusterComputeResource, 'host', None))
553608
stack.enter_context(mock.patch.object(vim.Datastore, 'name', None))
@@ -560,6 +615,7 @@ def test_vmware_get_inventory():
560615
assert host == {
561616
'host:1': ['host-1', 'dc-1', ''],
562617
'host:2': ['host-2', 'dc-1', 'compute-cluster-1'],
618+
'host:3': ['host-3', 'dc-1', ''],
563619
}
564620

565621
assert ds == {

vmware_exporter/vmware_exporter.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -411,7 +411,7 @@ def _collect(dc, node):
411411
]
412412

413413
if isinstance(folder, vim.Folder):
414-
host_inventory.extend(_collect(dc, folder))
414+
host_inventory.update(_collect(dc, folder))
415415

416416
return host_inventory
417417

@@ -430,8 +430,15 @@ def vm_labels(self):
430430

431431
labels = {}
432432
for moid, row in virtual_machines.items():
433-
host_moid = row['runtime.host']._moId
434-
labels[moid] = [row['name']] + host_labels[host_moid]
433+
434+
host_moid = None
435+
if 'runtime.host' in row:
436+
host_moid = row['runtime.host']._moId
437+
438+
labels[moid] = [row['name']]
439+
440+
if host_moid in host_labels:
441+
labels[moid] = labels[moid] + host_labels[host_moid]
435442

436443
return labels
437444

0 commit comments

Comments
 (0)