From 8d9b8b9a35607287391802073a5963d35155f3bf Mon Sep 17 00:00:00 2001 From: Dmitriy Rabotyagov Date: Fri, 21 Apr 2023 12:23:31 +0200 Subject: [PATCH] Add inactive state for the images Glance images can be deactivated ad reactivated with corresponding API calls. It might be useful for operators to be able to control these states through ansible modules as well. Instead of introduction of the new parameter we're adding new state for the image that is `inactive`. Change-Id: I0738ff564f81a31690872450a4731340ed6bbeb1 --- .../fragments/image_deactivate_reactivate.yml | 7 +++++ ci/roles/image/tasks/main.yml | 28 +++++++++++++++++++ plugins/modules/image.py | 26 ++++++++++++++--- 3 files changed, 57 insertions(+), 4 deletions(-) create mode 100644 changelogs/fragments/image_deactivate_reactivate.yml 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)