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 "<decorator-gen-6>", 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 <pabelanger@redhat.com>
This commit is contained in:
Paul Belanger 2017-05-13 15:10:17 -04:00
parent 7cfb886b6f
commit be0a0c99f3
No known key found for this signature in database
GPG Key ID: 611A80832067AF38
2 changed files with 30 additions and 1 deletions

View File

@ -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)

View File

@ -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