diff --git a/changelogs/fragments/image_deactivate_reactivate.yml b/changelogs/fragments/image_deactivate_reactivate.yml new file mode 100644 index 00000000..e5a0c4c5 --- /dev/null +++ b/changelogs/fragments/image_deactivate_reactivate.yml @@ -0,0 +1,7 @@ +--- + +minor_changes: + - | + openstack.cloud.image - Added new `inactive` option for the image `state` + It will deactivate the image. Setting state `present` can re-activate it + again for deactivated previously images. diff --git a/ci/roles/image/tasks/main.yml b/ci/roles/image/tasks/main.yml index b69210bf..17ed90ec 100644 --- a/ci/roles/image/tasks/main.yml +++ b/ci/roles/image/tasks/main.yml @@ -176,6 +176,34 @@ - image is changed - image.image.name == 'ansible_image-changed' + - name: Deactivate raw image + openstack.cloud.image: + cloud: "{{ cloud }}" + state: inactive + id: "{{ image.image.id }}" + name: 'ansible_image-changed' + register: image + + - name: Assert changed + assert: + that: + - image is changed + - image.image.status == 'deactivated' + + - name: Reactivate raw image + openstack.cloud.image: + cloud: "{{ cloud }}" + state: present + id: "{{ image.image.id }}" + name: 'ansible_image-changed' + register: image + + - name: Assert changed + assert: + that: + - image is changed + - image.image.status == 'active' + - name: Rename back raw image (defaults) openstack.cloud.image: cloud: "{{ cloud }}" diff --git a/plugins/modules/image.py b/plugins/modules/image.py index cea82f61..44844b2e 100644 --- a/plugins/modules/image.py +++ b/plugins/modules/image.py @@ -100,8 +100,8 @@ options: type: str state: description: - - Should the resource be present or absent. - choices: [present, absent] + - Should the resource be present, absent or inactive. + choices: [present, absent, inactive] default: present type: str tags: @@ -153,7 +153,7 @@ EXAMPLES = r''' RETURN = r''' image: description: Dictionary describing the Glance image. - returned: On success when I(state) is C(present). + returned: On success when I(state) is C(present) or C(inactive). type: dict contains: id: @@ -394,7 +394,7 @@ class ImageModule(OpenStackModule): owner_domain=dict(aliases=['project_domain']), properties=dict(type='dict', default={}), ramdisk=dict(), - state=dict(default='present', choices=['absent', 'present']), + state=dict(default='present', choices=['absent', 'present', 'inactive']), tags=dict(type='list', default=[], elements='str'), visibility=dict(choices=['public', 'private', 'shared', 'community']), volume=dict(), @@ -510,6 +510,10 @@ class ImageModule(OpenStackModule): self.exit_json(changed=changed, image=self._return_value(image.id)) + if image['status'] == 'deactivated': + self.conn.image.reactivate_image(image) + changed = True + update_payload = self._build_update(image) if update_payload: @@ -525,6 +529,20 @@ class ImageModule(OpenStackModule): wait=self.params['wait'], timeout=self.params['timeout']) changed = True + + elif self.params['state'] == 'inactive' and image is not None: + if image['status'] == 'active': + self.conn.image.deactivate_image(image) + changed = True + + update_payload = self._build_update(image) + + if update_payload: + self.conn.image.update_image(image.id, **update_payload) + changed = True + + self.exit_json(changed=changed, image=self._return_value(image.id)) + self.exit_json(changed=changed)