1
# Copyright (c) 2014 VMware, Inc.
4
# Licensed under the Apache License, Version 2.0 (the "License"); you may
5
# not use this file except in compliance with the License. You may obtain
6
# a copy of the License at
8
# http://www.apache.org/licenses/LICENSE-2.0
10
# Unless required by applicable law or agreed to in writing, software
11
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13
# License for the specific language governing permissions and limitations
17
Unit tests for VMware API utility module.
22
from oslo.vmware import vim_util
23
from tests import base
26
class VimUtilTest(base.TestCase):
27
"""Test class for utility methods in vim_util."""
29
def test_get_moref(self):
30
moref = vim_util.get_moref("vm-0", "VirtualMachine")
31
self.assertEqual("vm-0", moref.value)
32
self.assertEqual("VirtualMachine", moref._type)
34
def test_build_selection_spec(self):
35
client_factory = mock.Mock()
36
sel_spec = vim_util.build_selection_spec(client_factory, "test")
37
self.assertEqual("test", sel_spec.name)
39
def test_build_traversal_spec(self):
40
client_factory = mock.Mock()
41
sel_spec = mock.Mock()
42
traversal_spec = vim_util.build_traversal_spec(client_factory,
47
self.assertEqual("dc_to_hf", traversal_spec.name)
48
self.assertEqual("hostFolder", traversal_spec.path)
49
self.assertEqual([sel_spec], traversal_spec.selectSet)
50
self.assertFalse(traversal_spec.skip)
51
self.assertEqual("Datacenter", traversal_spec.type)
53
@mock.patch.object(vim_util, 'build_selection_spec')
54
def test_build_recursive_traversal_spec(self, build_selection_spec_mock):
55
sel_spec = mock.Mock()
56
rp_to_rp_sel_spec = mock.Mock()
57
rp_to_vm_sel_spec = mock.Mock()
59
def build_sel_spec_side_effect(client_factory, name):
60
if name == 'visitFolders':
62
elif name == 'rp_to_rp':
63
return rp_to_rp_sel_spec
64
elif name == 'rp_to_vm':
65
return rp_to_vm_sel_spec
69
build_selection_spec_mock.side_effect = build_sel_spec_side_effect
70
traversal_spec_dict = {'dc_to_hf': {'type': 'Datacenter',
73
'selectSet': [sel_spec]},
74
'dc_to_vmf': {'type': 'Datacenter',
77
'selectSet': [sel_spec]},
78
'h_to_vm': {'type': 'HostSystem',
81
'selectSet': [sel_spec]},
82
'cr_to_h': {'type': 'ComputeResource',
86
'cr_to_ds': {'type': 'ComputeResource',
90
'cr_to_rp': {'type': 'ComputeResource',
91
'path': 'resourcePool',
93
'selectSet': [rp_to_rp_sel_spec,
95
'cr_to_rp': {'type': 'ComputeResource',
96
'path': 'resourcePool',
98
'selectSet': [rp_to_rp_sel_spec,
100
'ccr_to_h': {'type': 'ClusterComputeResource',
104
'ccr_to_ds': {'type': 'ClusterComputeResource',
108
'ccr_to_rp': {'type': 'ClusterComputeResource',
109
'path': 'resourcePool',
111
'selectSet': [rp_to_rp_sel_spec,
113
'rp_to_rp': {'type': 'ResourcePool',
114
'path': 'resourcePool',
116
'selectSet': [rp_to_rp_sel_spec,
118
'rp_to_vm': {'type': 'ResourcePool',
121
'selectSet': [rp_to_rp_sel_spec,
125
client_factory = mock.Mock()
126
client_factory.create.side_effect = lambda ns: mock.Mock()
127
trav_spec = vim_util.build_recursive_traversal_spec(client_factory)
128
self.assertEqual("visitFolders", trav_spec.name)
129
self.assertEqual("childEntity", trav_spec.path)
130
self.assertFalse(trav_spec.skip)
131
self.assertEqual("Folder", trav_spec.type)
133
self.assertEqual(len(traversal_spec_dict) + 1,
134
len(trav_spec.selectSet))
135
for spec in trav_spec.selectSet:
136
if spec.name not in traversal_spec_dict:
137
self.assertEqual(sel_spec, spec)
139
exp_spec = traversal_spec_dict[spec.name]
140
self.assertEqual(exp_spec['type'], spec.type)
141
self.assertEqual(exp_spec['path'], spec.path)
142
self.assertEqual(exp_spec['skip'], spec.skip)
143
self.assertEqual(exp_spec['selectSet'], spec.selectSet)
145
def test_build_property_spec(self):
146
client_factory = mock.Mock()
147
prop_spec = vim_util.build_property_spec(client_factory)
148
self.assertFalse(prop_spec.all)
149
self.assertEqual(["name"], prop_spec.pathSet)
150
self.assertEqual("VirtualMachine", prop_spec.type)
152
def test_build_object_spec(self):
153
client_factory = mock.Mock()
154
root_folder = mock.Mock()
155
specs = [mock.Mock()]
156
obj_spec = vim_util.build_object_spec(client_factory,
158
self.assertEqual(root_folder, obj_spec.obj)
159
self.assertEqual(specs, obj_spec.selectSet)
160
self.assertFalse(obj_spec.skip)
162
def test_build_property_filter_spec(self):
163
client_factory = mock.Mock()
164
prop_specs = [mock.Mock()]
165
obj_specs = [mock.Mock()]
166
filter_spec = vim_util.build_property_filter_spec(client_factory,
169
self.assertEqual(obj_specs, filter_spec.objectSet)
170
self.assertEqual(prop_specs, filter_spec.propSet)
173
'oslo.vmware.vim_util.build_recursive_traversal_spec')
174
def test_get_objects(self, build_recursive_traversal_spec):
176
trav_spec = mock.Mock()
177
build_recursive_traversal_spec.return_value = trav_spec
179
_type = "VirtualMachine"
181
def vim_RetrievePropertiesEx_side_effect(pc, specSet, options):
182
self.assertTrue(pc is vim.service_content.propertyCollector)
183
self.assertEqual(max_objects, options.maxObjects)
185
self.assertEqual(1, len(specSet))
186
property_filter_spec = specSet[0]
188
propSet = property_filter_spec.propSet
189
self.assertEqual(1, len(propSet))
190
prop_spec = propSet[0]
191
self.assertFalse(prop_spec.all)
192
self.assertEqual(["name"], prop_spec.pathSet)
193
self.assertEqual(_type, prop_spec.type)
195
objSet = property_filter_spec.objectSet
196
self.assertEqual(1, len(objSet))
198
self.assertTrue(obj_spec.obj is vim.service_content.rootFolder)
199
self.assertEqual([trav_spec], obj_spec.selectSet)
200
self.assertFalse(obj_spec.skip)
202
vim.RetrievePropertiesEx.side_effect = \
203
vim_RetrievePropertiesEx_side_effect
204
vim_util.get_objects(vim, _type, max_objects)
205
self.assertEqual(1, vim.RetrievePropertiesEx.call_count)
207
def test_get_object_properties_with_empty_moref(self):
209
ret = vim_util.get_object_properties(vim, None, None)
210
self.assertEqual(None, ret)
212
@mock.patch('oslo.vmware.vim_util.cancel_retrieval')
213
def test_get_object_properties(self, cancel_retrieval):
216
moref._type = "VirtualMachine"
217
retrieve_result = mock.Mock()
219
def vim_RetrievePropertiesEx_side_effect(pc, specSet, options):
220
self.assertTrue(pc is vim.service_content.propertyCollector)
221
self.assertEqual(1, options.maxObjects)
223
self.assertEqual(1, len(specSet))
224
property_filter_spec = specSet[0]
226
propSet = property_filter_spec.propSet
227
self.assertEqual(1, len(propSet))
228
prop_spec = propSet[0]
229
self.assertTrue(prop_spec.all)
230
self.assertEqual(['name'], prop_spec.pathSet)
231
self.assertEqual(moref._type, prop_spec.type)
233
objSet = property_filter_spec.objectSet
234
self.assertEqual(1, len(objSet))
236
self.assertEqual(moref, obj_spec.obj)
237
self.assertEqual([], obj_spec.selectSet)
238
self.assertFalse(obj_spec.skip)
240
return retrieve_result
242
vim.RetrievePropertiesEx.side_effect = \
243
vim_RetrievePropertiesEx_side_effect
245
res = vim_util.get_object_properties(vim, moref, None)
246
self.assertEqual(1, vim.RetrievePropertiesEx.call_count)
247
self.assertTrue(res is retrieve_result.objects)
248
cancel_retrieval.assert_called_once_with(vim, retrieve_result)
250
def test_get_token(self):
251
retrieve_result = object()
252
self.assertFalse(vim_util._get_token(retrieve_result))
254
@mock.patch('oslo.vmware.vim_util._get_token')
255
def test_cancel_retrieval(self, get_token):
257
get_token.return_value = token
259
retrieve_result = mock.Mock()
260
vim_util.cancel_retrieval(vim, retrieve_result)
261
get_token.assert_called_once_with(retrieve_result)
262
vim.CancelRetrievePropertiesEx.assert_called_once_with(
263
vim.service_content.propertyCollector, token=token)
265
@mock.patch('oslo.vmware.vim_util._get_token')
266
def test_continue_retrieval(self, get_token):
268
get_token.return_value = token
270
retrieve_result = mock.Mock()
271
vim_util.continue_retrieval(vim, retrieve_result)
272
get_token.assert_called_once_with(retrieve_result)
273
vim.ContinueRetrievePropertiesEx.assert_called_once_with(
274
vim.service_content.propertyCollector, token=token)
276
@mock.patch('oslo.vmware.vim_util.get_object_properties')
277
def test_get_object_property(self, get_object_properties):
279
prop.val = "ubuntu-12.04"
280
properties = mock.Mock()
281
properties.propSet = [prop]
282
properties_list = [properties]
283
get_object_properties.return_value = properties_list
286
property_name = 'name'
287
val = vim_util.get_object_property(vim, moref, property_name)
288
self.assertEqual(prop.val, val)
289
get_object_properties.assert_called_once_with(
290
vim, moref, [property_name])