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