diff options
Diffstat (limited to 'openstack_dashboard/dashboards/project')
-rw-r--r-- | openstack_dashboard/dashboards/project/instances/tests.py | 39 | ||||
-rw-r--r-- | openstack_dashboard/dashboards/project/instances/workflows/create_instance.py | 31 |
2 files changed, 61 insertions, 9 deletions
diff --git a/openstack_dashboard/dashboards/project/instances/tests.py b/openstack_dashboard/dashboards/project/instances/tests.py index a5fe31955..3e4793978 100644 --- a/openstack_dashboard/dashboards/project/instances/tests.py +++ b/openstack_dashboard/dashboards/project/instances/tests.py @@ -1988,8 +1988,11 @@ class InstanceTests(helpers.TestCase): cinder: ('volume_list', 'volume_snapshot_list',), quotas: ('tenant_quota_usages',)}) - def test_launch_instance_post_boot_from_volume(self, - test_with_profile=False): + def test_launch_instance_post_boot_from_volume( + self, + test_with_profile=False, + test_with_bdmv2=False + ): flavor = self.flavors.first() keypair = self.keypairs.first() server = self.servers.first() @@ -1999,13 +2002,29 @@ class InstanceTests(helpers.TestCase): customization_script = 'user data' device_name = u'vda' volume_choice = "%s:vol" % volume.id - block_device_mapping = {device_name: u"%s::0" % volume_choice} + if test_with_bdmv2: + volume_source_id = volume.id.split(':')[0] + block_device_mapping = None + block_device_mapping_2 = [ + {'device_name': u'vda', + 'source_type': 'volume', + 'destination_type': 'volume', + 'delete_on_termination': 0, + 'uuid': volume_source_id, + 'boot_index': '0', + 'volume_size': 1 + } + ] + else: + block_device_mapping = {device_name: u"%s::0" % volume_choice} + block_device_mapping_2 = None + nics = [{"net-id": self.networks.first().id, "v4-fixed-ip": ''}] quota_usages = self.quota_usages.first() api.nova.extension_supported('BlockDeviceMappingV2Boot', IsA(http.HttpRequest)) \ - .AndReturn(True) + .AndReturn(test_with_bdmv2) api.nova.flavor_list(IsA(http.HttpRequest)) \ .AndReturn(self.flavors.list()) api.nova.keypair_list(IsA(http.HttpRequest)) \ @@ -2057,6 +2076,10 @@ class InstanceTests(helpers.TestCase): cinder.volume_snapshot_list(IsA(http.HttpRequest), search_opts=SNAPSHOT_SEARCH_OPTS) \ .AndReturn([]) + api.nova.extension_supported('BlockDeviceMappingV2Boot', + IsA(http.HttpRequest)) \ + .AndReturn(test_with_bdmv2) + api.nova.server_create(IsA(http.HttpRequest), server.name, '', @@ -2065,7 +2088,7 @@ class InstanceTests(helpers.TestCase): customization_script, [sec_group.name], block_device_mapping=block_device_mapping, - block_device_mapping_v2=None, + block_device_mapping_v2=block_device_mapping_2, nics=nics, availability_zone=avail_zone.zoneName, instance_count=IsA(int), @@ -2103,6 +2126,9 @@ class InstanceTests(helpers.TestCase): self.assertNoFormErrors(res) self.assertRedirectsNoFollow(res, INDEX_URL) + def test_launch_instance_post_boot_from_volume_with_bdmv2(self): + self.test_launch_instance_post_boot_from_volume(test_with_bdmv2=True) + @helpers.update_settings( OPENSTACK_NEUTRON_NETWORK={'profile_support': 'cisco'}) def test_launch_instance_post_boot_from_volume_with_profile(self): @@ -2196,6 +2222,9 @@ class InstanceTests(helpers.TestCase): quotas.tenant_quota_usages(IsA(http.HttpRequest)) \ .AndReturn(quota_usages) + api.nova.extension_supported('BlockDeviceMappingV2Boot', + IsA(http.HttpRequest)) \ + .AndReturn(False) api.nova.server_create(IsA(http.HttpRequest), server.name, '', diff --git a/openstack_dashboard/dashboards/project/instances/workflows/create_instance.py b/openstack_dashboard/dashboards/project/instances/workflows/create_instance.py index ddea8a57e..e531f58f6 100644 --- a/openstack_dashboard/dashboards/project/instances/workflows/create_instance.py +++ b/openstack_dashboard/dashboards/project/instances/workflows/create_instance.py @@ -852,10 +852,33 @@ class LaunchInstance(workflows.Workflow): if source_type in ['image_id', 'instance_snapshot_id']: image_id = context['source_id'] elif source_type in ['volume_id', 'volume_snapshot_id']: - dev_mapping_1 = {context['device_name']: - '%s::%s' % - (context['source_id'], - int(bool(context['delete_on_terminate'])))} + try: + if api.nova.extension_supported("BlockDeviceMappingV2Boot", + request): + # Volume source id is extracted from the source + volume_source_id = context['source_id'].split(':')[0] + device_name = context.get('device_name', '') \ + .strip() or None + dev_mapping_2 = [ + {'device_name': device_name, + 'source_type': 'volume', + 'destination_type': 'volume', + 'delete_on_termination': + int(bool(context['delete_on_terminate'])), + 'uuid': volume_source_id, + 'boot_index': '0', + 'volume_size': context['volume_size'] + } + ] + else: + dev_mapping_1 = {context['device_name']: '%s::%s' % + (context['source_id'], + int(bool(context['delete_on_terminate']))) + } + except Exception: + msg = _('Unable to retrieve extensions information') + exceptions.handle(request, msg) + elif source_type == 'volume_image_id': device_name = context.get('device_name', '').strip() or None dev_mapping_2 = [ |