87
87
super(BaseTestCase, self).setUp()
88
88
self.flags(compute_driver='nova.virt.fake.FakeDriver',
89
notification_driver=['nova.openstack.common.notifier.test_notifier'],
89
notification_driver=[test_notifier.__name__],
90
90
network_manager='nova.network.manager.FlatManager')
91
91
self.compute = importutils.import_object(FLAGS.compute_manager)
153
153
def _create_instance(self, params=None, type_name='m1.tiny'):
154
154
"""Create a test instance. Returns uuid"""
155
return self._create_fake_instance(params, type_name=type_name)['uuid']
155
return self._create_fake_instance(params, type_name=type_name)
157
157
def _create_instance_type(self, params=None):
158
158
"""Create a test instance type"""
210
210
did_it_add_fault)
212
212
@nova.compute.manager.wrap_instance_fault
213
def failer(self2, context, instance_uuid):
213
def failer(self2, context, instance):
214
214
raise NotImplementedError()
216
216
self.assertRaises(NotImplementedError, failer,
217
self.compute, self.context, instance_uuid=inst_uuid)
217
self.compute, self.context, instance=inst)
219
219
self.assertTrue(called['fault_added'])
398
398
raise test.TestingException()
399
399
self.stubs.Set(nova.compute.manager.ComputeManager,
400
400
'_setup_block_device_mapping', fake)
401
instance_uuid = self._create_instance()
401
instance = self._create_instance()
402
402
self.assertRaises(test.TestingException, self.compute.run_instance,
403
self.context, instance_uuid=instance_uuid)
403
self.context, instance=instance)
404
404
#check state is failed even after the periodic poll
405
405
self._assert_state({'vm_state': vm_states.ERROR,
406
406
'task_state': None})
416
416
def fake(*args, **kwargs):
417
417
raise test.TestingException()
418
418
self.stubs.Set(self.compute.driver, 'spawn', fake)
419
instance_uuid = self._create_instance()
419
instance = self._create_instance()
420
420
self.assertRaises(test.TestingException, self.compute.run_instance,
421
self.context, instance_uuid=instance_uuid)
421
self.context, instance=instance)
422
422
#check state is failed even after the periodic poll
423
423
self._assert_state({'vm_state': vm_states.ERROR,
424
424
'task_state': None})
430
430
"""Make sure that the instance can be terminated in ERROR state"""
431
431
elevated = context.get_admin_context()
432
432
#check failed to schedule --> terminate
433
instance_uuid = self._create_instance(params={'vm_state':
435
inst_ref = db.instance_get_by_uuid(elevated, instance_uuid)
436
instance = jsonutils.to_primitive(inst_ref)
433
instance = self._create_instance(params={'vm_state': vm_states.ERROR})
437
434
self.compute.terminate_instance(self.context, instance=instance)
438
435
self.assertRaises(exception.InstanceNotFound, db.instance_get_by_uuid,
439
elevated, instance_uuid)
436
elevated, instance['uuid'])
441
438
def test_run_terminate(self):
442
439
"""Make sure it is possible to run and terminate instance"""
533
530
"""Ensure instance can be stopped"""
534
531
instance = jsonutils.to_primitive(self._create_fake_instance())
535
532
self.compute.run_instance(self.context, instance=instance)
533
db.instance_update(self.context, instance['uuid'],
534
{"task_state": task_states.STOPPING})
536
535
self.compute.stop_instance(self.context, instance=instance)
537
536
self.compute.terminate_instance(self.context, instance=instance)
540
539
"""Ensure instance can be started"""
541
540
instance = jsonutils.to_primitive(self._create_fake_instance())
542
541
self.compute.run_instance(self.context, instance=instance)
542
db.instance_update(self.context, instance['uuid'],
543
{"task_state": task_states.STOPPING})
543
544
self.compute.stop_instance(self.context, instance=instance)
545
db.instance_update(self.context, instance['uuid'],
546
{"task_state": task_states.STARTING})
544
547
self.compute.start_instance(self.context, instance=instance)
545
548
self.compute.terminate_instance(self.context, instance=instance)
566
569
instance_uuid = instance['uuid']
567
570
self.compute.run_instance(self.context, instance=instance)
569
# Make sure these methods work with both instance and instance_uuid
572
db.instance_update(self.context, instance['uuid'],
573
{"task_state": task_states.RESCUING})
571
574
self.compute.rescue_instance(self.context, instance=instance)
572
575
self.assertTrue(called['rescued'])
576
db.instance_update(self.context, instance['uuid'],
577
{"task_state": task_states.UNRESCUING})
573
578
self.compute.unrescue_instance(self.context, instance=instance)
574
579
self.assertTrue(called['unrescued'])
576
self.compute.rescue_instance(self.context, instance_uuid=instance_uuid)
577
self.assertTrue(called['rescued'])
578
self.compute.unrescue_instance(self.context,
579
instance_uuid=instance_uuid)
580
self.assertTrue(called['unrescued'])
582
581
self.compute.terminate_instance(self.context, instance=instance)
584
583
def test_power_on(self):
595
594
instance = jsonutils.to_primitive(self._create_fake_instance())
596
595
self.compute.run_instance(self.context, instance=instance)
596
db.instance_update(self.context, instance['uuid'],
597
{"task_state": task_states.POWERING_ON})
597
598
self.compute.power_on_instance(self.context, instance=instance)
598
599
self.assertTrue(called['power_on'])
599
600
self.compute.terminate_instance(self.context, instance=instance)
612
613
instance = jsonutils.to_primitive(self._create_fake_instance())
613
614
self.compute.run_instance(self.context, instance=instance)
615
db.instance_update(self.context, instance['uuid'],
616
{"task_state": task_states.POWERING_OFF})
614
617
self.compute.power_off_instance(self.context, instance=instance)
615
618
self.assertTrue(called['power_off'])
616
619
self.compute.terminate_instance(self.context, instance=instance)
619
622
"""Ensure instance can be paused and unpaused"""
620
623
instance = jsonutils.to_primitive(self._create_fake_instance())
621
624
self.compute.run_instance(self.context, instance=instance)
625
db.instance_update(self.context, instance['uuid'],
626
{"task_state": task_states.PAUSING})
622
627
self.compute.pause_instance(self.context, instance=instance)
628
db.instance_update(self.context, instance['uuid'],
629
{"task_state": task_states.UNPAUSING})
623
630
self.compute.unpause_instance(self.context, instance=instance)
624
631
self.compute.terminate_instance(self.context, instance=instance)
627
634
"""ensure instance can be suspended and resumed"""
628
635
instance = jsonutils.to_primitive(self._create_fake_instance())
629
636
self.compute.run_instance(self.context, instance=instance)
637
db.instance_update(self.context, instance['uuid'],
638
{"task_state": task_states.SUSPENDING})
630
639
self.compute.suspend_instance(self.context, instance=instance)
640
db.instance_update(self.context, instance['uuid'],
641
{"task_state": task_states.RESUMING})
631
642
self.compute.resume_instance(self.context, instance=instance)
632
643
self.compute.terminate_instance(self.context, instance=instance)
652
663
"""Ensure instance can be rebuilt"""
653
664
instance = jsonutils.to_primitive(self._create_fake_instance())
654
665
image_ref = instance['image_ref']
666
sys_metadata = db.instance_system_metadata_get(self.context,
656
668
self.compute.run_instance(self.context, instance=instance)
657
self.compute.rebuild_instance(self.context, image_ref, image_ref,
669
db.instance_update(self.context, instance['uuid'],
670
{"task_state": task_states.REBUILDING})
671
self.compute.rebuild_instance(self.context, instance,
672
image_ref, image_ref,
674
new_pass="new_password",
675
orig_sys_metadata=sys_metadata)
659
676
self.compute.terminate_instance(self.context, instance=instance)
661
678
def test_rebuild_launch_time(self):
670
687
self.compute.run_instance(self.context, instance=instance)
671
688
timeutils.set_time_override(cur_time)
672
self.compute.rebuild_instance(self.context, image_ref, image_ref,
689
db.instance_update(self.context, instance['uuid'],
690
{"task_state": task_states.REBUILDING})
691
self.compute.rebuild_instance(self.context, instance,
692
image_ref, image_ref,
694
new_pass="new_password")
674
695
instance = db.instance_get_by_uuid(self.context, instance_uuid)
675
696
self.assertEquals(cur_time, instance['launched_at'])
676
697
self.compute.terminate_instance(self.context,
755
776
self.stubs.Set(nova.virt.fake.FakeDriver, 'get_info',
756
777
fake_driver_get_info)
779
db.instance_update(self.context, instance['uuid'],
780
{"task_state": task_states.UPDATING_PASSWORD})
758
781
self.assertRaises(exception.InstancePasswordSetFailed,
759
782
self.compute.set_admin_password,
868
891
instance_uuid = instance['uuid']
869
892
self.compute.run_instance(self.context, instance=instance)
871
# Make sure it works with both an instance and instance_uuid
872
894
self.compute.reset_network(self.context, instance=instance)
873
self.compute.reset_network(self.context, instance_uuid=instance_uuid)
875
self.assertEqual(called['count'], 2)
896
self.assertEqual(called['count'], 1)
877
898
self.compute.terminate_instance(self.context, instance=instance)
882
903
instance_uuid = instance['uuid']
883
904
name = "myfakesnapshot"
884
905
self.compute.run_instance(self.context, instance=instance)
906
db.instance_update(self.context, instance['uuid'],
907
{"task_state": task_states.IMAGE_SNAPSHOT})
885
908
self.compute.snapshot_instance(self.context, name, instance=instance)
886
909
self.compute.terminate_instance(self.context, instance=instance)
895
918
instance = jsonutils.to_primitive(self._create_fake_instance())
896
919
self.compute.run_instance(self.context, instance=instance)
920
db.instance_update(self.context, instance['uuid'],
921
{"task_state": task_states.IMAGE_SNAPSHOT})
897
922
self.assertRaises(test.TestingException,
898
923
self.compute.snapshot_instance,
899
924
self.context, "failing_snapshot", instance=instance)
944
969
instance=instance)
945
970
self.assert_(console)
947
# Also make sure it still works with just the instance UUID
948
console = self.compute.get_vnc_console(self.context, 'novnc',
949
instance_uuid=instance['uuid'])
950
self.assert_(console)
952
972
self.compute.terminate_instance(self.context, instance=instance)
954
974
def test_xvpvnc_vnc_console(self):
987
1007
self.compute.run_instance(self.context, instance=instance)
989
1009
diagnostics = self.compute.get_diagnostics(self.context,
990
instance_uuid=instance['uuid'])
991
1011
self.assertEqual(diagnostics, 'FAKE_DIAGNOSTICS')
993
1013
diagnostics = self.compute.get_diagnostics(self.context,
1181
1201
self.compute.terminate_instance(self.context, instance=instance)
1183
def test_get_lock(self):
1184
instance = jsonutils.to_primitive(self._create_fake_instance())
1185
self.assertFalse(self.compute._get_lock(self.context,
1187
db.instance_update(self.context, instance['uuid'], {'locked': True})
1188
self.assertTrue(self.compute._get_lock(self.context, instance['uuid']))
1190
1203
def test_lock(self):
1191
1204
"""ensure locked instance cannot be changed"""
1192
1205
instance = jsonutils.to_primitive(self._create_fake_instance())
1201
1214
instance = db.instance_get_by_uuid(self.context, instance_uuid)
1202
1215
self.assertEqual(instance['task_state'], task_state)
1217
# should fail with locked nonadmin context
1218
self.compute_api.lock(self.context, instance)
1219
instance = db.instance_get_by_uuid(self.context, instance_uuid)
1220
self.assertRaises(exception.InstanceIsLocked,
1221
self.compute_api.reboot,
1222
non_admin_context, instance, 'SOFT')
1223
check_task_state(None)
1225
# should fail with invalid task state
1226
self.compute_api.unlock(self.context, instance)
1204
1227
instance = db.instance_update(self.context, instance_uuid,
1205
1228
{'task_state': task_states.REBOOTING})
1207
# should fail with locked nonadmin context, task_state won't be cleared
1208
self.compute_api.lock(self.context, instance)
1209
instance = db.instance_get_by_uuid(self.context, instance_uuid)
1210
self.compute.reboot_instance(non_admin_context,
1211
instance=jsonutils.to_primitive(instance))
1212
check_task_state(task_states.REBOOTING)
1214
# should succeed with unlocked nonadmin context, task_state cleared
1215
self.compute_api.unlock(self.context, instance)
1216
instance = db.instance_get_by_uuid(self.context, instance_uuid)
1217
self.compute.reboot_instance(non_admin_context,
1218
instance=jsonutils.to_primitive(instance))
1219
check_task_state(None)
1229
self.assertRaises(exception.InstanceInvalidState,
1230
self.compute_api.reboot,
1231
non_admin_context, instance, 'SOFT')
1232
check_task_state(task_states.REBOOTING)
1234
# should succeed with admin context
1235
instance = db.instance_update(self.context, instance_uuid,
1236
{'task_state': None})
1237
self.compute_api.reboot(self.context, instance, 'SOFT')
1238
check_task_state(task_states.REBOOTING)
1221
1240
self.compute.terminate_instance(self.context,
1222
1241
instance=jsonutils.to_primitive(instance))
1230
1249
db.instance_update(self.context, instance['uuid'],
1231
1250
{"task_state": pre_task_state})
1252
orig_elevated = self.context.elevated
1253
orig_notify = self.compute._notify_about_instance_usage
1255
def _get_an_exception(*args, **kwargs):
1256
raise Exception("This fails every single time!")
1258
self.stubs.Set(self.context, 'elevated', _get_an_exception)
1259
self.stubs.Set(self.compute,
1260
'_notify_about_instance_usage', _get_an_exception)
1235
1264
ret_val = getattr(self.compute, operation)(self.context,
1236
1265
instance=instance)
1237
1266
except Exception:
1269
# self.context.elevated() is called in tearDown()
1270
self.stubs.Set(self.context, 'elevated', orig_elevated)
1271
self.stubs.Set(self.compute,
1272
'_notify_about_instance_usage', orig_notify)
1239
1274
self.assertTrue(raised)
1241
1276
# Fetch the instance's task_state and make sure it went to None
1264
1299
("resume_instance", task_states.RESUMING),
1267
def _get_an_exception(*args, **kwargs):
1268
raise Exception("This fails every single time!")
1270
self.stubs.Set(self.compute, "_get_lock", _get_an_exception)
1271
1302
for operation, pre_state in actions:
1272
1303
self._test_state_revert(operation, pre_state)
1300
1331
context = self.context.elevated()
1301
1332
instance = jsonutils.to_primitive(self._create_fake_instance())
1302
self.compute.prep_resize(context, instance=instance, instance_type={},
1333
instance_type = instance_types.get_default_instance_type()
1334
db.instance_update(self.context, instance["uuid"],
1335
{"task_state": task_states.RESIZE_PREP})
1336
self.compute.prep_resize(context, instance=instance,
1337
instance_type=instance_type,
1304
1339
migration_ref = db.migration_get_by_instance_and_status(context,
1305
1340
instance['uuid'], 'pre-migrating')
1341
db.instance_update(self.context, instance["uuid"],
1342
{"task_state": task_states.RESIZE_MIGRATED})
1306
1343
self.compute.finish_resize(context,
1307
1344
migration_id=int(migration_ref['id']),
1308
1345
disk_info={}, image={}, instance=instance,
1325
1362
context = self.context.elevated()
1326
1363
instance = jsonutils.to_primitive(self._create_fake_instance())
1327
self.compute.prep_resize(context, instance=instance, instance_type={},
1364
instance_type = instance_types.get_default_instance_type()
1365
self.compute.prep_resize(context, instance=instance,
1366
instance_type=instance_type,
1328
1367
image={}, reservations=reservations)
1329
1368
migration_ref = db.migration_get_by_instance_and_status(context,
1330
1369
instance['uuid'], 'pre-migrating')
1371
db.instance_update(self.context, instance["uuid"],
1372
{"task_state": task_states.RESIZE_MIGRATED})
1332
1373
self.assertRaises(test.TestingException, self.compute.finish_resize,
1333
1374
context, migration_id=int(migration_ref['id']),
1334
1375
disk_info={}, image={}, instance=instance,
1351
1392
test_notifier.NOTIFICATIONS = []
1352
1393
instance = db.instance_get_by_uuid(self.context, inst_ref['uuid'])
1394
orig_sys_metadata = db.instance_system_metadata_get(self.context,
1354
1396
image_ref = instance["image_ref"]
1355
1397
new_image_ref = image_ref + '-new_image_ref'
1356
1398
db.instance_update(self.context, inst_ref['uuid'],
1361
1403
instance = db.instance_get_by_uuid(self.context, inst_ref['uuid'])
1405
db.instance_update(self.context, instance['uuid'],
1406
{"task_state": task_states.REBUILDING})
1363
1407
self.compute.rebuild_instance(self.context.elevated(),
1364
image_ref, new_image_ref,
1365
instance=jsonutils.to_primitive(instance),
1408
jsonutils.to_primitive(instance),
1409
image_ref, new_image_ref,
1412
orig_sys_metadata=orig_sys_metadata)
1368
1414
instance = db.instance_get_by_uuid(self.context, inst_ref['uuid'])
1415
1461
self.compute.run_instance(self.context, instance=instance)
1417
1463
db.instance_update(self.context, instance['uuid'], {'host': 'foo'})
1464
db.instance_update(self.context, instance["uuid"],
1465
{"task_state": task_states.RESIZE_PREP})
1418
1466
self.compute.prep_resize(context, instance=instance,
1419
1467
instance_type=new_type, image={})
1420
1468
migration_ref = db.migration_get_by_instance_and_status(context,
1421
1469
instance['uuid'],
1422
1470
'pre-migrating')
1423
self.compute.resize_instance(context, migration_ref['id'], {},
1471
self.compute.resize_instance(context, instance=instance,
1472
migration_id=migration_ref['id'],
1425
1474
timeutils.set_time_override(cur_time)
1426
1475
test_notifier.NOTIFICATIONS = []
1465
1514
test_notifier.NOTIFICATIONS = []
1467
1516
db.instance_update(self.context, instance['uuid'], {'host': 'foo'})
1517
instance_type = instance_types.get_default_instance_type()
1468
1518
self.compute.prep_resize(context, instance=instance,
1469
instance_type={}, image={})
1519
instance_type=instance_type, image={})
1470
1520
db.migration_get_by_instance_and_status(context,
1471
1521
instance['uuid'],
1472
1522
'pre-migrating')
1509
1559
new_instance = db.instance_update(self.context, instance['uuid'],
1510
1560
{'host': 'foo'})
1511
1561
new_instance = jsonutils.to_primitive(new_instance)
1562
instance_type = instance_types.get_default_instance_type()
1513
1564
self.assertRaises(exception.MigrationError, self.compute.prep_resize,
1514
1565
context, instance=new_instance,
1515
instance_type={}, image={},
1566
instance_type=instance_type, image={},
1516
1567
reservations=reservations)
1517
1568
self.compute.terminate_instance(context, instance=new_instance)
1533
1585
self.compute.run_instance(self.context, instance=instance)
1534
1586
db.instance_update(self.context, instance['uuid'], {'host': 'foo'})
1535
1587
self.compute.prep_resize(context, instance=instance,
1536
instance_type={}, image={},
1588
instance_type=instance_type, image={},
1537
1589
reservations=reservations)
1538
1590
migration_ref = db.migration_get_by_instance_and_status(context,
1539
1591
instance['uuid'], 'pre-migrating')
1593
db.instance_update(self.context, instance['uuid'],
1594
{"task_state": task_states.RESIZE_PREP})
1542
1596
self.assertRaises(test.TestingException, self.compute.resize_instance,
1543
context, migration_ref['id'], {}, instance=instance,
1597
context, instance=instance,
1598
migration_id=migration_ref['id'], image={},
1544
1599
reservations=reservations)
1545
1600
instance = db.instance_get_by_uuid(context, instance['uuid'])
1546
1601
self.assertEqual(instance['vm_state'], vm_states.ERROR)
1551
1606
def test_resize_instance(self):
1552
1607
"""Ensure instance can be migrated/resized"""
1553
1608
instance = jsonutils.to_primitive(self._create_fake_instance())
1609
instance_type = instance_types.get_default_instance_type()
1554
1610
context = self.context.elevated()
1556
1612
self.compute.run_instance(self.context, instance=instance)
1557
1613
db.instance_update(self.context, instance['uuid'],
1558
1614
{'host': 'foo'})
1559
1615
self.compute.prep_resize(context, instance=instance,
1560
instance_type={}, image={})
1616
instance_type=instance_type, image={})
1561
1617
migration_ref = db.migration_get_by_instance_and_status(context,
1562
1618
instance['uuid'], 'pre-migrating')
1563
self.compute.resize_instance(context, migration_ref['id'], {},
1619
db.instance_update(self.context, instance['uuid'],
1620
{"task_state": task_states.RESIZE_PREP})
1621
self.compute.resize_instance(context, instance=instance,
1622
migration_id=migration_ref['id'],
1565
1624
self.compute.terminate_instance(context,
1566
1625
instance=jsonutils.to_primitive(instance))
1599
1658
migration_ref = db.migration_get_by_instance_and_status(context,
1600
1659
inst_ref['uuid'], 'pre-migrating')
1602
self.compute.resize_instance(context, migration_ref['id'], {},
1603
instance=jsonutils.to_primitive(inst_ref))
1661
instance = jsonutils.to_primitive(inst_ref)
1662
db.instance_update(self.context, instance["uuid"],
1663
{"task_state": task_states.RESIZE_PREP})
1664
self.compute.resize_instance(context, instance=instance,
1665
migration_id=migration_ref['id'],
1604
1667
self.compute.finish_resize(context,
1605
1668
migration_id=int(migration_ref['id']), disk_info={},
1606
image={}, instance=jsonutils.to_primitive(inst_ref))
1669
image={}, instance=instance)
1608
1671
# Prove that the instance size is now the new size
1609
1672
inst_ref = db.instance_get_by_uuid(context, instance['uuid'])
1614
1677
# Finally, revert and confirm the old flavor has been applied
1615
1678
rpcinst = jsonutils.to_primitive(inst_ref)
1679
db.instance_update(self.context, instance["uuid"],
1680
{"task_state": task_states.RESIZE_REVERTING})
1616
1681
self.compute.revert_resize(context,
1617
1682
migration_id=migration_ref['id'], instance=rpcinst,
1618
1683
reservations=reservations)
1644
1709
instance = jsonutils.to_primitive(self._create_fake_instance())
1645
1710
self.compute.run_instance(self.context, instance=instance)
1646
1711
instance = db.instance_get_by_uuid(self.context, instance['uuid'])
1712
instance_type = instance_types.get_default_instance_type()
1647
1713
self.assertRaises(exception.MigrationError, self.compute.prep_resize,
1648
1714
self.context, instance=instance,
1649
instance_type={}, image={}, reservations=reservations)
1715
instance_type=instance_type, image={},
1716
reservations=reservations)
1650
1717
self.compute.terminate_instance(self.context,
1651
1718
instance=jsonutils.to_primitive(instance))
1661
1728
reservations = self._ensure_quota_reservations_rolledback()
1663
1730
inst_ref = jsonutils.to_primitive(self._create_fake_instance())
1731
instance_type = instance_types.get_default_instance_type()
1664
1732
context = self.context.elevated()
1666
1734
self.compute.run_instance(self.context, instance=inst_ref)
1667
1735
db.instance_update(self.context, inst_ref['uuid'], {'host': 'foo'})
1668
self.compute.prep_resize(context, instance=inst_ref, instance_type={},
1736
self.compute.prep_resize(context, instance=inst_ref,
1737
instance_type=instance_type,
1669
1738
image={}, reservations=reservations)
1670
1739
migration_ref = db.migration_get_by_instance_and_status(context,
1671
1740
inst_ref['uuid'], 'pre-migrating')
1741
db.instance_update(self.context, inst_ref['uuid'],
1742
{"task_state": task_states.RESIZE_PREP})
1672
1743
self.assertRaises(test.TestingException, self.compute.resize_instance,
1673
context, migration_ref['id'], {}, instance=inst_ref,
1744
context, instance=inst_ref,
1745
migration_id=migration_ref['id'], image={},
1674
1746
reservations=reservations)
1675
1747
inst_ref = db.instance_get_by_uuid(context, inst_ref['uuid'])
1676
1748
self.assertEqual(inst_ref['vm_state'], vm_states.ERROR)
1853
1925
mox.IsA(instance), True, None, instance['host']).AndRaise(
1854
1926
rpc.common.RemoteError('', '', ''))
1928
db.instance_update(self.context, instance['uuid'],
1929
{'task_state': task_states.MIGRATING})
1856
1930
# mocks for rollback
1857
1931
rpc.call(c, 'network', {'method': 'setup_networks_on_host',
1858
1932
'args': {'instance_id': inst_id,
1864
1938
{"method": "remove_volume_connection",
1865
1939
"args": {'instance': rpcinst,
1866
1940
'volume_id': volume_id},
1867
"version": "1.26"}, None)
1941
"version": compute_rpcapi.ComputeAPI.BASE_RPC_API_VERSION},
1868
1943
rpc.cast(c, topic,
1869
1944
{"method": "rollback_live_migration_at_destination",
1870
1945
"args": {'instance': rpcinst},
1946
"version": compute_rpcapi.ComputeAPI.BASE_RPC_API_VERSION})
1874
1949
self.mox.ReplayAll()
1944
2019
rpc.call(c, rpc.queue_get_for(c, FLAGS.compute_topic, dest),
1945
2020
{"method": "post_live_migration_at_destination",
1946
2021
"args": {'instance': inst_ref, 'block_migration': False},
1947
"version": "1.20"}, None)
2022
"version": compute_rpcapi.ComputeAPI.BASE_RPC_API_VERSION},
1948
2024
self.mox.StubOutWithMock(self.compute.driver, 'unplug_vifs')
1949
2025
self.compute.driver.unplug_vifs(inst_ref, [])
1950
2026
rpc.call(c, 'network', {'method': 'setup_networks_on_host',
2509
2585
sys_metadata = db.instance_system_metadata_get(self.context,
2510
2586
ref[0]['uuid'])
2511
self.assertEqual(sys_metadata,
2512
{'image_kernel_id': 'fake_kernel_id',
2588
image_props = {'image_kernel_id': 'fake_kernel_id',
2513
2589
'image_ramdisk_id': 'fake_ramdisk_id',
2514
'image_something_else': 'meow', })
2590
'image_something_else': 'meow', }
2591
for key, value in image_props.iteritems():
2592
self.assertTrue(key in sys_metadata)
2593
self.assertEqual(value, sys_metadata[key])
2516
2596
db.instance_destroy(self.context, ref[0]['uuid'])
2659
2739
instance_uuid = instance['uuid']
2660
2740
self.compute.run_instance(self.context, instance=instance)
2742
db.instance_update(self.context, instance['uuid'],
2743
{"task_state": task_states.STOPPING})
2662
2744
self.compute.stop_instance(self.context, instance=instance)
2664
2746
instance = db.instance_get_by_uuid(self.context, instance_uuid)
2882
2964
self.assertEqual(instance['task_state'], None)
2966
db.instance_update(self.context, instance['uuid'],
2967
{"task_state": task_states.PAUSING})
2884
2968
self.compute.pause_instance(self.context, instance=instance)
2885
2969
# set the state that the instance gets when pause finishes
2886
2970
instance = db.instance_update(self.context, instance['uuid'],
2995
3079
db.instance_destroy(self.context, inst_ref['uuid'])
3081
def test_hard_reboot_of_soft_rebooting_instance(self):
3082
"""Ensure instance can be hard rebooted while soft rebooting"""
3083
instance = jsonutils.to_primitive(self._create_fake_instance())
3084
self.compute.run_instance(self.context, instance=instance)
3086
inst_ref = db.instance_get_by_uuid(self.context, instance['uuid'])
3088
db.instance_update(self.context, instance['uuid'],
3089
{"task_state": task_states.REBOOTING})
3091
reboot_type = "HARD"
3092
self.compute_api.reboot(self.context, inst_ref, reboot_type)
3094
inst_ref = db.instance_get_by_uuid(self.context, inst_ref['uuid'])
3095
self.assertEqual(inst_ref['task_state'], task_states.REBOOTING_HARD)
3097
db.instance_destroy(self.context, inst_ref['uuid'])
3099
def test_soft_reboot_of_rebooting_instance(self):
3100
"""Ensure instance can't be soft rebooted while rebooting"""
3101
instance = jsonutils.to_primitive(self._create_fake_instance())
3102
self.compute.run_instance(self.context, instance=instance)
3104
inst_ref = db.instance_get_by_uuid(self.context, instance['uuid'])
3106
db.instance_update(self.context, instance['uuid'],
3107
{"task_state": task_states.REBOOTING})
3109
inst_ref = db.instance_get_by_uuid(self.context, inst_ref['uuid'])
3110
reboot_type = "SOFT"
3111
self.assertRaises(exception.InstanceInvalidState,
3112
self.compute_api.reboot,
2997
3117
def test_hostname_create(self):
2998
3118
"""Ensure instance hostname is set during creation."""
2999
3119
inst_type = instance_types.get_instance_type_by_name('m1.tiny')
3911
4031
self.context, instance['uuid']):
3912
4032
db.block_device_mapping_destroy(self.context, bdm['id'])
3913
4033
instance = db.instance_get_by_uuid(self.context, instance['uuid'])
3914
self.compute.terminate_instance(self.context,
3915
instance_uuid=instance['uuid'])
4034
self.compute.terminate_instance(self.context, instance)
3917
4036
def test_volume_size(self):
3918
4037
ephemeral_size = 2
4031
4150
rpc_msg1 = {'method': 'get_vnc_console',
4032
4151
'args': {'instance': fake_instance,
4033
4152
'console_type': fake_console_type},
4153
'version': compute_rpcapi.ComputeAPI.BASE_RPC_API_VERSION}
4035
4154
rpc_msg2 = {'method': 'authorize_console',
4036
4155
'args': fake_connect_info,
4037
4156
'version': '1.0'}
4067
4186
rpc_msg = {'method': 'get_console_output',
4068
4187
'args': {'instance': fake_instance,
4069
4188
'tail_length': fake_tail_length},
4189
'version': compute_rpcapi.ComputeAPI.BASE_RPC_API_VERSION}
4071
4190
rpc.call(self.context, 'compute.%s' % fake_instance['host'],
4072
4191
rpc_msg, None).AndReturn(fake_console_output)
4177
4296
rpc.cast(self.context, topic,
4178
4297
{"method": "refresh_instance_security_rules",
4179
4298
"args": {'instance': jsonutils.to_primitive(instance)},
4300
compute_rpcapi.SecurityGroupAPI.BASE_RPC_API_VERSION})
4181
4301
self.mox.ReplayAll()
4183
4303
self.security_group_api.trigger_members_refresh(self.context, [1])
4205
4325
rpc.cast(self.context, topic,
4206
4326
{"method": "refresh_instance_security_rules",
4207
4327
"args": {'instance': jsonutils.to_primitive(instance)},
4329
compute_rpcapi.SecurityGroupAPI.BASE_RPC_API_VERSION})
4209
4330
self.mox.ReplayAll()
4211
4332
self.security_group_api.trigger_members_refresh(self.context, [1, 2])
4245
4366
rpc.cast(self.context, topic,
4246
4367
{"method": "refresh_instance_security_rules",
4247
4368
"args": {'instance': jsonutils.to_primitive(instance)},
4370
compute_rpcapi.SecurityGroupAPI.BASE_RPC_API_VERSION})
4249
4371
self.mox.ReplayAll()
4251
4373
self.security_group_api.trigger_rules_refresh(self.context, [1])
4265
4387
rpc.cast(self.context, topic,
4266
4388
{"method": "refresh_instance_security_rules",
4267
4389
"args": {'instance': jsonutils.to_primitive(instance)},
4391
compute_rpcapi.SecurityGroupAPI.BASE_RPC_API_VERSION})
4269
4392
self.mox.ReplayAll()
4271
4394
self.security_group_api.trigger_rules_refresh(self.context, [1, 2])
4593
4716
self.assertEqual(call_info['msg'],
4594
4717
{'method': 'get_host_uptime',
4719
'version': compute_rpcapi.ComputeAPI.BASE_RPC_API_VERSION})
4598
4721
def test_host_power_action(self):
4599
4722
ctxt = context.RequestContext('fake', 'fake')
4932
5055
# this won't be re-scheduled:
4933
5056
self.assertRaises(ThatsNoOrdinaryRabbitException,
4934
5057
self.compute._run_instance, self.context,
4935
None, {}, None, None, None, None, self.fake_instance, None)
5058
None, {}, None, None, None, None, self.fake_instance)
4937
5060
def test_exception_with_rescheduling_enabled(self):
4938
5061
"""Spawn fails and re-scheduling is enabled. Original exception
4962
5085
# the original exception should now be raised:
4963
5086
self.assertRaises(ThatsNoOrdinaryRabbitException,
4964
5087
self.compute._run_instance, self.context,
4965
None, {}, None, None, None, None, self.fake_instance, None)
5088
None, {}, None, None, None, None, self.fake_instance)