diff --git a/roles/openstack_resources/defaults/main.yml b/roles/openstack_resources/defaults/main.yml index 6691961b..77e3b1c7 100644 --- a/roles/openstack_resources/defaults/main.yml +++ b/roles/openstack_resources/defaults/main.yml @@ -144,6 +144,7 @@ openstack_resources_network: {} # Define this variable to manage OpenStack images # openstack_resources_image: +# image_force_upload: false # image_upload_batch: 3 # image_async_timeout: 600 # image_async_retries: 200 diff --git a/roles/openstack_resources/tasks/image.yml b/roles/openstack_resources/tasks/image.yml index a7543694..95a16f04 100644 --- a/roles/openstack_resources/tasks/image.yml +++ b/roles/openstack_resources/tasks/image.yml @@ -13,15 +13,34 @@ # See the License for the specific language governing permissions and # limitations under the License. +- name: Fetch the list of already existing images + openstack.cloud.image_info: + cloud: "{{ openstack_resources_cloud_name }}" + interface: "{{ openstack_resources_interface }}" + when: + - openstack_resources_image['images'] | selectattr('checksum', 'defined') + - not (openstack_resources_image['image_force_upload'] | default(false)) + register: existing_images + - name: Upload images ansible.builtin.include_tasks: file: image_upload.yml - loop: "{{ openstack_resources_image['images'] | batch(openstack_resources_image['image_upload_batch'] | default(3)) }}" + loop: "{{ images_for_upload | batch(openstack_resources_image['image_upload_batch'] | default(3)) }}" loop_control: loop_var: images - label: "{{ openstack_resources_image['images'] | map(attribute='name') | to_json }}" + label: "{{ images_for_upload | map(attribute='name') | to_json }}" + vars: + existing_images_checksums: "{{ existing_images['images'] | default([]) | map(attribute='checksum') }}" + images_for_upload: >- + {{ + (openstack_resources_image['image_force_upload'] | default(false)) | ternary( + openstack_resources_image['images'], + openstack_resources_image['images'] | selectattr('checksum', 'defined') | rejectattr('checksum', 'in', existing_images_checksums) + + openstack_resources_image['images'] | rejectattr('checksum', 'defined') + ) + }} -- name: Retrieve all available Openstack images +- name: Retrieve fresh details about controlled Openstack images openstack.cloud.image_info: cloud: "{{ openstack_resources_cloud_name }}" interface: "{{ openstack_resources_interface }}"