mirror of
https://opendev.org/openstack/ansible-collections-openstack.git
synced 2026-07-25 17:24:28 +00:00
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
641 lines
15 KiB
YAML
641 lines
15 KiB
YAML
---
|
|
# 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: "{{ 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 }}"
|
|
state: absent
|
|
loop: "{{ existing_ports.ports }}"
|
|
|
|
- name: Delete subnets before tests
|
|
openstack.cloud.subnet:
|
|
cloud: "{{ cloud }}"
|
|
state: absent
|
|
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: router
|
|
|
|
- name: Verify returned values
|
|
assert:
|
|
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 }}"
|
|
state: present
|
|
name: "{{ router_name }}"
|
|
interfaces:
|
|
- shade_subnet1
|
|
|
|
- name: Update router (add interface) again
|
|
openstack.cloud.router:
|
|
cloud: "{{ cloud }}"
|
|
state: present
|
|
name: "{{ router_name }}"
|
|
interfaces:
|
|
- shade_subnet1
|
|
register: router
|
|
|
|
- name: Assert idempotent module
|
|
assert:
|
|
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.interfaces_info|length) == 1
|
|
- info.routers.0.is_admin_state_up
|
|
|
|
- name: Verify existence of return values
|
|
assert:
|
|
that: item in info.routers[0]
|
|
loop: "{{ expected_fields + ['interfaces_info'] }}"
|
|
|
|
- name: Gather routers info with filters
|
|
openstack.cloud.routers_info:
|
|
cloud: "{{ cloud }}"
|
|
filters:
|
|
is_admin_state_up: true
|
|
name: "{{ router_name }}"
|
|
register: info
|
|
|
|
- name: Verify routers info with filters
|
|
assert:
|
|
that:
|
|
- 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:
|
|
cloud: "{{ cloud }}"
|
|
state: present
|
|
name: "{{ router_name }}"
|
|
interfaces:
|
|
- net: '{{ network_name }}'
|
|
subnet: shade_subnet2
|
|
portip: 10.8.8.1
|
|
- net: '{{ network_name }}'
|
|
subnet: shade_subnet3
|
|
- shade_subnet4
|
|
|
|
- name: Update router (change interfaces) again
|
|
openstack.cloud.router:
|
|
cloud: "{{ cloud }}"
|
|
state: present
|
|
name: "{{ router_name }}"
|
|
interfaces:
|
|
- net: '{{ network_name }}'
|
|
subnet: shade_subnet2
|
|
portip: 10.8.8.1
|
|
- net: '{{ network_name }}'
|
|
subnet: shade_subnet3
|
|
- shade_subnet4
|
|
register: router
|
|
|
|
- name: Assert idempotent module
|
|
assert:
|
|
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) == 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 interfaces)
|
|
openstack.cloud.router:
|
|
cloud: "{{ cloud }}"
|
|
state: present
|
|
name: "{{ router_name }}"
|
|
interfaces:
|
|
- shade_subnet4
|
|
|
|
- name: Update router (remove interfaces) again
|
|
openstack.cloud.router:
|
|
cloud: "{{ cloud }}"
|
|
state: present
|
|
name: "{{ router_name }}"
|
|
interfaces:
|
|
- shade_subnet4
|
|
register: router
|
|
|
|
- name: Assert idempotent module
|
|
assert:
|
|
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:
|
|
cloud: "{{ cloud }}"
|
|
name: "{{ router_name }}"
|
|
filters:
|
|
is_admin_state_up: true
|
|
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.0.ip_address == '10.7.7.1'
|
|
|
|
# Admin operation
|
|
- name: Create external network
|
|
openstack.cloud.network:
|
|
cloud: "{{ cloud }}"
|
|
state: present
|
|
name: "{{ external_network_name }}"
|
|
external: "{{ network_external }}"
|
|
when:
|
|
- network_external
|
|
|
|
- name: Create subnet5
|
|
openstack.cloud.subnet:
|
|
cloud: "{{ cloud }}"
|
|
state: present
|
|
network_name: "{{ external_network_name }}"
|
|
name: shade_subnet5
|
|
cidr: 10.6.6.0/24
|
|
when:
|
|
- network_external
|
|
|
|
- name: Update router (add external gateway)
|
|
openstack.cloud.router:
|
|
cloud: "{{ cloud }}"
|
|
state: present
|
|
name: "{{ router_name }}"
|
|
network: "{{ external_network_name }}"
|
|
interfaces:
|
|
- shade_subnet1
|
|
when:
|
|
- network_external
|
|
|
|
- name: Gather routers info
|
|
openstack.cloud.routers_info:
|
|
cloud: "{{ cloud }}"
|
|
name: "{{ router_name }}"
|
|
filters:
|
|
is_admin_state_up: true
|
|
register: info
|
|
|
|
- name: Verify routers info
|
|
assert:
|
|
that:
|
|
- info.routers.0.name == router_name
|
|
- (info.routers.0.interfaces_info|length) == 1
|
|
|
|
- name: Update router (change external fixed ips)
|
|
openstack.cloud.router:
|
|
cloud: "{{ cloud }}"
|
|
state: present
|
|
name: "{{ router_name }}"
|
|
interfaces:
|
|
- shade_subnet1
|
|
network: "{{ external_network_name }}"
|
|
external_fixed_ips:
|
|
- subnet: shade_subnet5
|
|
ip: 10.6.6.100
|
|
when:
|
|
- network_external
|
|
|
|
- name: Gather routers info
|
|
openstack.cloud.routers_info:
|
|
cloud: "{{ cloud }}"
|
|
name: "{{ router_name }}"
|
|
filters:
|
|
is_admin_state_up: true
|
|
register: info
|
|
|
|
- name: Verify routers info
|
|
assert:
|
|
that:
|
|
- 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
|
|
|
|
- name: Update router (add external fixed ips)
|
|
openstack.cloud.router:
|
|
cloud: "{{ cloud }}"
|
|
state: present
|
|
name: "{{ router_name }}"
|
|
interfaces:
|
|
- shade_subnet1
|
|
external_gateway_info:
|
|
network: "{{ external_network_name }}"
|
|
external_fixed_ips:
|
|
- subnet: shade_subnet5
|
|
ip: 10.6.6.100
|
|
- subnet: shade_subnet5
|
|
ip: 10.6.6.101
|
|
when:
|
|
- network_external
|
|
|
|
- name: Update router (add external fixed ips) again
|
|
openstack.cloud.router:
|
|
cloud: "{{ cloud }}"
|
|
state: present
|
|
name: "{{ router_name }}"
|
|
interfaces:
|
|
- shade_subnet1
|
|
network: "{{ external_network_name }}"
|
|
external_fixed_ips:
|
|
- subnet: shade_subnet5
|
|
ip: 10.6.6.100
|
|
- subnet: shade_subnet5
|
|
ip: 10.6.6.101
|
|
when:
|
|
- network_external
|
|
register: router
|
|
|
|
- name: Assert idempotent module
|
|
assert:
|
|
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: info
|
|
|
|
- name: Verify routers info
|
|
assert:
|
|
that:
|
|
- 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
|
|
|
|
- name: Update router (remove external fixed ips)
|
|
openstack.cloud.router:
|
|
cloud: "{{ cloud }}"
|
|
state: present
|
|
name: "{{ router_name }}"
|
|
interfaces:
|
|
- shade_subnet1
|
|
network: "{{ external_network_name }}"
|
|
external_fixed_ips:
|
|
- subnet: shade_subnet5
|
|
ip: 10.6.6.101
|
|
when:
|
|
- network_external
|
|
|
|
- name: Update router (remove external fixed ips) again
|
|
openstack.cloud.router:
|
|
cloud: "{{ cloud }}"
|
|
state: present
|
|
name: "{{ router_name }}"
|
|
interfaces:
|
|
- shade_subnet1
|
|
network: "{{ external_network_name }}"
|
|
external_fixed_ips:
|
|
- subnet: shade_subnet5
|
|
ip: 10.6.6.101
|
|
when:
|
|
- network_external
|
|
register: router
|
|
|
|
- name: Assert idempotent module
|
|
assert:
|
|
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: info
|
|
|
|
- name: Verify routers info
|
|
assert:
|
|
that:
|
|
- 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
|
|
|
|
- name: Update router (disable external snat)
|
|
openstack.cloud.router:
|
|
cloud: "{{ cloud }}"
|
|
state: present
|
|
name: "{{ router_name }}"
|
|
enable_snat: false
|
|
interfaces:
|
|
- shade_subnet1
|
|
network: "{{ external_network_name }}"
|
|
external_fixed_ips:
|
|
- subnet: shade_subnet5
|
|
ip: 10.6.6.101
|
|
when:
|
|
- network_external
|
|
|
|
- name: Gather routers info
|
|
openstack.cloud.routers_info:
|
|
cloud: "{{ cloud }}"
|
|
name: "{{ router_name }}"
|
|
filters:
|
|
is_admin_state_up: true
|
|
register: info
|
|
|
|
- name: Verify routers info
|
|
assert:
|
|
that:
|
|
- info.routers.0.name == router_name
|
|
- not info.routers.0.external_gateway_info.enable_snat
|
|
when:
|
|
- network_external
|
|
|
|
- name: Update router (disable external snat) again
|
|
openstack.cloud.router:
|
|
cloud: "{{ cloud }}"
|
|
state: present
|
|
name: "{{ router_name }}"
|
|
enable_snat: false
|
|
interfaces:
|
|
- shade_subnet1
|
|
network: "{{ external_network_name }}"
|
|
external_fixed_ips:
|
|
- subnet: shade_subnet5
|
|
ip: 10.6.6.101
|
|
when:
|
|
- network_external
|
|
register: router
|
|
|
|
- name: Assert idempotent module
|
|
assert:
|
|
that: router is not changed
|
|
|
|
- name: Delete router
|
|
openstack.cloud.router:
|
|
cloud: "{{ cloud }}"
|
|
state: absent
|
|
name: "{{ router_name }}"
|
|
|
|
- name: Delete router again
|
|
openstack.cloud.router:
|
|
cloud: "{{ cloud }}"
|
|
state: absent
|
|
name: "{{ router_name }}"
|
|
register: router
|
|
|
|
- name: Assert idempotent module
|
|
assert:
|
|
that: router is not changed
|
|
|
|
- name: Create router with simple interface
|
|
openstack.cloud.router:
|
|
cloud: "{{ cloud }}"
|
|
state: present
|
|
name: "{{ router_name }}"
|
|
interfaces:
|
|
- shade_subnet1
|
|
register: router
|
|
|
|
- name: Assert changed
|
|
assert:
|
|
that: router is changed
|
|
|
|
- name: Set portip in already assigned subnet
|
|
openstack.cloud.router:
|
|
cloud: "{{ cloud }}"
|
|
state: present
|
|
name: "{{ router_name }}"
|
|
interfaces:
|
|
- subnet: shade_subnet1
|
|
net: "{{ network_name }}"
|
|
portip: 10.7.7.42
|
|
register: router
|
|
|
|
- name: Assert changed
|
|
assert:
|
|
that: router is changed
|
|
|
|
- name: Gather routers info
|
|
openstack.cloud.routers_info:
|
|
cloud: "{{ cloud }}"
|
|
name: "{{ router_name }}"
|
|
register: info
|
|
|
|
- name: Verify routers info
|
|
assert:
|
|
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:
|
|
cloud: "{{ cloud }}"
|
|
state: present
|
|
name: "{{ router_name }}"
|
|
interfaces:
|
|
- subnet: shade_subnet1
|
|
net: "{{ network_name }}"
|
|
register: router
|
|
|
|
- name: Assert not changed
|
|
assert:
|
|
that: router is not changed
|
|
|
|
# Cleanup environment
|
|
|
|
- name: Delete router
|
|
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
|
|
openstack.cloud.port_info:
|
|
cloud: "{{ cloud }}"
|
|
filters:
|
|
network_id: "{{ networks.networks.0.id }}"
|
|
register: existing_ports
|
|
|
|
- name: Clean up ports
|
|
openstack.cloud.port:
|
|
cloud: "{{ cloud }}"
|
|
name: "{{ item.id }}"
|
|
state: absent
|
|
loop: "{{ existing_ports.ports }}"
|
|
|
|
- name: Delete subnet5
|
|
openstack.cloud.subnet:
|
|
cloud: "{{ cloud }}"
|
|
state: absent
|
|
name: shade_subnet5
|
|
when:
|
|
- network_external
|
|
|
|
- name: Delete subnets 1-4
|
|
openstack.cloud.subnet:
|
|
cloud: "{{ cloud }}"
|
|
state: absent
|
|
name: "{{ item.name }}"
|
|
loop: "{{ test_subnets }}"
|
|
|
|
- name: Delete internal network
|
|
openstack.cloud.network:
|
|
cloud: "{{ cloud }}"
|
|
state: absent
|
|
name: "{{ network_name }}"
|
|
|
|
- name: Delete external network
|
|
openstack.cloud.network:
|
|
cloud: "{{ cloud }}"
|
|
state: absent
|
|
name: "{{ external_network_name }}"
|
|
when:
|
|
- network_external
|