From a120db2d60a09a359c57cf4e9ddfbaaa60006408 Mon Sep 17 00:00:00 2001 From: Arx Cruz Date: Tue, 19 Apr 2022 13:17:08 +0200 Subject: [PATCH] Update routers_info for the new SDK Make routers_info module compatible with the new sdk 1.0.0 Change-Id: I43ea8ccc0d882ca63bc294dd99fb4f010f3806a5 --- .zuul.yaml | 2 +- ci/roles/router/defaults/main.yml | 20 +++++++ ci/roles/router/tasks/main.yml | 62 ++++++++++++------- plugins/modules/routers_info.py | 99 +++++++++++++++++++++++-------- 4 files changed, 135 insertions(+), 48 deletions(-) diff --git a/.zuul.yaml b/.zuul.yaml index 11b233a7..fdcd314a 100644 --- a/.zuul.yaml +++ b/.zuul.yaml @@ -99,6 +99,7 @@ project_info recordset role_assignment + router security_group security_group_rule subnet @@ -111,7 +112,6 @@ # floating_ip # orchestrate # neutron_rbac - # router # server - job: diff --git a/ci/roles/router/defaults/main.yml b/ci/roles/router/defaults/main.yml index f7d53933..c6c56c45 100644 --- a/ci/roles/router/defaults/main.yml +++ b/ci/roles/router/defaults/main.yml @@ -1,3 +1,23 @@ +expected_fields: + - availability_zone_hints + - availability_zones + - created_at + - description + - external_gateway_info + - flavor_id + - id + - interfaces_info + - is_admin_state_up + - is_distributed + - is_ha + - name + - project_id + - revision_number + - routes + - status + - tags + - tenant_id + - updated_at external_network_name: ansible_external_net network_external: true router_name: ansible_router diff --git a/ci/roles/router/tasks/main.yml b/ci/roles/router/tasks/main.yml index 5da51b73..991b82ce 100644 --- a/ci/roles/router/tasks/main.yml +++ b/ci/roles/router/tasks/main.yml @@ -77,8 +77,28 @@ - name: Verify routers info assert: that: - - "result.openstack_routers.0.name == router_name" - - (result.openstack_routers.0.interfaces_info|length) == 1 + - "result.routers.0.name == router_name" + - (result.routers.0.interfaces_info|length) == 1 + +- name: Gather routers info with filters + openstack.cloud.routers_info: + cloud: "{{ cloud }}" + filters: + admin_state_up: true + name: "{{ router_name }}" + register: result_filter + +- name: Verify routers info with filter + assert: + that: + - "result_filter.routers.0.name == router_name" + - (result_filter.routers.0.interfaces_info|length) == 1 + +- name: Verify returned values + assert: + that: + - item in result.routers[0] + loop: '{{ expected_fields }}' - name: Update router (change interfaces) openstack.cloud.router: @@ -116,15 +136,15 @@ cloud: "{{ cloud }}" name: "{{ router_name }}" filters: - admin_state_up: true + is_admin_state_up: true register: result - name: Verify routers info assert: that: - - "result.openstack_routers.0.name == router_name" - - (result.openstack_routers.0.interfaces_info|length) == 3 - - result.openstack_routers.0.interfaces_info|map(attribute='ip_address')|sort|list == + - "result.routers.0.name == router_name" + - (result.routers.0.interfaces_info|length) == 3 + - result.routers.0.interfaces_info|map(attribute='ip_address')|sort|list == ['10.10.10.1', '10.8.8.1', '10.9.9.1'] - name: Update router (remove interface) @@ -157,15 +177,15 @@ cloud: "{{ cloud }}" name: "{{ router_name }}" filters: - admin_state_up: true + is_admin_state_up: true register: result - name: Verify routers info assert: that: - - "result.openstack_routers.0.name == router_name" - - (result.openstack_routers.0.interfaces_info|length) == 1 - - result.openstack_routers.0.interfaces_info.0.ip_address == '10.7.7.1' + - "result.routers.0.name == router_name" + - (result.routers.0.interfaces_info|length) == 1 + - result.routers.0.interfaces_info.0.ip_address == '10.7.7.1' # Admin operation - name: Create external network @@ -209,8 +229,8 @@ - name: Verify routers info assert: that: - - "result.openstack_routers.0.name == router_name" - - (result.openstack_routers.0.interfaces_info|length) == 1 + - "result.routers.0.name == router_name" + - (result.routers.0.interfaces_info|length) == 1 - name: Update router (change external fixed ips) openstack.cloud.router: @@ -237,9 +257,9 @@ - name: Verify routers info assert: that: - - "result.openstack_routers.0.name == router_name" - - (result.openstack_routers.0.external_gateway_info.external_fixed_ips|length) == 1 - - result.openstack_routers.0.external_gateway_info.external_fixed_ips.0.ip_address == "10.6.6.100" + - "result.routers.0.name == router_name" + - (result.routers.0.external_gateway_info.external_fixed_ips|length) == 1 + - result.routers.0.external_gateway_info.external_fixed_ips.0.ip_address == "10.6.6.100" when: - network_external @@ -291,9 +311,9 @@ - name: Verify routers info assert: that: - - "result.openstack_routers.0.name == router_name" - - (result.openstack_routers.0.external_gateway_info.external_fixed_ips|length) == 2 - - result.openstack_routers.0.external_gateway_info.external_fixed_ips|map(attribute='ip_address')|sort|list == + - "result.routers.0.name == router_name" + - (result.routers.0.external_gateway_info.external_fixed_ips|length) == 2 + - result.routers.0.external_gateway_info.external_fixed_ips|map(attribute='ip_address')|sort|list == ["10.6.6.100", "10.6.6.101"] when: - network_external @@ -342,9 +362,9 @@ - name: Verify routers info assert: that: - - "result.openstack_routers.0.name == router_name" - - (result.openstack_routers.0.external_gateway_info.external_fixed_ips|length) == 1 - - result.openstack_routers.0.external_gateway_info.external_fixed_ips.0.ip_address == "10.6.6.101" + - "result.routers.0.name == router_name" + - (result.routers.0.external_gateway_info.external_fixed_ips|length) == 1 + - result.routers.0.external_gateway_info.external_fixed_ips.0.ip_address == "10.6.6.101" when: - network_external diff --git a/plugins/modules/routers_info.py b/plugins/modules/routers_info.py index 990eef8d..a2b4f8db 100644 --- a/plugins/modules/routers_info.py +++ b/plugins/modules/routers_info.py @@ -37,7 +37,7 @@ options: description: - Filter the list result by the human-readable description of the resource. type: str - admin_state_up: + is_admin_state_up: description: - Filter the list result by the administrative state of the resource, which is up (true) or down (false). type: bool @@ -69,7 +69,7 @@ EXAMPLES = ''' - name: Show openstack routers debug: - msg: "{{ result.openstack_routers }}" + msg: "{{ result.routers }}" - name: Gather information about a router by name openstack.cloud.routers_info: @@ -83,7 +83,7 @@ EXAMPLES = ''' - name: Show openstack routers debug: - msg: "{{ result.openstack_routers }}" + msg: "{{ result.routers }}" - name: Gather information about a router with filter openstack.cloud.routers_info: @@ -93,56 +93,97 @@ EXAMPLES = ''' password: password project_name: someproject filters: - tenant_id: bc3ea709c96849d6b81f54640400a19f + is_admin_state_up: True register: result - name: Show openstack routers debug: - msg: "{{ result.openstack_routers }}" + msg: "{{ result.routers }}" ''' RETURN = ''' -openstack_routers: +routers: description: has all the openstack information about the routers returned: always, but can be null - type: complex + type: list + elements: dict contains: - id: - description: Unique UUID. + availability_zones: + description: Availability zones + returned: success + type: list + availability_zone_hints: + description: Availability zone hints + returned: success + type: list + created_at: + description: Date and time when the router was created returned: success type: str - name: - description: Name given to the router. - returned: success - type: str - status: - description: Router status. + description: + description: Description notes of the router returned: success type: str external_gateway_info: description: The external gateway information of the router. returned: success type: dict + flavor_id: + description: ID of the flavor of the router + returned: success + type: str + id: + description: Unique UUID. + returned: success + type: str interfaces_info: description: List of connected interfaces. returned: success type: list - distributed: + is_admin_state_up: + description: Network administrative state + returned: success + type: bool + is_distributed: description: Indicates a distributed router. returned: success type: bool - ha: + is_ha: description: Indicates a highly-available router. returned: success type: bool + name: + description: Name given to the router. + returned: success + type: str project_id: description: Project id associated with this router. returned: success type: str + revision_number: + description: Revision number + returned: success + type: int routes: description: The extra routes configuration for L3 router. returned: success type: list + status: + description: Router status. + returned: success + type: str + tags: + description: List of tags + returned: success + type: list + tenant_id: + description: Owner tenant ID + returned: success + type: str + updated_at: + description: Date of last update on the router + returned: success + type: str ''' from ansible_collections.openstack.cloud.plugins.module_utils.openstack import OpenStackModule @@ -154,24 +195,30 @@ class RouterInfoModule(OpenStackModule): argument_spec = dict( name=dict(required=False, default=None), - filters=dict(required=False, type='dict', default=None) + filters=dict(required=False, type='dict', default={}) ) module_kwargs = dict( supports_check_mode=True ) def run(self): + routers = self.conn.search_routers(name_or_id=self.params['name'], + filters=self.params['filters']) - kwargs = self.check_versioned( - filters=self.params['filters'] - ) - if self.params['name']: - kwargs['name_or_id'] = self.params['name'] - routers = self.conn.search_routers(**kwargs) + routers = [r.to_dict(computed=False) for r in routers] + # The following code replicates self.conn.list_router_interfaces() + # but only uses a single api call per router instead of four api + # calls as the former does. + allowed_device_owners = ('network:router_interface', + 'network_router_interface_distributed', + 'network:ha_router_replicated_interface', + 'network:router_gateway') for router in routers: interfaces_info = [] - for port in self.conn.list_router_interfaces(router): + for port in self.conn.network.ports(device_id=router['id']): + if port.device_owner not in allowed_device_owners: + continue if port.device_owner != "network:router_gateway": for ip_spec in port.fixed_ips: int_info = { @@ -182,7 +229,7 @@ class RouterInfoModule(OpenStackModule): interfaces_info.append(int_info) router['interfaces_info'] = interfaces_info - self.exit(changed=False, openstack_routers=routers) + self.exit(changed=False, routers=routers) def main():