Refactored router module

Expanded and fixed module results docs.

Moved ext_ips_spec into the module class because global scope is not
necessary. Renamed it to external_fixed_ips_spec to explain its
purpose.

Sorted argument_spec and attribute docs by attribute name and fixed
indentations. Marked router attributes which cannot be updated.

Mark network attribute as required by enable_snat and
external_fixed_ips attributes. Fixed docstring of network attribute:
Module attribute interfaces does not require the network attribute,
its external_fixed_ips what requires network to be set.

Changed examples from deprecated ip to current ip_address attribute.

Dropped self.fail() calls and let openstacksdk handle missing networks,
subnets.. instead because less code means less code to maintain.

Limited line length to 80 chars to be consistent with other OpenStack
projects. Personally, I prefer a 120 chars limit but consistency is more
important.

Added explanation in code comment why we cannot update a router's name.

Moved upfront cleanup operations in router's integration tests to the
beginning of the role.

Assigned meaningful names to result variables
in router's ci role to easily identify which modules produced the
data.

Added tests for router ids, admin state and interfaces.

Change-Id: Icae77a43479fb4f0bae065d1c5d7942cb0f5fd6b
This commit is contained in:
Jakob Meng
2022-07-28 12:15:11 +02:00
parent d2eb98d048
commit fdc67892e3
2 changed files with 421 additions and 259 deletions

View File

@@ -1,27 +1,27 @@
---
# Regular user operation
- name: Create internal network
openstack.cloud.network:
cloud: "{{ cloud }}"
state: present
name: "{{ network_name }}"
external: false
register: internal_net
# Ensure clean environment
- name: Ensure router doesn't exist before tests
openstack.cloud.router:
cloud: "{{ cloud }}"
state: absent
name: "{{ router_name }}"
- name: Find network
openstack.cloud.networks_info:
cloud: "{{ cloud }}"
name: "{{ network_name }}"
register: networks
- name: Get ports in internal network
when: networks.networks|length > 0
openstack.cloud.port_info:
cloud: "{{ cloud }}"
filters:
network_id: "{{ internal_net.id }}"
network_id: "{{ networks.networks.0.id }}"
register: existing_ports
- name: Ensure ports don't exist before tests
when: networks.networks|length > 0
openstack.cloud.port:
cloud: "{{ cloud }}"
name: "{{ item.id }}"
@@ -35,23 +35,49 @@
name: "{{ item.name }}"
loop: "{{ test_subnets }}"
# Regular user operation
- name: Create internal network
openstack.cloud.network:
cloud: "{{ cloud }}"
state: present
name: "{{ network_name }}"
external: false
- name: Create subnets 1-4
openstack.cloud.subnet: "{{ item }}"
loop: "{{ test_subnets }}"
- name: Ensure router doesn't exist before tests
openstack.cloud.router:
cloud: "{{ cloud }}"
state: absent
name: "{{ router_name }}"
- name: Create router
openstack.cloud.router:
cloud: "{{ cloud }}"
state: present
name: "{{ router_name }}"
register: result
register: router
- name: Verify returned values
assert:
that:
- item in result.router
that: item in router.router
loop: "{{ expected_fields }}"
- name: Gather routers info
openstack.cloud.routers_info:
cloud: "{{ cloud }}"
name: "{{ router_name }}"
register: info
- name: Verify routers info
assert:
that:
- info.routers.0.name == router_name
- (info.routers.0.interfaces_info|length) == 0
- info.routers.0.is_admin_state_up
- name: Update router (add interface)
openstack.cloud.router:
cloud: "{{ cloud }}"
@@ -67,45 +93,56 @@
name: "{{ router_name }}"
interfaces:
- shade_subnet1
register: result
register: router
- name: Assert idempotent module
assert:
that: result is not changed
that: router is not changed
- name: Gather routers info
openstack.cloud.routers_info:
cloud: "{{ cloud }}"
name: "{{ router_name }}"
filters:
admin_state_up: true
register: result
register: info
- name: Verify routers info
assert:
that:
- "result.routers.0.name == router_name"
- (result.routers.0.interfaces_info|length) == 1
- info.routers.0.name == router_name
- (info.routers.0.interfaces_info|length) == 1
- info.routers.0.is_admin_state_up
- name: Verify existence of return values
assert:
that:
- item in result.routers[0]
that: item in info.routers[0]
loop: "{{ expected_fields + ['interfaces_info'] }}"
- name: Gather routers info with filters
openstack.cloud.routers_info:
cloud: "{{ cloud }}"
filters:
admin_state_up: true
is_admin_state_up: true
name: "{{ router_name }}"
register: result_filter
register: info
- name: Verify routers info with filter
- name: Verify routers info with filters
assert:
that:
- "result_filter.routers.0.name == router_name"
- (result_filter.routers.0.interfaces_info|length) == 1
- info.routers.0.name == router_name
- info.routers.0.id == router.router.id
- (info.routers.0.interfaces_info|length) == 1
- name: Gather routers info with other filters
openstack.cloud.routers_info:
cloud: "{{ cloud }}"
filters:
is_admin_state_up: false
name: "{{ router_name }}"
register: info
- name: Verify routers info with other filters
assert:
that: info.routers == []
- name: Update router (change interfaces)
openstack.cloud.router:
@@ -132,52 +169,101 @@
- net: '{{ network_name }}'
subnet: shade_subnet3
- shade_subnet4
register: result
register: router
- name: Assert idempotent module
assert:
that: result is not changed
that: router is not changed
- name: Gather routers info
openstack.cloud.routers_info:
cloud: "{{ cloud }}"
name: "{{ router_name }}"
filters:
is_admin_state_up: true
register: result
register: info
- name: Verify routers info
assert:
that:
- "result.routers.0.name == router_name"
- (result.routers.0.interfaces_info|length) == 3
- result.routers.0.interfaces_info|map(attribute='ip_address')|sort|list ==
- info.routers.0.name == router_name
- info.routers.0.id == router.router.id
- (info.routers.0.interfaces_info|length) == 3
- info.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)
- name: Update router (remove interfaces)
openstack.cloud.router:
cloud: "{{ cloud }}"
state: present
name: "{{ router_name }}"
interfaces:
- net: '{{ network_name }}'
subnet: shade_subnet1
portip: 10.7.7.1
- shade_subnet4
- name: Update router (remove interface) again
- name: Update router (remove interfaces) again
openstack.cloud.router:
cloud: "{{ cloud }}"
state: present
name: "{{ router_name }}"
interfaces:
- net: '{{ network_name }}'
subnet: shade_subnet1
portip: 10.7.7.1
register: result
- shade_subnet4
register: router
- name: Assert idempotent module
assert:
that: result is not changed
that: router is not changed
- name: Gather routers info
openstack.cloud.routers_info:
cloud: "{{ cloud }}"
name: "{{ router_name }}"
register: info
- name: Verify routers info
assert:
that:
- info.routers.0.name == router_name
- info.routers.0.id == router.router.id
- (info.routers.0.interfaces_info|length) == 1
- info.routers.0.interfaces_info|map(attribute='ip_address')|sort|list ==
['10.10.10.1']
- name: Update router (replace interfaces)
openstack.cloud.router:
cloud: "{{ cloud }}"
state: present
name: "{{ router_name }}"
interfaces:
- net: '{{ network_name }}'
subnet: shade_subnet1
portip: 10.7.7.1
- name: Gather routers info
openstack.cloud.routers_info:
cloud: "{{ cloud }}"
name: "{{ router_name }}"
register: info
- name: Verify routers info
assert:
that:
- info.routers.0.name == router_name
- (info.routers.0.interfaces_info|length) == 1
- info.routers.0.interfaces_info|map(attribute='ip_address')|sort|list ==
['10.7.7.1']
- name: Update router (replace interfaces) again
openstack.cloud.router:
cloud: "{{ cloud }}"
state: present
name: "{{ router_name }}"
interfaces:
- net: '{{ network_name }}'
subnet: shade_subnet1
portip: 10.7.7.1
register: router
- name: Assert idempotent module
assert:
that: router is not changed
- name: Gather routers info
openstack.cloud.routers_info:
@@ -185,14 +271,14 @@
name: "{{ router_name }}"
filters:
is_admin_state_up: true
register: result
register: info
- name: Verify routers info
assert:
that:
- "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'
- info.routers.0.name == router_name
- (info.routers.0.interfaces_info|length) == 1
- info.routers.0.interfaces_info.0.ip_address == '10.7.7.1'
# Admin operation
- name: Create external network
@@ -230,14 +316,14 @@
cloud: "{{ cloud }}"
name: "{{ router_name }}"
filters:
admin_state_up: true
register: result
is_admin_state_up: true
register: info
- name: Verify routers info
assert:
that:
- "result.routers.0.name == router_name"
- (result.routers.0.interfaces_info|length) == 1
- info.routers.0.name == router_name
- (info.routers.0.interfaces_info|length) == 1
- name: Update router (change external fixed ips)
openstack.cloud.router:
@@ -258,15 +344,15 @@
cloud: "{{ cloud }}"
name: "{{ router_name }}"
filters:
admin_state_up: true
register: result
is_admin_state_up: true
register: info
- name: Verify routers info
assert:
that:
- "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"
- info.routers.0.name == router_name
- (info.routers.0.external_gateway_info.external_fixed_ips|length) == 1
- info.routers.0.external_gateway_info.external_fixed_ips.0.ip_address == "10.6.6.100"
when:
- network_external
@@ -302,26 +388,26 @@
ip: 10.6.6.101
when:
- network_external
register: result
register: router
- name: Assert idempotent module
assert:
that: result is not changed
that: router is not changed
- name: Gather routers info
openstack.cloud.routers_info:
cloud: "{{ cloud }}"
name: "{{ router_name }}"
filters:
admin_state_up: true
register: result
is_admin_state_up: true
register: info
- name: Verify routers info
assert:
that:
- "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 ==
- info.routers.0.name == router_name
- (info.routers.0.external_gateway_info.external_fixed_ips|length) == 2
- info.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
@@ -353,26 +439,26 @@
ip: 10.6.6.101
when:
- network_external
register: result
register: router
- name: Assert idempotent module
assert:
that: result is not changed
that: router is not changed
- name: Gather routers info
openstack.cloud.routers_info:
cloud: "{{ cloud }}"
name: "{{ router_name }}"
filters:
admin_state_up: true
register: result
is_admin_state_up: true
register: info
- name: Verify routers info
assert:
that:
- "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"
- info.routers.0.name == router_name
- (info.routers.0.external_gateway_info.external_fixed_ips|length) == 1
- info.routers.0.external_gateway_info.external_fixed_ips.0.ip_address == "10.6.6.101"
when:
- network_external
@@ -390,20 +476,20 @@
ip: 10.6.6.101
when:
- network_external
register: result
- name: Gather routers info
openstack.cloud.routers_info:
cloud: "{{ cloud }}"
name: "{{ router_name }}"
filters:
admin_state_up: true
register: result
is_admin_state_up: true
register: info
- name: Verify routers info
assert:
that:
- "result.routers.0.name == router_name"
- "not result.routers.0.external_gateway_info.enable_snat"
- info.routers.0.name == router_name
- not info.routers.0.external_gateway_info.enable_snat
when:
- network_external
@@ -421,11 +507,11 @@
ip: 10.6.6.101
when:
- network_external
register: result
register: router
- name: Assert idempotent module
assert:
that: result is not changed
that: router is not changed
- name: Delete router
openstack.cloud.router:
@@ -438,11 +524,11 @@
cloud: "{{ cloud }}"
state: absent
name: "{{ router_name }}"
register: result
register: router
- name: Assert idempotent module
assert:
that: result is not changed
that: router is not changed
- name: Create router with simple interface
openstack.cloud.router:
@@ -451,11 +537,11 @@
name: "{{ router_name }}"
interfaces:
- shade_subnet1
register: result
register: router
- name: Assert changed
assert:
that: result is changed
that: router is changed
- name: Set portip in already assigned subnet
openstack.cloud.router:
@@ -466,21 +552,21 @@
- subnet: shade_subnet1
net: "{{ network_name }}"
portip: 10.7.7.42
register: result
register: router
- name: Assert changed
assert:
that: result is changed
that: router is changed
- name: Gather routers info
openstack.cloud.routers_info:
cloud: "{{ cloud }}"
name: "{{ router_name }}"
register: result
register: info
- name: Verify routers info
assert:
that: "'10.7.7.42' in result.routers[0].interfaces_info|map(attribute='ip_address')"
that: "'10.7.7.42' in info.routers[0].interfaces_info|map(attribute='ip_address')"
- name: Unset portip in already assigned subnet
openstack.cloud.router:
@@ -488,13 +574,15 @@
state: present
name: "{{ router_name }}"
interfaces:
- subnet: shade_subnet1
net: "{{ network_name }}"
register: result
- subnet: shade_subnet1
net: "{{ network_name }}"
register: router
- name: Assert not changed
assert:
that: result is not changed
that: router is not changed
# Cleanup environment
- name: Delete router
openstack.cloud.router:
@@ -502,11 +590,17 @@
state: absent
name: "{{ router_name }}"
- name: Find network
openstack.cloud.networks_info:
cloud: "{{ cloud }}"
name: "{{ network_name }}"
register: networks
- name: Get ports in internal network
openstack.cloud.port_info:
cloud: "{{ cloud }}"
filters:
network_id: "{{ internal_net.id }}"
network_id: "{{ networks.networks.0.id }}"
register: existing_ports
- name: Clean up ports