From d7686e1bc01f99f3b8af16484fcdf0fbae6aff85 Mon Sep 17 00:00:00 2001 From: Dave Bendit Date: Tue, 6 Nov 2018 08:39:45 -0600 Subject: [PATCH] [docker_network] Add handling for Python booleans in driver_options (#48105) Fixes #26708 --- .../docker_network-driver_options.yaml | 3 + .../modules/cloud/docker/docker_network.py | 18 ++++++ .../docker_network/tasks/tests/options.yml | 56 ++++++++++++++++++- 3 files changed, 75 insertions(+), 2 deletions(-) create mode 100644 changelogs/fragments/docker_network-driver_options.yaml diff --git a/changelogs/fragments/docker_network-driver_options.yaml b/changelogs/fragments/docker_network-driver_options.yaml new file mode 100644 index 00000000000..78e189c325e --- /dev/null +++ b/changelogs/fragments/docker_network-driver_options.yaml @@ -0,0 +1,3 @@ +--- +bugfixes: + - "docker_network - ``driver_options`` containing Python booleans would cause Docker to throw exceptions." diff --git a/lib/ansible/modules/cloud/docker/docker_network.py b/lib/ansible/modules/cloud/docker/docker_network.py index 15a654b2b60..2a30e7b9d81 100644 --- a/lib/ansible/modules/cloud/docker/docker_network.py +++ b/lib/ansible/modules/cloud/docker/docker_network.py @@ -268,6 +268,21 @@ def get_ip_version(cidr): raise ValueError('"{0}" is not a valid CIDR'.format(cidr)) +def get_driver_options(driver_options): + result = dict() + if driver_options is not None: + for k, v in driver_options.items(): + # Go doesn't like 'True' or 'False' + if v is True: + v = 'true' + elif v is False: + v = 'false' + else: + v = str(v) + result[str(k)] = v + return result + + class DockerNetworkManager(object): def __init__(self, client): @@ -288,6 +303,9 @@ class DockerNetworkManager(object): if self.parameters.ipam_options: self.parameters.ipam_config = [self.parameters.ipam_options] + if self.parameters.driver_options: + self.parameters.driver_options = get_driver_options(self.parameters.driver_options) + state = self.parameters.state if state == 'present': self.present() diff --git a/test/integration/targets/docker_network/tasks/tests/options.yml b/test/integration/targets/docker_network/tasks/tests/options.yml index 583179a77b3..d4ac563308a 100644 --- a/test/integration/targets/docker_network/tasks/tests/options.yml +++ b/test/integration/targets/docker_network/tasks/tests/options.yml @@ -2,10 +2,9 @@ - name: Registering network name set_fact: nname_1: "{{ name_prefix ~ '-network-1' }}" - nname_2: "{{ name_prefix ~ '-network-2' }}" - name: Registering network name set_fact: - dnetworks: "{{ dnetworks }} + [nname_1, nname_2]" + dnetworks: "{{ dnetworks }} + [nname_1]" #################################################################### ## internal ######################################################## @@ -40,3 +39,56 @@ - internal_1 is changed - internal_2 is not changed - internal_3 is changed + +#################################################################### +## driver_options ################################################## +#################################################################### + +- name: driver_options + docker_network: + name: "{{ nname_1 }}" + driver_options: + com.docker.network.bridge.enable_icc: 'false' + register: driver_options_1 + +- name: driver_options (idempotency) + docker_network: + name: "{{ nname_1 }}" + driver_options: + com.docker.network.bridge.enable_icc: 'false' + register: driver_options_2 + +- name: driver_options (idempotency with string translation) + docker_network: + name: "{{ nname_1 }}" + driver_options: + com.docker.network.bridge.enable_icc: False + register: driver_options_3 + +- name: driver_options (change) + docker_network: + name: "{{ nname_1 }}" + driver_options: + com.docker.network.bridge.enable_icc: 'true' + register: driver_options_4 + +- name: driver_options (idempotency with string translation) + docker_network: + name: "{{ nname_1 }}" + driver_options: + com.docker.network.bridge.enable_icc: True + register: driver_options_5 + +- name: cleanup + docker_network: + name: "{{ nname_1 }}" + state: absent + force: yes + +- assert: + that: + - driver_options_1 is changed + - driver_options_2 is not changed + - driver_options_3 is not changed + - driver_options_4 is changed + - driver_options_5 is not changed