--- - name: Registering network names set_fact: nname_ipam_0: "{{ name_prefix ~ '-network-ipam-0' }}" nname_ipam_1: "{{ name_prefix ~ '-network-ipam-1' }}" nname_ipam_2: "{{ name_prefix ~ '-network-ipam-2' }}" nname_ipam_3: "{{ name_prefix ~ '-network-ipam-3' }}" - name: Registering network names set_fact: dnetworks: "{{ dnetworks + [nname_ipam_0, nname_ipam_1, nname_ipam_2, nname_ipam_3] }}" #################### Deprecated ipam_config #################### - name: Create network with ipam_config and deprecated ipam_options (conflicting) docker_network: name: "{{ nname_ipam_0 }}" ipam_options: subnet: 172.3.29.0/24 ipam_config: - subnet: 172.3.29.0/24 register: network ignore_errors: yes - assert: that: - network is failed - "network.msg == 'parameters are mutually exclusive: ipam_config|ipam_options'" - name: Create network with deprecated custom IPAM options docker_network: name: "{{ nname_ipam_0 }}" ipam_options: subnet: 172.3.29.0/24 gateway: 172.3.29.2 iprange: 172.3.29.0/26 aux_addresses: host1: 172.3.29.3 host2: 172.3.29.4 register: network - assert: that: - network is changed - name: Create network with deprecated custom IPAM options (idempotence) docker_network: name: "{{ nname_ipam_0 }}" ipam_options: subnet: 172.3.29.0/24 gateway: 172.3.29.2 iprange: 172.3.29.0/26 aux_addresses: host1: 172.3.29.3 host2: 172.3.29.4 register: network - assert: that: - network is not changed - name: Change of network created with deprecated custom IPAM options docker_network: name: "{{ nname_ipam_0 }}" ipam_options: subnet: 172.3.28.0/24 gateway: 172.3.28.2 iprange: 172.3.28.0/26 aux_addresses: host1: 172.3.28.3 register: network diff: yes - assert: that: - network is changed - network.diff.differences | length == 4 - '"ipam_config[0].subnet" in network.diff.differences' - '"ipam_config[0].gateway" in network.diff.differences' - '"ipam_config[0].iprange" in network.diff.differences' - '"ipam_config[0].aux_addresses" in network.diff.differences' - name: Remove gateway and iprange of network with deprecated custom IPAM options docker_network: name: "{{ nname_ipam_0 }}" ipam_options: subnet: 172.3.28.0/24 register: network - assert: that: - network is not changed - name: Cleanup network with deprecated custom IPAM options docker_network: name: "{{ nname_ipam_0 }}" state: absent #################### IPv4 IPAM config #################### - name: Create network with custom IPAM config docker_network: name: "{{ nname_ipam_1 }}" ipam_config: - subnet: 172.3.27.0/24 gateway: 172.3.27.2 iprange: 172.3.27.0/26 aux_addresses: host1: 172.3.27.3 host2: 172.3.27.4 register: network - assert: that: - network is changed - name: Create network with custom IPAM config (idempotence) docker_network: name: "{{ nname_ipam_1 }}" ipam_config: - subnet: 172.3.27.0/24 gateway: 172.3.27.2 iprange: 172.3.27.0/26 aux_addresses: host1: 172.3.27.3 host2: 172.3.27.4 register: network - assert: that: - network is not changed - name: Change of network created with custom IPAM config docker_network: name: "{{ nname_ipam_1 }}" ipam_config: - subnet: 172.3.28.0/24 gateway: 172.3.28.2 iprange: 172.3.28.0/26 aux_addresses: host1: 172.3.28.3 register: network diff: yes - assert: that: - network is changed - network.diff.differences | length == 4 - '"ipam_config[0].subnet" in network.diff.differences' - '"ipam_config[0].gateway" in network.diff.differences' - '"ipam_config[0].iprange" in network.diff.differences' - '"ipam_config[0].aux_addresses" in network.diff.differences' - name: Remove gateway and iprange of network with custom IPAM config docker_network: name: "{{ nname_ipam_1 }}" ipam_config: - subnet: 172.3.28.0/24 register: network - assert: that: - network is not changed - name: Cleanup network with custom IPAM config docker_network: name: "{{ nname_ipam_1 }}" state: absent #################### IPv6 IPAM config #################### - name: Create network with IPv6 IPAM config docker_network: name: "{{ nname_ipam_2 }}" enable_ipv6: yes ipam_config: - subnet: fdd1:ac8c:0557:7ce0::/64 register: network - assert: that: - network is changed - name: Create network with IPv6 IPAM config (idempotence) docker_network: name: "{{ nname_ipam_2 }}" enable_ipv6: yes ipam_config: - subnet: fdd1:ac8c:0557:7ce0::/64 register: network - assert: that: - network is not changed - name: Change subnet of network with IPv6 IPAM config docker_network: name: "{{ nname_ipam_2 }}" enable_ipv6: yes ipam_config: - subnet: fdd1:ac8c:0557:7ce1::/64 register: network diff: yes - assert: that: - network is changed - network.diff.differences | length == 1 - network.diff.differences[0] == "ipam_config[0].subnet" - name: Change subnet of network with IPv6 IPAM config docker_network: name: "{{ nname_ipam_2 }}" enable_ipv6: yes ipam_config: - subnet: "fdd1:ac8c:0557:7ce1::" register: network ignore_errors: yes - assert: that: - network is failed - "network.msg == '\"fdd1:ac8c:0557:7ce1::\" is not a valid CIDR'" - name: Cleanup network with IPv6 IPAM config docker_network: name: "{{ nname_ipam_2 }}" state: absent #################### IPv4 and IPv6 network #################### - name: Create network with IPv6 and custom IPv4 IPAM config docker_network: name: "{{ nname_ipam_3 }}" enable_ipv6: yes ipam_config: - subnet: 172.4.27.0/24 - subnet: fdd1:ac8c:0557:7ce2::/64 register: network - assert: that: - network is changed - name: Change subnet order of network with IPv6 and custom IPv4 IPAM config (idempotence) docker_network: name: "{{ nname_ipam_3 }}" enable_ipv6: yes ipam_config: - subnet: fdd1:ac8c:0557:7ce2::/64 - subnet: 172.4.27.0/24 register: network - assert: that: - network is not changed - name: Remove IPv6 from network with custom IPv4 and IPv6 IPAM config (change) docker_network: name: "{{ nname_ipam_3 }}" enable_ipv6: no ipam_config: - subnet: 172.4.27.0/24 register: network diff: yes - assert: that: - network is changed - network.diff.differences | length == 1 - network.diff.differences[0] == "enable_ipv6" - name: Cleanup network with IPv6 and custom IPv4 IPAM config docker_network: name: "{{ nname_ipam_3 }}" state: absent #################### multiple IPv4 networks #################### - block: - name: Create network with two IPv4 IPAM configs docker_network: name: "{{ nname_ipam_3 }}" driver: "macvlan" driver_options: parent: "{{ ansible_default_ipv4.alias }}" ipam_config: - subnet: 172.4.27.0/24 - subnet: 172.4.28.0/24 register: network - assert: that: - network is changed - name: Create network with two IPv4 IPAM configs (idempotence) docker_network: name: "{{ nname_ipam_3 }}" driver: "macvlan" driver_options: parent: "{{ ansible_default_ipv4.alias }}" ipam_config: - subnet: 172.4.28.0/24 - subnet: 172.4.27.0/24 register: network - assert: that: - network is not changed - name: Create network with two IPv4 IPAM configs (change) docker_network: name: "{{ nname_ipam_3 }}" driver: "macvlan" driver_options: parent: "{{ ansible_default_ipv4.alias }}" ipam_config: - subnet: 172.4.27.0/24 - subnet: 172.4.29.0/24 register: network diff: yes - assert: that: - network is changed - network.diff.differences | length == 1 - name: Create network with one IPv4 IPAM config (no change) docker_network: name: "{{ nname_ipam_3 }}" driver: "macvlan" driver_options: parent: "{{ ansible_default_ipv4.alias }}" ipam_config: - subnet: 172.4.29.0/24 register: network - assert: that: - network is not changed - name: Cleanup network docker_network: name: "{{ nname_ipam_3 }}" state: absent when: ansible_facts.virtualization_type != 'docker' #################### IPAM driver options #################### - name: Create network with IPAM driver options docker_network: name: "{{ nname_ipam_3 }}" ipam_driver: default ipam_driver_options: a: b register: network_1 ignore_errors: yes - name: Create network with IPAM driver options (idempotence) docker_network: name: "{{ nname_ipam_3 }}" ipam_driver: default ipam_driver_options: a: b diff: yes register: network_2 ignore_errors: yes - name: Create network with IPAM driver options (change) docker_network: name: "{{ nname_ipam_3 }}" ipam_driver: default ipam_driver_options: a: c diff: yes register: network_3 ignore_errors: yes - name: Cleanup network docker_network: name: "{{ nname_ipam_3 }}" state: absent - assert: that: - network_1 is changed - network_2 is not changed - network_3 is changed when: docker_py_version is version('2.0.0', '>=') - assert: that: - network_1 is failed - "('version is ' ~ docker_py_version ~ ' ') in network_1.msg" - "'Minimum version required is 2.0.0 ' in network_1.msg" when: docker_py_version is version('2.0.0', '<')