33
36
from nova.tests.vmwareapi import stubs
34
37
from nova.virt.vmwareapi import driver
35
38
from nova.virt.vmwareapi import fake as vmwareapi_fake
39
from nova.virt.vmwareapi import vm_util
40
from nova.virt.vmwareapi import volume_util
43
class fake_vm_ref(object):
46
self._type = 'VirtualMachine'
49
class fake_http_resp(object):
38
57
class VMwareAPIVMTestCase(test.TestCase):
52
71
vmwareapi_fake.reset()
53
72
db_fakes.stub_out_db_instance_api(self.stubs)
54
73
stubs.set_stubs(self.stubs)
55
self.conn = driver.VMwareESXDriver(None, False)
74
self.conn = driver.VMwareVCDriver(None, False)
56
75
# NOTE(vish): none of the network plugging code is actually
58
77
self.network_info = utils.get_test_network_info(legacy_model=False)
116
137
self.assertEquals(vm.get("summary.config.memorySizeMB"),
117
138
self.type_data['memory_mb'])
141
vm.get("config.hardware.device")[2].device.obj_name,
119
143
# Check that the VM is running according to Nova
120
144
self.assertEquals(vm_info['state'], power_state.RUNNING)
122
146
# Check that the VM is running according to vSphere API.
123
147
self.assertEquals(vm.get("runtime.powerState"), 'poweredOn')
149
found_vm_uuid = False
150
found_iface_id = False
151
for c in vm.get("config.extraConfig"):
152
if (c.key == "nvp.vm-uuid" and c.value == self.instance['uuid']):
154
if (c.key == "nvp.iface-id.0" and c.value == "vif-xxx-yyy-zzz"):
155
found_iface_id = True
157
self.assertTrue(found_vm_uuid)
158
self.assertTrue(found_iface_id)
125
160
def _check_vm_info(self, info, pwr_state=power_state.RUNNING):
127
162
Check if the get_info returned values correspond to the instance
142
177
instances = self.conn.list_instances()
143
178
self.assertEquals(len(instances), 1)
145
def test_list_interfaces(self):
147
interfaces = self.conn.list_interfaces(1)
148
self.assertEquals(len(interfaces), 1)
149
self.assertEquals(interfaces[0], 4000)
151
180
def test_spawn(self):
152
181
self._create_vm()
153
info = self.conn.get_info({'name': 1})
182
info = self.conn.get_info({'uuid': 'fake-uuid'})
154
183
self._check_vm_info(info, power_state.RUNNING)
156
185
def test_snapshot(self):
164
193
'expected_state': task_states.IMAGE_PENDING_UPLOAD}}]
165
194
func_call_matcher = matchers.FunctionCallMatcher(expected_calls)
166
195
self._create_vm()
167
info = self.conn.get_info({'name': 1})
196
info = self.conn.get_info({'uuid': 'fake-uuid'})
168
197
self._check_vm_info(info, power_state.RUNNING)
169
198
self.conn.snapshot(self.context, self.instance, "Test-Snapshot",
170
199
func_call_matcher.call)
171
info = self.conn.get_info({'name': 1})
200
info = self.conn.get_info({'uuid': 'fake-uuid'})
172
201
self._check_vm_info(info, power_state.RUNNING)
173
202
self.assertIsNone(func_call_matcher.match())
181
210
def test_reboot(self):
182
211
self._create_vm()
183
info = self.conn.get_info({'name': 1})
184
self._check_vm_info(info, power_state.RUNNING)
186
self.conn.reboot(self.context, self.instance, self.network_info,
188
info = self.conn.get_info({'name': 1})
212
info = self.conn.get_info({'name': 1, 'uuid': 'fake-uuid'})
213
self._check_vm_info(info, power_state.RUNNING)
215
self.conn.reboot(self.context, self.instance, self.network_info,
217
info = self.conn.get_info({'name': 1, 'uuid': 'fake-uuid'})
218
self._check_vm_info(info, power_state.RUNNING)
220
def test_reboot_with_uuid(self):
221
"""Test fall back to use name when can't find by uuid."""
223
info = self.conn.get_info({'name': 'fake-uuid', 'uuid': 'wrong-uuid'})
224
self._check_vm_info(info, power_state.RUNNING)
226
self.conn.reboot(self.context, self.instance, self.network_info,
228
info = self.conn.get_info({'name': 'fake-uuid', 'uuid': 'wrong-uuid'})
189
229
self._check_vm_info(info, power_state.RUNNING)
191
231
def test_reboot_non_existent(self):
197
237
def test_reboot_not_poweredon(self):
198
238
self._create_vm()
199
info = self.conn.get_info({'name': 1})
239
info = self.conn.get_info({'uuid': 'fake-uuid'})
200
240
self._check_vm_info(info, power_state.RUNNING)
201
241
self.conn.suspend(self.instance)
202
info = self.conn.get_info({'name': 1})
242
info = self.conn.get_info({'uuid': 'fake-uuid'})
203
243
self._check_vm_info(info, power_state.SUSPENDED)
204
244
self.assertRaises(exception.InstanceRebootFailure, self.conn.reboot,
205
245
self.context, self.instance, self.network_info,
208
248
def test_suspend(self):
209
249
self._create_vm()
210
info = self.conn.get_info({'name': 1})
250
info = self.conn.get_info({'uuid': "fake-uuid"})
211
251
self._check_vm_info(info, power_state.RUNNING)
212
252
self.conn.suspend(self.instance)
213
info = self.conn.get_info({'name': 1})
253
info = self.conn.get_info({'uuid': 'fake-uuid'})
214
254
self._check_vm_info(info, power_state.SUSPENDED)
216
256
def test_suspend_non_existent(self):
221
261
def test_resume(self):
222
262
self._create_vm()
223
info = self.conn.get_info({'name': 1})
263
info = self.conn.get_info({'uuid': 'fake-uuid'})
224
264
self._check_vm_info(info, power_state.RUNNING)
225
265
self.conn.suspend(self.instance)
226
info = self.conn.get_info({'name': 1})
266
info = self.conn.get_info({'uuid': 'fake-uuid'})
227
267
self._check_vm_info(info, power_state.SUSPENDED)
228
268
self.conn.resume(self.instance, self.network_info)
229
info = self.conn.get_info({'name': 1})
269
info = self.conn.get_info({'uuid': 'fake-uuid'})
230
270
self._check_vm_info(info, power_state.RUNNING)
232
272
def test_resume_non_existent(self):
237
277
def test_resume_not_suspended(self):
238
278
self._create_vm()
239
info = self.conn.get_info({'name': 1})
279
info = self.conn.get_info({'uuid': 'fake-uuid'})
240
280
self._check_vm_info(info, power_state.RUNNING)
241
281
self.assertRaises(exception.InstanceResumeFailure, self.conn.resume,
242
282
self.instance, self.network_info)
244
284
def test_power_on(self):
245
285
self._create_vm()
246
info = self.conn.get_info({'name': 1})
286
info = self.conn.get_info({'uuid': 'fake-uuid'})
247
287
self._check_vm_info(info, power_state.RUNNING)
248
288
self.conn.power_off(self.instance)
249
info = self.conn.get_info({'name': 1})
289
info = self.conn.get_info({'uuid': 'fake-uuid'})
250
290
self._check_vm_info(info, power_state.SHUTDOWN)
251
self.conn.power_on(self.instance)
252
info = self.conn.get_info({'name': 1})
291
self.conn.power_on(self.context, self.instance, self.network_info)
292
info = self.conn.get_info({'uuid': 'fake-uuid'})
253
293
self._check_vm_info(info, power_state.RUNNING)
255
295
def test_power_on_non_existent(self):
256
296
self._create_instance_in_the_db()
257
297
self.assertRaises(exception.InstanceNotFound, self.conn.power_on,
298
self.context, self.instance, self.network_info)
260
300
def test_power_off(self):
261
301
self._create_vm()
262
info = self.conn.get_info({'name': 1})
302
info = self.conn.get_info({'uuid': 'fake-uuid'})
263
303
self._check_vm_info(info, power_state.RUNNING)
264
304
self.conn.power_off(self.instance)
265
info = self.conn.get_info({'name': 1})
305
info = self.conn.get_info({'uuid': 'fake-uuid'})
266
306
self._check_vm_info(info, power_state.SHUTDOWN)
268
308
def test_power_off_non_existent(self):
273
313
def test_power_off_suspended(self):
274
314
self._create_vm()
275
315
self.conn.suspend(self.instance)
276
info = self.conn.get_info({'name': 1})
316
info = self.conn.get_info({'uuid': 'fake-uuid'})
277
317
self._check_vm_info(info, power_state.SUSPENDED)
278
318
self.assertRaises(exception.InstancePowerOffFailure,
279
319
self.conn.power_off, self.instance)
281
321
def test_get_info(self):
282
322
self._create_vm()
283
info = self.conn.get_info({'name': 1})
323
info = self.conn.get_info({'uuid': 'fake-uuid'})
284
324
self._check_vm_info(info, power_state.RUNNING)
286
326
def test_destroy(self):
287
327
self._create_vm()
288
info = self.conn.get_info({'name': 1})
328
info = self.conn.get_info({'uuid': 'fake-uuid'})
289
329
self._check_vm_info(info, power_state.RUNNING)
290
330
instances = self.conn.list_instances()
291
331
self.assertEquals(len(instances), 1)
310
350
def test_get_console_output(self):
351
vm_ref = fake_vm_ref()
352
result = fake_http_resp()
353
self._create_instance_in_the_db()
354
self.mox.StubOutWithMock(vm_util, 'get_vm_ref_from_name')
355
self.mox.StubOutWithMock(urllib2, 'urlopen')
356
vm_util.get_vm_ref_from_name(mox.IgnoreArg(), self.instance['name']).\
358
urllib2.urlopen(mox.IgnoreArg()).AndReturn(result)
361
self.conn.get_console_output(self.instance)
363
def test_diagnostics_non_existent_vm(self):
364
self._create_instance_in_the_db()
365
self.assertRaises(exception.InstanceNotFound,
366
self.conn.get_diagnostics,
369
def test_get_console_pool_info(self):
370
info = self.conn.get_console_pool_info("console_type")
371
self.assertEquals(info['address'], 'test_url')
372
self.assertEquals(info['username'], 'test_username')
373
self.assertEquals(info['password'], 'test_pass')
375
def test_get_vnc_console_non_existent(self):
376
self._create_instance_in_the_db()
377
self.assertRaises(exception.InstanceNotFound,
378
self.conn.get_vnc_console,
381
def test_get_vnc_console(self):
382
self._create_instance_in_the_db()
384
vnc_dict = self.conn.get_vnc_console(self.instance)
385
self.assertEquals(vnc_dict['host'], "ha-host")
386
self.assertEquals(vnc_dict['port'], 5910)
388
def test_host_ip_addr(self):
389
self.assertEquals(self.conn.get_host_ip_addr(), "test_url")
391
def test_get_volume_connector(self):
393
def fake_iqn(session, instance):
396
self._create_instance_in_the_db()
397
self.stubs.Set(volume_util, "get_host_iqn", fake_iqn)
398
connector_dict = self.conn.get_volume_connector(self.instance)
399
self.assertEquals(connector_dict['ip'], "test_url")
400
self.assertEquals(connector_dict['initiator'], "iscsi-name")
401
self.assertEquals(connector_dict['host'], "test_url")
314
404
class VMwareAPIHostTestCase(test.TestCase):