1
0
Fork 0
mirror of https://github.com/ansible-collections/community.general.git synced 2024-09-14 20:13:21 +02:00

docker_network: add IPAM driver options support (#54632)

* Tidying up.

* Adding ipam_driver_options parameter.

* Add tests.

* Add changelog.
This commit is contained in:
Felix Fontein 2019-04-04 21:44:31 +02:00 committed by ansibot
parent f0480ab132
commit 8cba1f9397
3 changed files with 83 additions and 9 deletions

View file

@ -0,0 +1,2 @@
minor_changes:
- "docker_network - add new option ``ipam_driver_options``."

View file

@ -70,20 +70,44 @@ options:
description: description:
- Enable IPv6 networking. - Enable IPv6 networking.
type: bool type: bool
version_added: 2.8 version_added: "2.8"
ipam_driver: ipam_driver:
description: description:
- Specify an IPAM driver. - Specify an IPAM driver.
type: str type: str
ipam_driver_options:
description:
- Dictionary of IPAM driver options.
type: dict
version_added: "2.8"
ipam_options: ipam_options:
description: description:
- Dictionary of IPAM options. - Dictionary of IPAM options.
- Deprecated in 2.8, will be removed in 2.12. Use parameter C(ipam_config) instead. In Docker 1.10.0, IPAM - Deprecated in 2.8, will be removed in 2.12. Use parameter C(ipam_config) instead. In Docker 1.10.0, IPAM
options were introduced (see L(here,https://github.com/moby/moby/pull/17316)). This module parameter addresses options were introduced (see L(here,https://github.com/moby/moby/pull/17316)). This module parameter addresses
the IPAM config not the newly introduced IPAM options. the IPAM config not the newly introduced IPAM options. For the IPAM options, see the I(ipam_driver_options)
parameter.
type: dict type: dict
suboptions:
subnet:
description:
- IP subset in CIDR notation.
type: str
iprange:
description:
- IP address range in CIDR notation.
type: str
gateway:
description:
- IP gateway address.
type: str
aux_addresses:
description:
- Auxiliary IP addresses used by Network driver, as a mapping from hostname to IP.
type: dict
ipam_config: ipam_config:
description: description:
@ -108,7 +132,7 @@ options:
description: description:
- Auxiliary IP addresses used by Network driver, as a mapping from hostname to IP. - Auxiliary IP addresses used by Network driver, as a mapping from hostname to IP.
type: dict type: dict
version_added: 2.8 version_added: "2.8"
state: state:
description: description:
@ -131,13 +155,13 @@ options:
description: description:
- Restrict external access to the network. - Restrict external access to the network.
type: bool type: bool
version_added: 2.8 version_added: "2.8"
labels: labels:
description: description:
- Dictionary of labels. - Dictionary of labels.
type: dict type: dict
version_added: 2.8 version_added: "2.8"
scope: scope:
description: description:
@ -147,13 +171,13 @@ options:
- local - local
- global - global
- swarm - swarm
version_added: 2.8 version_added: "2.8"
attachable: attachable:
description: description:
- If enabled, and the network is in the global scope, non-service containers on worker nodes will be able to connect to the network. - If enabled, and the network is in the global scope, non-service containers on worker nodes will be able to connect to the network.
type: bool type: bool
version_added: 2.8 version_added: "2.8"
extends_documentation_fragment: extends_documentation_fragment:
- docker - docker
@ -282,6 +306,7 @@ class TaskParameters(DockerBaseClass):
self.driver = None self.driver = None
self.driver_options = None self.driver_options = None
self.ipam_driver = None self.ipam_driver = None
self.ipam_driver_options = None
self.ipam_options = None self.ipam_options = None
self.ipam_config = None self.ipam_config = None
self.appends = None self.appends = None
@ -392,6 +417,13 @@ class DockerNetworkManager(object):
parameter=self.parameters.ipam_driver, parameter=self.parameters.ipam_driver,
active=net.get('IPAM')) active=net.get('IPAM'))
if self.parameters.ipam_driver_options is not None:
ipam_driver_options = net['IPAM'].get('Options') or {}
if ipam_driver_options != self.parameters.ipam_driver_options:
differences.add('ipam_driver_options',
parameter=self.parameters.ipam_driver_options,
active=ipam_driver_options)
if self.parameters.ipam_config is not None and self.parameters.ipam_config: if self.parameters.ipam_config is not None and self.parameters.ipam_config:
if not net.get('IPAM') or not net['IPAM']['Config']: if not net.get('IPAM') or not net['IPAM']['Config']:
differences.add('ipam_config', differences.add('ipam_config',
@ -471,14 +503,15 @@ class DockerNetworkManager(object):
else: else:
ipam_pools.append(utils.create_ipam_pool(**ipam_pool)) ipam_pools.append(utils.create_ipam_pool(**ipam_pool))
if self.parameters.ipam_driver or ipam_pools: if self.parameters.ipam_driver or self.parameters.ipam_driver_options or ipam_pools:
# Only add ipam parameter if a driver was specified or if IPAM parameters # Only add ipam parameter if a driver was specified or if IPAM parameters
# were specified. Leaving this parameter away can significantly speed up # were specified. Leaving this parameter away can significantly speed up
# creation; on my machine creation with this option needs ~15 seconds, # creation; on my machine creation with this option needs ~15 seconds,
# and without just a few seconds. # and without just a few seconds.
if LooseVersion(docker_version) >= LooseVersion('2.0.0'): if LooseVersion(docker_version) >= LooseVersion('2.0.0'):
params['ipam'] = IPAMConfig(driver=self.parameters.ipam_driver, params['ipam'] = IPAMConfig(driver=self.parameters.ipam_driver,
pool_configs=ipam_pools) pool_configs=ipam_pools,
options=self.parameters.ipam_driver_options)
else: else:
params['ipam'] = utils.create_ipam_config(driver=self.parameters.ipam_driver, params['ipam'] = utils.create_ipam_config(driver=self.parameters.ipam_driver,
pool_configs=ipam_pools) pool_configs=ipam_pools)
@ -592,6 +625,7 @@ def main():
force=dict(type='bool', default=False), force=dict(type='bool', default=False),
appends=dict(type='bool', default=False, aliases=['incremental']), appends=dict(type='bool', default=False, aliases=['incremental']),
ipam_driver=dict(type='str'), ipam_driver=dict(type='str'),
ipam_driver_options=dict(type='dict'),
ipam_options=dict(type='dict', default={}, options=dict( ipam_options=dict(type='dict', default={}, options=dict(
subnet=dict(type='str'), subnet=dict(type='str'),
iprange=dict(type='str'), iprange=dict(type='str'),
@ -620,6 +654,7 @@ def main():
scope=dict(docker_py_version='2.6.0', docker_api_version='1.30'), scope=dict(docker_py_version='2.6.0', docker_api_version='1.30'),
attachable=dict(docker_py_version='2.0.0', docker_api_version='1.26'), attachable=dict(docker_py_version='2.0.0', docker_api_version='1.26'),
labels=dict(docker_api_version='1.23'), labels=dict(docker_api_version='1.23'),
ipam_driver_options=dict(docker_py_version='2.0.0'),
) )
client = AnsibleDockerClient( client = AnsibleDockerClient(

View file

@ -210,3 +210,40 @@
docker_network: docker_network:
name: "{{ nname_ipam_3 }}" name: "{{ nname_ipam_3 }}"
state: absent state: absent
#################### network-ipam-4 ####################
- name: Create network with IPAM driver options
docker_network:
name: "{{ nname_ipam_3 }}"
ipam_driver: default
ipam_driver_options:
a: b
register: network_1
- 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
- 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
- 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