From 0c75f19e4c7949e99450b515b3e769efc4febca6 Mon Sep 17 00:00:00 2001 From: Jakob Meng Date: Fri, 13 Jan 2023 09:04:50 +0100 Subject: [PATCH] Refactored compute_flavor_info module Change-Id: Ic598a60c2dd6fb465965fa8beee0ea973385bbcf --- ci/roles/compute_flavor/tasks/main.yml | 6 +- plugins/modules/compute_flavor_info.py | 285 +++++++++++-------------- 2 files changed, 123 insertions(+), 168 deletions(-) diff --git a/ci/roles/compute_flavor/tasks/main.yml b/ci/roles/compute_flavor/tasks/main.yml index 95b0855e..c9a2c26a 100644 --- a/ci/roles/compute_flavor/tasks/main.yml +++ b/ci/roles/compute_flavor/tasks/main.yml @@ -238,7 +238,7 @@ register: flavor_info - assert: - that: item in flavor_info.openstack_flavors[0] + that: item in flavor_info.flavors[0] loop: "{{ expected_fields }}" - name: List flavors with filter @@ -250,5 +250,5 @@ - name: Check output of list flavors with filter assert: that: - - flavor.openstack_flavors | length == 1 - - flavor.openstack_flavors.0.name == "m1.tiny" + - flavor.flavors | length == 1 + - flavor.flavors.0.name == "m1.tiny" diff --git a/plugins/modules/compute_flavor_info.py b/plugins/modules/compute_flavor_info.py index 4321d656..d9a62943 100644 --- a/plugins/modules/compute_flavor_info.py +++ b/plugins/modules/compute_flavor_info.py @@ -4,185 +4,155 @@ # Copyright (c) 2015 IBM # GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) -DOCUMENTATION = ''' +DOCUMENTATION = r''' --- module: compute_flavor_info -short_description: Retrieve information about one or more flavors +short_description: Fetch compute flavors from OpenStack cloud author: OpenStack Ansible SIG description: - - Retrieve information about available OpenStack instance flavors. By default, - information about ALL flavors are retrieved. Filters can be applied to get - information for only matching flavors. For example, you can filter on the - amount of RAM available to the flavor, or the number of virtual CPUs - available to the flavor, or both. When specifying multiple filters, - *ALL* filters must match on a flavor before that flavor is returned as - a fact. -notes: - - The result contains a list of unsorted flavors. + - Fetch OpenStack compute flavors. options: - name: - description: - - A flavor name. Cannot be used with I(ram) or I(vcpus) or I(ephemeral). - type: str - ram: - description: - - "A string used for filtering flavors based on the amount of RAM + ephemeral: + description: + - Filter flavors based on the amount of ephemeral storage. + - I(ephemeral) supports same format as I(ram) option. + type: str + limit: + description: + - Limits number of flavors to I(limit) results. + - By default all matching flavors are returned. + type: int + name: + description: + - Flavor name. + type: str + ram: + description: + - "A string used for filtering flavors based on the amount of RAM (in MB) desired. This string accepts the following special values: 'MIN' (return flavors with the minimum amount of RAM), and 'MAX' (return flavors with the maximum amount of RAM)." - - - "A specific amount of RAM may also be specified. Any flavors with this + - "A specific amount of RAM may also be specified. Any flavors with this exact amount of RAM will be returned." - - - "A range of acceptable RAM may be given using a special syntax. Simply + - "A range of acceptable RAM may be given using a special syntax. Simply prefix the amount of RAM with one of these acceptable range values: '<', '>', '<=', '>='. These values represent less than, greater than, less than or equal to, and greater than or equal to, respectively." - type: str - vcpus: - description: - - A string used for filtering flavors based on the number of virtual - CPUs desired. Format is the same as the I(ram) parameter. - type: str - limit: - description: - - Limits the number of flavors returned. All matching flavors are - returned by default. - type: int - ephemeral: - description: - - A string used for filtering flavors based on the amount of ephemeral - storage. Format is the same as the I(ram) parameter - type: str + type: str + vcpus: + description: + - Filter flavors based on the number of virtual CPUs. + - I(vcpus) supports same format as I(ram) option. + type: str requirements: - - "python >= 3.6" - - "openstacksdk" - + - "python >= 3.6" + - "openstacksdk" extends_documentation_fragment: -- openstack.cloud.openstack + - openstack.cloud.openstack ''' -EXAMPLES = ''' -# Gather information about all available flavors -- openstack.cloud.compute_flavor_info: +EXAMPLES = r''' +- name: Gather information about all available flavors + openstack.cloud.compute_flavor_info: cloud: mycloud - register: result -- debug: - msg: "{{ result.openstack_flavors }}" - -# Gather information for the flavor named "xlarge-flavor" -- openstack.cloud.compute_flavor_info: +- name: Gather information for the flavor named "xlarge-flavor" + openstack.cloud.compute_flavor_info: cloud: mycloud name: "xlarge-flavor" -# Get all flavors that have exactly 512 MB of RAM. -- openstack.cloud.compute_flavor_info: +- name: Get all flavors with 512 MB of RAM + openstack.cloud.compute_flavor_info: cloud: mycloud ram: "512" -# Get all flavors that have 1024 MB or more of RAM. -- openstack.cloud.compute_flavor_info: +- name: Get all flavors with >= 1024 MB RAM + openstack.cloud.compute_flavor_info: cloud: mycloud ram: ">=1024" -# Get a single flavor that has the minimum amount of RAM. Using the 'limit' -# option will guarantee only a single flavor is returned. -- openstack.cloud.compute_flavor_info: +- name: Get a single flavor with minimum amount of RAM + openstack.cloud.compute_flavor_info: cloud: mycloud ram: "MIN" limit: 1 -# Get all flavors with 1024 MB of RAM or more, AND exactly 2 virtual CPUs. -- openstack.cloud.compute_flavor_info: +- name: Get all flavors with >=1024 MB RAM and 2 vCPUs + openstack.cloud.compute_flavor_info: cloud: mycloud ram: ">=1024" vcpus: "2" -# Get all flavors with 1024 MB of RAM or more, exactly 2 virtual CPUs, and -# less than 30gb of ephemeral storage. -- openstack.cloud.compute_flavor_info: +- name: Get flavors with >= 1024 MB RAM 2 vCPUs and < 30gb ephemeral storage + openstack.cloud.compute_flavor_info: cloud: mycloud ram: ">=1024" vcpus: "2" ephemeral: "<30" ''' - -RETURN = ''' -openstack_flavors: - description: Dictionary describing the flavors. - returned: On success. - type: complex - contains: - id: - description: Flavor ID. - returned: success - type: str - sample: "515256b8-7027-4d73-aa54-4e30a4a4a339" - name: - description: Flavor name. - returned: success - type: str - sample: "tiny" - original_name: - description: Original flavor name - returned: success - type: str - sample: "tiny" - description: - description: Description of the flavor - returned: success - type: str - sample: "Small flavor" - is_disabled: - description: Wether the flavor is enabled or not - returned: success - type: bool - sample: False - rxtx_factor: - description: Factor to be multiplied by the rxtx_base property of - the network it is attached to in order to have a - different bandwidth cap. - returned: success - type: float - sample: 1.0 - extra_specs: - description: Optional parameters to configure different flavors - options. - returned: success - type: dict - sample: "{'hw_rng:allowed': True}" - disk: - description: Size of local disk, in GB. - returned: success - type: int - sample: 10 - ephemeral: - description: Ephemeral space size, in GB. - returned: success - type: int - sample: 10 - ram: - description: Amount of memory, in MB. - returned: success - type: int - sample: 1024 - swap: - description: Swap space size, in MB. - returned: success - type: int - sample: 100 - vcpus: - description: Number of virtual CPUs. - returned: success - type: int - sample: 2 - is_public: - description: Make flavor accessible to the public. - returned: success - type: bool - sample: true +RETURN = r''' +flavors: + description: List of dictionaries describing the compute flavors. + returned: always + type: list + elements: dict + contains: + description: + description: Description of the flavor + type: str + sample: "Small flavor" + disk: + description: Size of local disk, in GB. + type: int + sample: 10 + ephemeral: + description: Ephemeral space size, in GB. + type: int + sample: 10 + extra_specs: + description: Optional parameters to configure different flavors + options. + type: dict + sample: "{'hw_rng:allowed': True}" + id: + description: Flavor ID. + type: str + sample: "515256b8-7027-4d73-aa54-4e30a4a4a339" + is_disabled: + description: Wether the flavor is enabled or not + type: bool + sample: False + is_public: + description: Make flavor accessible to the public. + type: bool + sample: true + name: + description: Flavor name. + type: str + sample: "tiny" + original_name: + description: Original flavor name + type: str + sample: "tiny" + ram: + description: Amount of memory, in MB. + type: int + sample: 1024 + rxtx_factor: + description: Factor to be multiplied by the rxtx_base property of + the network it is attached to in order to have a + different bandwidth cap. + type: float + sample: 1.0 + swap: + description: Swap space size, in MB. + type: int + sample: 100 + vcpus: + description: Number of virtual CPUs. + type: int + sample: 2 ''' from ansible_collections.openstack.cloud.plugins.module_utils.openstack import OpenStackModule @@ -190,54 +160,39 @@ from ansible_collections.openstack.cloud.plugins.module_utils.openstack import O class ComputeFlavorInfoModule(OpenStackModule): argument_spec = dict( + ephemeral=dict(), + limit=dict(type='int'), name=dict(), ram=dict(), vcpus=dict(), - limit=dict(type='int'), - ephemeral=dict(), ) + module_kwargs = dict( - mutually_exclusive=[ - ['name', 'ram'], - ['name', 'vcpus'], - ['name', 'ephemeral'] - ], supports_check_mode=True ) def run(self): name = self.params['name'] - vcpus = self.params['vcpus'] - ram = self.params['ram'] - ephemeral = self.params['ephemeral'] - limit = self.params['limit'] - filters = {} - if vcpus: - filters['vcpus'] = vcpus - if ram: - filters['ram'] = ram - if ephemeral: - filters['ephemeral'] = ephemeral + filters = dict((k, self.params[k]) + for k in ['ephemeral', 'ram', 'vcpus'] + if self.params[k] is not None) if name: - # extra_specs are exposed in the flavor representation since Rocky, so we do not - # need get_extra_specs=True which is not available in OpenStack SDK 0.36 (Train) - # Ref.: https://docs.openstack.org/nova/latest/reference/api-microversion-history.html flavor = self.conn.compute.find_flavor(name) flavors = [flavor] if flavor else [] - else: flavors = list(self.conn.compute.flavors()) - if filters: - flavors = self.conn.range_search(flavors, filters) + if filters: + flavors = self.conn.range_search(flavors, filters) + + limit = self.params['limit'] if limit is not None: flavors = flavors[:limit] - # Transform entries to dict - flavors = [flavor.to_dict(computed=False) for flavor in flavors] - self.exit_json(changed=False, openstack_flavors=flavors) + self.exit_json(changed=False, + flavors=[f.to_dict(computed=False) for f in flavors]) def main():