647
760
def test_pre_live_migration_instance_has_no_fixed_ip(self):
648
761
"""Confirm raising exception if instance doesn't have fixed_ip."""
649
instance_ref = self._get_dummy_instance()
762
# creating instance testdata
763
instance_id = self._create_instance({'host': 'dummy'})
650
764
c = context.get_admin_context()
651
i_id = instance_ref['id']
653
dbmock = self.mox.CreateMock(db)
654
dbmock.instance_get(c, i_id).AndReturn(instance_ref)
655
dbmock.instance_get_fixed_addresses(c, i_id).AndReturn(None)
657
self.compute.db = dbmock
659
self.assertRaises(exception.NotFound,
765
inst_ref = db.instance_get(c, instance_id)
766
topic = db.queue_get_for(c, FLAGS.compute_topic, inst_ref['host'])
769
self.assertRaises(exception.FixedIpNotFoundForInstance,
660
770
self.compute.pre_live_migration,
661
c, instance_ref['id'], time=FakeTime())
771
c, inst_ref['id'], time=FakeTime())
773
db.instance_destroy(c, instance_id)
663
def test_pre_live_migration_instance_has_volume(self):
775
def test_pre_live_migration_works_correctly(self):
664
776
"""Confirm setup_compute_volume is called when volume is mounted."""
665
i_ref = self._get_dummy_instance()
666
c = context.get_admin_context()
668
self._setup_other_managers()
669
dbmock = self.mox.CreateMock(db)
670
volmock = self.mox.CreateMock(self.volume_manager)
671
drivermock = self.mox.CreateMock(self.compute_driver)
673
dbmock.instance_get(c, i_ref['id']).AndReturn(i_ref)
674
dbmock.instance_get_fixed_addresses(c, i_ref['id']).AndReturn('dummy')
675
for i in range(len(i_ref['volumes'])):
676
vid = i_ref['volumes'][i]['id']
677
volmock.setup_compute_volume(c, vid).InAnyOrder('g1')
678
drivermock.plug_vifs(i_ref, [])
679
drivermock.ensure_filtering_rules_for_instance(i_ref, [])
681
self.compute.db = dbmock
682
self.compute.volume_manager = volmock
683
self.compute.driver = drivermock
686
ret = self.compute.pre_live_migration(c, i_ref['id'])
687
self.assertEqual(ret, None)
689
def test_pre_live_migration_instance_has_no_volume(self):
690
"""Confirm log meg when instance doesn't mount any volumes."""
691
i_ref = self._get_dummy_instance()
692
i_ref['volumes'] = []
693
c = context.get_admin_context()
695
self._setup_other_managers()
696
dbmock = self.mox.CreateMock(db)
697
drivermock = self.mox.CreateMock(self.compute_driver)
699
dbmock.instance_get(c, i_ref['id']).AndReturn(i_ref)
700
dbmock.instance_get_fixed_addresses(c, i_ref['id']).AndReturn('dummy')
701
self.mox.StubOutWithMock(compute_manager.LOG, 'info')
702
compute_manager.LOG.info(_("%s has no volume."), i_ref['hostname'])
703
drivermock.plug_vifs(i_ref, [])
704
drivermock.ensure_filtering_rules_for_instance(i_ref, [])
706
self.compute.db = dbmock
707
self.compute.driver = drivermock
710
ret = self.compute.pre_live_migration(c, i_ref['id'], time=FakeTime())
711
self.assertEqual(ret, None)
713
def test_pre_live_migration_setup_compute_node_fail(self):
714
"""Confirm operation setup_compute_network() fails.
716
It retries and raise exception when timeout exceeded.
720
i_ref = self._get_dummy_instance()
721
c = context.get_admin_context()
723
self._setup_other_managers()
724
dbmock = self.mox.CreateMock(db)
725
netmock = self.mox.CreateMock(self.network_manager)
726
volmock = self.mox.CreateMock(self.volume_manager)
727
drivermock = self.mox.CreateMock(self.compute_driver)
729
dbmock.instance_get(c, i_ref['id']).AndReturn(i_ref)
730
dbmock.instance_get_fixed_addresses(c, i_ref['id']).AndReturn('dummy')
731
for i in range(len(i_ref['volumes'])):
732
volmock.setup_compute_volume(c, i_ref['volumes'][i]['id'])
733
for i in range(FLAGS.live_migration_retry_count):
734
drivermock.plug_vifs(i_ref, []).\
735
AndRaise(exception.ProcessExecutionError())
737
self.compute.db = dbmock
738
self.compute.network_manager = netmock
739
self.compute.volume_manager = volmock
740
self.compute.driver = drivermock
743
self.assertRaises(exception.ProcessExecutionError,
744
self.compute.pre_live_migration,
745
c, i_ref['id'], time=FakeTime())
747
def test_live_migration_works_correctly_with_volume(self):
748
"""Confirm check_for_export to confirm volume health check."""
749
i_ref = self._get_dummy_instance()
750
c = context.get_admin_context()
751
topic = db.queue_get_for(c, FLAGS.compute_topic, i_ref['host'])
753
dbmock = self.mox.CreateMock(db)
754
dbmock.instance_get(c, i_ref['id']).AndReturn(i_ref)
755
self.mox.StubOutWithMock(rpc, 'call')
756
rpc.call(c, FLAGS.volume_topic, {"method": "check_for_export",
757
"args": {'instance_id': i_ref['id']}})
758
dbmock.queue_get_for(c, FLAGS.compute_topic, i_ref['host']).\
760
rpc.call(c, topic, {"method": "pre_live_migration",
761
"args": {'instance_id': i_ref['id'],
762
'block_migration': False,
765
self.mox.StubOutWithMock(self.compute.driver, 'live_migration')
766
self.compute.driver.live_migration(c, i_ref, i_ref['host'],
767
self.compute.post_live_migration,
768
self.compute.rollback_live_migration,
771
self.compute.db = dbmock
773
ret = self.compute.live_migration(c, i_ref['id'], i_ref['host'])
774
self.assertEqual(ret, None)
777
# creating instance testdata
778
instance_id = self._create_instance({'host': 'dummy'})
779
c = context.get_admin_context()
780
inst_ref = db.instance_get(c, instance_id)
781
topic = db.queue_get_for(c, FLAGS.compute_topic, inst_ref['host'])
784
self.mox.StubOutWithMock(self.compute.driver, 'pre_live_migration')
785
self.compute.driver.pre_live_migration({'block_device_mapping': []})
786
dummy_nw_info = [[None, {'ips':'1.1.1.1'}]]
787
self.mox.StubOutWithMock(self.compute, '_get_instance_nw_info')
788
self.compute._get_instance_nw_info(c, mox.IsA(inst_ref)
789
).AndReturn(dummy_nw_info)
790
self.mox.StubOutWithMock(self.compute.driver, 'plug_vifs')
791
self.compute.driver.plug_vifs(mox.IsA(inst_ref), dummy_nw_info)
792
self.mox.StubOutWithMock(self.compute.driver,
793
'ensure_filtering_rules_for_instance')
794
self.compute.driver.ensure_filtering_rules_for_instance(
795
mox.IsA(inst_ref), dummy_nw_info)
799
ret = self.compute.pre_live_migration(c, inst_ref['id'])
800
self.assertEqual(ret, None)
803
db.instance_destroy(c, instance_id)
776
805
def test_live_migration_dest_raises_exception(self):
777
806
"""Confirm exception when pre_live_migration fails."""
778
i_ref = self._get_dummy_instance()
807
# creating instance testdata
808
instance_id = self._create_instance({'host': 'dummy'})
779
809
c = context.get_admin_context()
780
topic = db.queue_get_for(c, FLAGS.compute_topic, i_ref['host'])
810
inst_ref = db.instance_get(c, instance_id)
811
topic = db.queue_get_for(c, FLAGS.compute_topic, inst_ref['host'])
812
# creating volume testdata
814
db.volume_create(c, {'id': volume_id})
815
values = {'instance_id': instance_id, 'device_name': '/dev/vdc',
816
'delete_on_termination': False, 'volume_id': volume_id}
817
db.block_device_mapping_create(c, values)
782
dbmock = self.mox.CreateMock(db)
783
dbmock.instance_get(c, i_ref['id']).AndReturn(i_ref)
784
820
self.mox.StubOutWithMock(rpc, 'call')
785
821
rpc.call(c, FLAGS.volume_topic, {"method": "check_for_export",
786
"args": {'instance_id': i_ref['id']}})
787
dbmock.queue_get_for(c, FLAGS.compute_topic, i_ref['host']).\
789
rpc.call(c, topic, {"method": "pre_live_migration",
790
"args": {'instance_id': i_ref['id'],
791
'block_migration': False,
793
AndRaise(rpc.RemoteError('', '', ''))
794
dbmock.instance_update(c, i_ref['id'], {'vm_state': vm_states.ACTIVE,
796
'host': i_ref['host']})
797
for v in i_ref['volumes']:
798
dbmock.volume_update(c, v['id'], {'status': 'in-use'})
799
# mock for volume_api.remove_from_compute
800
rpc.call(c, topic, {"method": "remove_volume",
801
"args": {'volume_id': v['id']}})
803
self.compute.db = dbmock
805
self.assertRaises(rpc.RemoteError,
806
self.compute.live_migration,
807
c, i_ref['id'], i_ref['host'])
809
def test_live_migration_dest_raises_exception_no_volume(self):
810
"""Same as above test(input pattern is different) """
811
i_ref = self._get_dummy_instance()
812
i_ref['volumes'] = []
813
c = context.get_admin_context()
814
topic = db.queue_get_for(c, FLAGS.compute_topic, i_ref['host'])
816
dbmock = self.mox.CreateMock(db)
817
dbmock.instance_get(c, i_ref['id']).AndReturn(i_ref)
818
dbmock.queue_get_for(c, FLAGS.compute_topic, i_ref['host']).\
820
self.mox.StubOutWithMock(rpc, 'call')
821
rpc.call(c, topic, {"method": "pre_live_migration",
822
"args": {'instance_id': i_ref['id'],
823
'block_migration': False,
825
AndRaise(rpc.RemoteError('', '', ''))
826
dbmock.instance_update(c, i_ref['id'], {'vm_state': vm_states.ACTIVE,
828
'host': i_ref['host']})
830
self.compute.db = dbmock
832
self.assertRaises(rpc.RemoteError,
833
self.compute.live_migration,
834
c, i_ref['id'], i_ref['host'])
836
def test_live_migration_works_correctly_no_volume(self):
822
"args": {'instance_id': instance_id}})
823
rpc.call(c, topic, {"method": "pre_live_migration",
824
"args": {'instance_id': instance_id,
825
'block_migration': True,
827
AndRaise(rpc.common.RemoteError('', '', ''))
829
rpc.call(c, topic, {"method": "remove_volume_connection",
830
"args": {'instance_id': instance_id,
831
'volume_id': volume_id}})
832
rpc.cast(c, topic, {"method": "rollback_live_migration_at_destination",
833
"args": {'instance_id': inst_ref['id']}})
837
self.assertRaises(rpc.RemoteError,
838
self.compute.live_migration,
839
c, instance_id, inst_ref['host'], True)
842
for bdms in db.block_device_mapping_get_all_by_instance(c,
844
db.block_device_mapping_destroy(c, bdms['id'])
845
db.volume_destroy(c, volume_id)
846
db.instance_destroy(c, instance_id)
848
def test_live_migration_works_correctly(self):
837
849
"""Confirm live_migration() works as expected correctly."""
838
i_ref = self._get_dummy_instance()
839
i_ref['volumes'] = []
850
# creating instance testdata
851
instance_id = self._create_instance({'host': 'dummy'})
840
852
c = context.get_admin_context()
841
topic = db.queue_get_for(c, FLAGS.compute_topic, i_ref['host'])
853
inst_ref = db.instance_get(c, instance_id)
854
topic = db.queue_get_for(c, FLAGS.compute_topic, inst_ref['host'])
843
dbmock = self.mox.CreateMock(db)
844
dbmock.instance_get(c, i_ref['id']).AndReturn(i_ref)
845
857
self.mox.StubOutWithMock(rpc, 'call')
846
dbmock.queue_get_for(c, FLAGS.compute_topic, i_ref['host']).\
848
858
rpc.call(c, topic, {"method": "pre_live_migration",
849
"args": {'instance_id': i_ref['id'],
859
"args": {'instance_id': instance_id,
850
860
'block_migration': False,
852
self.mox.StubOutWithMock(self.compute.driver, 'live_migration')
853
self.compute.driver.live_migration(c, i_ref, i_ref['host'],
854
self.compute.post_live_migration,
855
self.compute.rollback_live_migration,
858
self.compute.db = dbmock
859
864
self.mox.ReplayAll()
860
ret = self.compute.live_migration(c, i_ref['id'], i_ref['host'])
865
ret = self.compute.live_migration(c, inst_ref['id'], inst_ref['host'])
861
866
self.assertEqual(ret, None)
869
db.instance_destroy(c, instance_id)
863
871
def test_post_live_migration_working_correctly(self):
864
872
"""Confirm post_live_migration() works as expected correctly."""
865
873
dest = 'desthost'
866
874
flo_addr = '1.2.1.2'
869
877
c = context.get_admin_context()
870
instance_id = self._create_instance()
878
instance_id = self._create_instance({'state_description': 'migrating',
879
'state': power_state.PAUSED})
871
880
i_ref = db.instance_get(c, instance_id)
872
881
db.instance_update(c, i_ref['id'], {'vm_state': vm_states.MIGRATING,
873
882
'power_state': power_state.PAUSED})
1007
1010
db.instance_destroy(c, instance_id2)
1008
1011
db.instance_destroy(c, instance_id3)
1010
def test_get_by_fixed_ip(self):
1011
"""Test getting 1 instance by Fixed IP"""
1012
c = context.get_admin_context()
1013
instance_id1 = self._create_instance()
1014
instance_id2 = self._create_instance({'id': 20})
1015
instance_id3 = self._create_instance({'id': 30})
1017
vif_ref1 = db.virtual_interface_create(c,
1018
{'address': '12:34:56:78:90:12',
1019
'instance_id': instance_id1,
1021
vif_ref2 = db.virtual_interface_create(c,
1022
{'address': '90:12:34:56:78:90',
1023
'instance_id': instance_id2,
1026
db.fixed_ip_create(c,
1027
{'address': '1.1.1.1',
1028
'instance_id': instance_id1,
1029
'virtual_interface_id': vif_ref1['id']})
1030
db.fixed_ip_create(c,
1031
{'address': '1.1.2.1',
1032
'instance_id': instance_id2,
1033
'virtual_interface_id': vif_ref2['id']})
1036
instances = self.compute_api.get_all(c,
1037
search_opts={'fixed_ip': '.*'})
1038
self.assertEqual(len(instances), 0)
1040
instances = self.compute_api.get_all(c,
1041
search_opts={'fixed_ip': '1.1.3.1'})
1042
self.assertEqual(len(instances), 0)
1044
instances = self.compute_api.get_all(c,
1045
search_opts={'fixed_ip': '1.1.1.1'})
1046
self.assertEqual(len(instances), 1)
1047
self.assertEqual(instances[0].id, instance_id1)
1049
instances = self.compute_api.get_all(c,
1050
search_opts={'fixed_ip': '1.1.2.1'})
1051
self.assertEqual(len(instances), 1)
1052
self.assertEqual(instances[0].id, instance_id2)
1054
db.virtual_interface_delete(c, vif_ref1['id'])
1055
db.virtual_interface_delete(c, vif_ref2['id'])
1056
db.instance_destroy(c, instance_id1)
1057
db.instance_destroy(c, instance_id2)
1059
def test_get_all_by_ip_regexp(self):
1060
"""Test searching by Floating and Fixed IP"""
1061
c = context.get_admin_context()
1062
instance_id1 = self._create_instance({'display_name': 'woot'})
1063
instance_id2 = self._create_instance({
1064
'display_name': 'woo',
1066
instance_id3 = self._create_instance({
1067
'display_name': 'not-woot',
1070
vif_ref1 = db.virtual_interface_create(c,
1071
{'address': '12:34:56:78:90:12',
1072
'instance_id': instance_id1,
1074
vif_ref2 = db.virtual_interface_create(c,
1075
{'address': '90:12:34:56:78:90',
1076
'instance_id': instance_id2,
1078
vif_ref3 = db.virtual_interface_create(c,
1079
{'address': '34:56:78:90:12:34',
1080
'instance_id': instance_id3,
1083
db.fixed_ip_create(c,
1084
{'address': '1.1.1.1',
1085
'instance_id': instance_id1,
1086
'virtual_interface_id': vif_ref1['id']})
1087
db.fixed_ip_create(c,
1088
{'address': '1.1.2.1',
1089
'instance_id': instance_id2,
1090
'virtual_interface_id': vif_ref2['id']})
1091
fix_addr = db.fixed_ip_create(c,
1092
{'address': '1.1.3.1',
1093
'instance_id': instance_id3,
1094
'virtual_interface_id': vif_ref3['id']})
1095
fix_ref = db.fixed_ip_get_by_address(c, fix_addr)
1096
flo_ref = db.floating_ip_create(c,
1097
{'address': '10.0.0.2',
1098
'fixed_ip_id': fix_ref['id']})
1100
# ends up matching 2nd octet here.. so all 3 match
1101
instances = self.compute_api.get_all(c,
1102
search_opts={'ip': '.*\.1'})
1103
self.assertEqual(len(instances), 3)
1105
instances = self.compute_api.get_all(c,
1106
search_opts={'ip': '1.*'})
1107
self.assertEqual(len(instances), 3)
1109
instances = self.compute_api.get_all(c,
1110
search_opts={'ip': '.*\.1.\d+$'})
1111
self.assertEqual(len(instances), 1)
1112
instance_ids = [instance.id for instance in instances]
1113
self.assertTrue(instance_id1 in instance_ids)
1115
instances = self.compute_api.get_all(c,
1116
search_opts={'ip': '.*\.2.+'})
1117
self.assertEqual(len(instances), 1)
1118
self.assertEqual(instances[0].id, instance_id2)
1120
instances = self.compute_api.get_all(c,
1121
search_opts={'ip': '10.*'})
1122
self.assertEqual(len(instances), 1)
1123
self.assertEqual(instances[0].id, instance_id3)
1125
db.virtual_interface_delete(c, vif_ref1['id'])
1126
db.virtual_interface_delete(c, vif_ref2['id'])
1127
db.virtual_interface_delete(c, vif_ref3['id'])
1128
db.floating_ip_destroy(c, '10.0.0.2')
1129
db.instance_destroy(c, instance_id1)
1130
db.instance_destroy(c, instance_id2)
1131
db.instance_destroy(c, instance_id3)
1133
def test_get_all_by_ipv6_regexp(self):
1134
"""Test searching by IPv6 address"""
1136
c = context.get_admin_context()
1137
instance_id1 = self._create_instance({'display_name': 'woot'})
1138
instance_id2 = self._create_instance({
1139
'display_name': 'woo',
1141
instance_id3 = self._create_instance({
1142
'display_name': 'not-woot',
1145
vif_ref1 = db.virtual_interface_create(c,
1146
{'address': '12:34:56:78:90:12',
1147
'instance_id': instance_id1,
1149
vif_ref2 = db.virtual_interface_create(c,
1150
{'address': '90:12:34:56:78:90',
1151
'instance_id': instance_id2,
1153
vif_ref3 = db.virtual_interface_create(c,
1154
{'address': '34:56:78:90:12:34',
1155
'instance_id': instance_id3,
1158
# This will create IPv6 addresses of:
1159
# 1: fd00::1034:56ff:fe78:9012
1160
# 20: fd00::9212:34ff:fe56:7890
1161
# 30: fd00::3656:78ff:fe90:1234
1163
instances = self.compute_api.get_all(c,
1164
search_opts={'ip6': '.*1034.*'})
1165
self.assertEqual(len(instances), 1)
1166
self.assertEqual(instances[0].id, instance_id1)
1168
instances = self.compute_api.get_all(c,
1169
search_opts={'ip6': '^fd00.*'})
1170
self.assertEqual(len(instances), 3)
1171
instance_ids = [instance.id for instance in instances]
1172
self.assertTrue(instance_id1 in instance_ids)
1173
self.assertTrue(instance_id2 in instance_ids)
1174
self.assertTrue(instance_id3 in instance_ids)
1176
instances = self.compute_api.get_all(c,
1177
search_opts={'ip6': '^.*12.*34.*'})
1178
self.assertEqual(len(instances), 2)
1179
instance_ids = [instance.id for instance in instances]
1180
self.assertTrue(instance_id2 in instance_ids)
1181
self.assertTrue(instance_id3 in instance_ids)
1183
db.virtual_interface_delete(c, vif_ref1['id'])
1184
db.virtual_interface_delete(c, vif_ref2['id'])
1185
db.virtual_interface_delete(c, vif_ref3['id'])
1186
db.instance_destroy(c, instance_id1)
1187
db.instance_destroy(c, instance_id2)
1188
db.instance_destroy(c, instance_id3)
1190
1013
def test_get_all_by_multiple_options_at_once(self):
1191
1014
"""Test searching by multiple options at once"""
1192
1015
c = context.get_admin_context()
1193
instance_id1 = self._create_instance({'display_name': 'woot'})
1016
network_manager = fake_network.FakeNetworkManager()
1017
self.stubs.Set(self.compute_api.network_api,
1018
'get_instance_uuids_by_ip_filter',
1019
network_manager.get_instance_uuids_by_ip_filter)
1020
self.stubs.Set(network_manager.db,
1021
'instance_get_id_to_uuid_mapping',
1022
db.instance_get_id_to_uuid_mapping)
1024
instance_id1 = self._create_instance({'display_name': 'woot',
1194
1026
instance_id2 = self._create_instance({
1195
1027
'display_name': 'woo',
1581
1379
self.assertEqual(self.compute_api._volume_size(inst_type,
1383
def test_reservation_id_one_instance(self):
1384
"""Verify building an instance has a reservation_id that
1385
matches return value from create"""
1386
(refs, resv_id) = self.compute_api.create(self.context,
1387
instance_types.get_default_instance_type(), None)
1389
self.assertEqual(len(refs), 1)
1390
self.assertEqual(refs[0]['reservation_id'], resv_id)
1392
db.instance_destroy(self.context, refs[0]['id'])
1394
def test_reservation_ids_two_instances(self):
1395
"""Verify building 2 instances at once results in a
1396
reservation_id being returned equal to reservation id set
1399
(refs, resv_id) = self.compute_api.create(self.context,
1400
instance_types.get_default_instance_type(), None,
1401
min_count=2, max_count=2)
1403
self.assertEqual(len(refs), 2)
1404
self.assertNotEqual(resv_id, None)
1406
for instance in refs:
1407
self.assertEqual(instance['reservation_id'], resv_id)
1408
db.instance_destroy(self.context, instance['id'])
1410
def test_reservation_ids_two_instances_no_wait(self):
1411
"""Verify building 2 instances at once without waiting for
1412
instance IDs results in a reservation_id being returned equal
1413
to reservation id set in both instances
1415
(refs, resv_id) = self.compute_api.create(self.context,
1416
instance_types.get_default_instance_type(), None,
1417
min_count=2, max_count=2, wait_for_instances=False)
1419
self.assertEqual(refs, None)
1420
self.assertNotEqual(resv_id, None)
1422
instances = self.compute_api.get_all(self.context,
1423
search_opts={'reservation_id': resv_id})
1424
self.assertEqual(len(instances), 2)
1425
for instance in instances:
1426
self.assertEqual(instance['reservation_id'], resv_id)
1427
db.instance_destroy(self.context, instance['id'])
1429
def test_create_with_specified_reservation_id(self):
1430
"""Verify building instances with a specified
1431
reservation_id results in the correct reservation_id
1435
# We need admin context to be able to specify our own
1437
context = self.context.elevated()
1439
(refs, resv_id) = self.compute_api.create(context,
1440
instance_types.get_default_instance_type(), None,
1441
min_count=1, max_count=1, reservation_id='meow')
1443
self.assertEqual(len(refs), 1)
1444
self.assertEqual(resv_id, 'meow')
1446
self.assertEqual(refs[0]['reservation_id'], resv_id)
1447
db.instance_destroy(self.context, refs[0]['id'])
1450
(refs, resv_id) = self.compute_api.create(context,
1451
instance_types.get_default_instance_type(), None,
1452
min_count=2, max_count=2, reservation_id='woof')
1454
self.assertEqual(len(refs), 2)
1455
self.assertEqual(resv_id, 'woof')
1457
for instance in refs:
1458
self.assertEqual(instance['reservation_id'], resv_id)
1459
db.instance_destroy(self.context, instance['id'])
1461
def test_instance_name_template(self):
1462
"""Test the instance_name template"""
1463
self.flags(instance_name_template='instance-%d')
1464
instance_id = self._create_instance()
1465
i_ref = db.instance_get(self.context, instance_id)
1466
self.assertEqual(i_ref['name'], 'instance-%d' % i_ref['id'])
1467
db.instance_destroy(self.context, i_ref['id'])
1469
self.flags(instance_name_template='instance-%(uuid)s')
1470
instance_id = self._create_instance()
1471
i_ref = db.instance_get(self.context, instance_id)
1472
self.assertEqual(i_ref['name'], 'instance-%s' % i_ref['uuid'])
1473
db.instance_destroy(self.context, i_ref['id'])
1475
self.flags(instance_name_template='%(id)d-%(uuid)s')
1476
instance_id = self._create_instance()
1477
i_ref = db.instance_get(self.context, instance_id)
1478
self.assertEqual(i_ref['name'], '%d-%s' %
1479
(i_ref['id'], i_ref['uuid']))
1480
db.instance_destroy(self.context, i_ref['id'])
1482
# not allowed.. default is uuid
1483
self.flags(instance_name_template='%(name)s')
1484
instance_id = self._create_instance()
1485
i_ref = db.instance_get(self.context, instance_id)
1486
self.assertEqual(i_ref['name'], i_ref['uuid'])
1487
db.instance_destroy(self.context, i_ref['id'])
1490
class ComputeTestMinRamMinDisk(test.TestCase):
1492
super(ComputeTestMinRamMinDisk, self).setUp()
1493
self.compute = utils.import_object(FLAGS.compute_manager)
1494
self.compute_api = compute.API()
1495
self.context = context.RequestContext('fake', 'fake')
1496
self.stubs.Set(rpc, 'call', rpc_call_wrapper)
1497
self.stubs.Set(rpc, 'cast', rpc_cast_wrapper)
1499
'id': 1, 'properties': {'kernel_id': 1, 'ramdisk_id': 1}}
1501
def test_create_with_too_little_ram(self):
1502
"""Test an instance type with too little memory"""
1504
inst_type = instance_types.get_default_instance_type()
1505
inst_type['memory_mb'] = 1
1507
def fake_show(*args):
1508
img = copy(self.fake_image)
1511
self.stubs.Set(fake_image._FakeImageService, 'show', fake_show)
1513
self.assertRaises(exception.InstanceTypeMemoryTooSmall,
1514
self.compute_api.create, self.context, inst_type, None)
1516
# Now increase the inst_type memory and make sure all is fine.
1517
inst_type['memory_mb'] = 2
1518
(refs, resv_id) = self.compute_api.create(self.context,
1520
db.instance_destroy(self.context, refs[0]['id'])
1522
def test_create_with_too_little_disk(self):
1523
"""Test an instance type with too little disk space"""
1525
inst_type = instance_types.get_default_instance_type()
1526
inst_type['local_gb'] = 1
1528
def fake_show(*args):
1529
img = copy(self.fake_image)
1532
self.stubs.Set(fake_image._FakeImageService, 'show', fake_show)
1534
self.assertRaises(exception.InstanceTypeDiskTooSmall,
1535
self.compute_api.create, self.context, inst_type, None)
1537
# Now increase the inst_type disk space and make sure all is fine.
1538
inst_type['local_gb'] = 2
1539
(refs, resv_id) = self.compute_api.create(self.context,
1541
db.instance_destroy(self.context, refs[0]['id'])
1543
def test_create_just_enough_ram_and_disk(self):
1544
"""Test an instance type with just enough ram and disk space"""
1546
inst_type = instance_types.get_default_instance_type()
1547
inst_type['local_gb'] = 2
1548
inst_type['memory_mb'] = 2
1550
def fake_show(*args):
1551
img = copy(self.fake_image)
1555
self.stubs.Set(fake_image._FakeImageService, 'show', fake_show)
1557
(refs, resv_id) = self.compute_api.create(self.context,
1559
db.instance_destroy(self.context, refs[0]['id'])
1561
def test_create_with_no_ram_and_disk_reqs(self):
1562
"""Test an instance type with no min_ram or min_disk"""
1564
inst_type = instance_types.get_default_instance_type()
1565
inst_type['local_gb'] = 1
1566
inst_type['memory_mb'] = 1
1568
def fake_show(*args):
1569
return copy(self.fake_image)
1570
self.stubs.Set(fake_image._FakeImageService, 'show', fake_show)
1572
(refs, resv_id) = self.compute_api.create(self.context,
1574
db.instance_destroy(self.context, refs[0]['id'])