From be0a0c99f3ebcb80e7a71226557bd2a96f75af73 Mon Sep 17 00:00:00 2001 From: Paul Belanger Date: Sat, 13 May 2017 15:10:17 -0400 Subject: [PATCH] Fix exception when using boot_from_volume for create_server It is possible for create_server to accept a dict for image, however _get_boot_from_volume_kwargs did expect that. This created the following exception: Traceback (most recent call last): File "/opt/stack/new/nodepool/nodepool/nodepool.py", line 358, in _run self._launchNode() File "/opt/stack/new/nodepool/nodepool/nodepool.py", line 290, in _launchNode volume_size=self._label.volume_size) File "/opt/stack/new/nodepool/nodepool/provider_manager.py", line 235, in createServer return self._client.create_server(wait=False, **create_args) File "", line 2, in create_server File "/opt/stack/new/nodepool-venv/local/lib/python2.7/site-packages/shade/_utils.py", line 393, in func_wrapper return func(*args, **kwargs) File "/opt/stack/new/nodepool-venv/local/lib/python2.7/site-packages/shade/openstackcloud.py", line 5517, in create_server volumes=volumes, kwargs=kwargs) File "/opt/stack/new/nodepool-venv/local/lib/python2.7/site-packages/shade/openstackcloud.py", line 5333, in _get_boot_from_volume_kwargs cloud=self.name, region=self.region_name)) OpenStackCloudException: Image {'id': u'1cb47019-08a4-4b9c-ae62-737b547648b6'} is not a valid image in devstack:RegionOne Now, check if image is a dictonary, like we did in create_server. Also add an ansible test for os_server so we additional code coverage. Change-Id: If58cd96b0b9ce4569120d60fbceb2c23b2f7641d Signed-off-by: Paul Belanger --- shade/openstackcloud.py | 7 +++++- .../tests/ansible/roles/server/tasks/main.yml | 24 +++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/shade/openstackcloud.py b/shade/openstackcloud.py index 11af3ee0e..d0a157a79 100644 --- a/shade/openstackcloud.py +++ b/shade/openstackcloud.py @@ -5311,6 +5311,11 @@ class OpenStackCloud(_normalize.Normalizer): def _get_boot_from_volume_kwargs( self, image, boot_from_volume, boot_volume, volume_size, terminate_volume, volumes, kwargs): + """Return block device mappings + + :param image: Image dict, name or id to boot with. + + """ if boot_volume or boot_from_volume or volumes: kwargs.setdefault('block_device_mapping_v2', []) else: @@ -5337,7 +5342,7 @@ class OpenStackCloud(_normalize.Normalizer): kwargs['image'] = None elif boot_from_volume: - if hasattr(image, 'id'): + if isinstance(image, dict): image_obj = image else: image_obj = self.get_image(image) diff --git a/shade/tests/ansible/roles/server/tasks/main.yml b/shade/tests/ansible/roles/server/tasks/main.yml index 64a2c111f..f25bc2ef6 100644 --- a/shade/tests/ansible/roles/server/tasks/main.yml +++ b/shade/tests/ansible/roles/server/tasks/main.yml @@ -66,3 +66,27 @@ state: absent name: "{{ server_name }}" wait: true + +- name: Create server from volume + os_server: + cloud: "{{ cloud }}" + state: present + name: "{{ server_name }}" + image: "{{ image }}" + flavor: "{{ flavor }}" + network: "{{ server_network }}" + auto_floating_ip: false + boot_from_volume: true + volume_size: 5 + terminate_volume: true + wait: true + register: server + +- debug: var=server + +- name: Delete server with volume + os_server: + cloud: "{{ cloud }}" + state: absent + name: "{{ server_name }}" + wait: true