From 8955110586fc143d561d561dcac2336034271bdf Mon Sep 17 00:00:00 2001 From: Jakob Meng Date: Thu, 3 Nov 2022 09:13:44 +0100 Subject: [PATCH] Refactored volume_info module Change-Id: I5fd844fbb7b9831deb32594c4a587b7249f63d00 --- ci/roles/volume/tasks/volume_info.yml | 27 +---- plugins/modules/volume_info.py | 161 ++++++++++++++++++++------ 2 files changed, 131 insertions(+), 57 deletions(-) diff --git a/ci/roles/volume/tasks/volume_info.yml b/ci/roles/volume/tasks/volume_info.yml index 55f0a1fe..e6164e3e 100644 --- a/ci/roles/volume/tasks/volume_info.yml +++ b/ci/roles/volume/tasks/volume_info.yml @@ -1,24 +1,3 @@ -- name: Get info about volumes and all projects for all SDK - openstack.cloud.volume_info: - cloud: "{{ cloud }}" - details: true - all_projects: true - -- name: Get info about volumes - openstack.cloud.volume_info: - cloud: "{{ cloud }}" - all_projects: true - register: delete - -- name: Clean up volumes before the test - openstack.cloud.volume: - cloud: "{{ cloud }}" - state: absent - name: "{{ vol.name }}" - loop: "{{ delete.volumes }}" - loop_control: - loop_var: vol - - name: Create volume openstack.cloud.volume: cloud: "{{ cloud }}" @@ -42,6 +21,12 @@ - info.volumes.0.name == 'ansible_test' - info.volumes.0.status == 'available' +- name: Assert return values of volume_info module + assert: + that: + # allow new fields to be introduced but prevent fields from being removed + - expected_fields|difference(info.volumes[0].keys())|length == 0 + - name: Get not detailed info about volumes openstack.cloud.volume_info: cloud: "{{ cloud }}" diff --git a/plugins/modules/volume_info.py b/plugins/modules/volume_info.py index 95faafe5..8c46dc3a 100644 --- a/plugins/modules/volume_info.py +++ b/plugins/modules/volume_info.py @@ -4,30 +4,30 @@ # Copyright (c) 2020, Sagi Shnaidman # GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) -DOCUMENTATION = ''' +DOCUMENTATION = r''' --- module: volume_info -short_description: Retrive information about volumes +short_description: Retrieve information about volumes author: Sagi Shnaidman (@sshnaidm) description: - Get information about block storage in openstack options: + all_projects: + description: + - Whether to return the volumes in all projects + type: bool details: description: - Whether to provide additional information about volumes type: bool - all_projects: - description: - - Whether return the volumes in all projects - type: bool name: description: - - Name of the volume as a string. + - Name of the volume type: str required: false status: description: - - Value of the status of the volume so that you can filter on "available" for example + - Status of the volume so that you can filter on C(available) for example type: str required: false @@ -39,12 +39,111 @@ extends_documentation_fragment: - openstack.cloud.openstack ''' -RETURN = ''' +RETURN = r''' volumes: - description: Volumes in project + description: Volumes in project(s) returned: always type: list elements: dict + contains: + attachments: + description: Instance attachment information. If this volume is attached + to a server instance, the attachments list includes the UUID + of the attached server, an attachment UUID, the name of the + attached host, if any, the volume UUID, the device, and the + device UUID. Otherwise, this list is empty. + type: list + availability_zone: + description: The name of the availability zone. + type: str + consistency_group_id: + description: The UUID of the consistency group. + type: str + created_at: + description: The date and time when the resource was created. + type: str + description: + description: The volume description. + type: str + extended_replication_status: + description: Extended replication status on this volume. + type: str + group_id: + description: The ID of the group. + type: str + host: + description: The volume's current back-end. + type: str + id: + description: The UUID of the volume. + type: str + image_id: + description: Image on which the volume was based + type: str + is_bootable: + description: Enables or disables the bootable attribute. You can boot an + instance from a bootable volume. + type: str + is_encrypted: + description: If true, this volume is encrypted. + type: bool + metadata: + description: A metadata object. Contains one or more metadata key and + value pairs that are associated with the volume. + type: dict + migration_id: + description: The volume ID that this volume name on the backend is + based on. + type: str + migration_status: + description: The status of this volume migration (None means that a + migration is not currently in progress). + type: str + name: + description: The volume name. + type: str + project_id: + description: The project ID which the volume belongs to. + type: str + replication_driver_data: + description: Data set by the replication driver + type: str + replication_status: + description: The volume replication status. + type: str + scheduler_hints: + description: Scheduler hints for the volume + type: dict + size: + description: The size of the volume, in gibibytes (GiB). + type: int + snapshot_id: + description: To create a volume from an existing snapshot, specify the + UUID of the volume snapshot. The volume is created in same + availability zone and with same size as the snapshot. + type: str + source_volume_id: + description: The UUID of the source volume. The API creates a new volume + with the same size as the source volume unless a larger size + is requested. + type: str + status: + description: The volume status. + type: str + updated_at: + description: The date and time when the resource was updated. + type: str + user_id: + description: The UUID of the user. + type: str + volume_image_metadata: + description: List of image metadata entries. Only included for volumes + that were created from an image, or from a snapshot of a + volume originally created from an image. + type: dict + volume_type: + description: The associated volume type name for the volume. + type: str sample: - attachments: [] availability_zone: nova @@ -52,25 +151,12 @@ volumes: created_at: '2017-11-15T10:51:19.000000' description: '' extended_replication_status: null + group_id: 402ac6ed-527f-4781-8484-7ff4467e34f5 host: null id: 103ac6ed-527f-4781-8484-7ff4467e34f5 image_id: null is_bootable: true is_encrypted: false - links: - - href: https://... - rel: self - - href: https://... - rel: bookmark - location: - cloud: cloud - project: - domain_id: null - domain_name: Default - id: cfe04702154742fc964d9403c691c76e - name: username - region_name: regionOne - zone: nova metadata: readonly: 'False' migration_id: null @@ -79,10 +165,13 @@ volumes: project_id: cab34702154a42fc96ed9403c691c76e replication_driver_data: null replication_status: disabled + scheduler_hints: {} size: 9 snapshot_id: null source_volume_id: null status: available + updated_at: '2017-11-15T10:51:19.000000' + user_id: ac303ed-527f-4781-8484-7ff4467e34f5 volume_image_metadata: checksum: a14e113deeee3a3392462f167ed28cb5 container_format: bare @@ -99,7 +188,7 @@ volumes: volume_type: null ''' -EXAMPLES = ''' +EXAMPLES = r''' - openstack.cloud.volume_info: - openstack.cloud.volume_info: @@ -110,7 +199,7 @@ EXAMPLES = ''' - openstack.cloud.volume_info: all_projects: true - details: true + details: false ''' from ansible_collections.openstack.cloud.plugins.module_utils.openstack import OpenStackModule @@ -119,25 +208,25 @@ from ansible_collections.openstack.cloud.plugins.module_utils.openstack import O class VolumeInfoModule(OpenStackModule): argument_spec = dict( + all_projects=dict(type='bool'), details=dict(type='bool'), - all_projects=dict(type='bool', min_ver='0.19'), name=dict(), status=dict(), ) + module_kwargs = dict( supports_check_mode=True ) def run(self): - kwargs = self.check_versioned( - details=self.params['details'], - name=self.params['name'], - all_projects=self.params['all_projects'], - status=self.params['status'], - ) - result = self.conn.block_storage.volumes(**kwargs) - result = [vol if isinstance(vol, dict) else vol.to_dict() for vol in result] - self.results.update({'volumes': result}) + kwargs = dict((k, self.params[k]) + for k in ['all_projects', 'details', 'name', 'status'] + if self.params[k] is not None) + + volumes = [v.to_dict(computed=False) + for v in self.conn.block_storage.volumes(**kwargs)] + + self.exit_json(changed=False, volumes=volumes) def main():