From 4c29c5f6ab7ad786981b1e3561f0fc92838a8c30 Mon Sep 17 00:00:00 2001 From: Andrey Arapov Date: Tue, 18 Apr 2017 20:25:46 +0200 Subject: [PATCH] dockerng: avoid network duplication and add driver_opts --- salt/modules/dockermod.py | 14 ++++++++++++-- salt/states/docker_network.py | 23 +++++++++++++++++++++-- tests/unit/modules/test_dockermod.py | 9 +++++++-- tests/unit/states/test_docker_network.py | 5 ++++- 4 files changed, 44 insertions(+), 7 deletions(-) diff --git a/salt/modules/dockermod.py b/salt/modules/dockermod.py index 3045ae60ae8a..b43e8ff06a57 100644 --- a/salt/modules/dockermod.py +++ b/salt/modules/dockermod.py @@ -3939,7 +3939,9 @@ def networks(names=None, ids=None): return response -def create_network(name, driver=None): +def create_network(name, + driver=None, + driver_opts=None): ''' Create a new network @@ -3949,13 +3951,21 @@ def create_network(name, driver=None): driver Driver of the network + driver_opts + Options for the network driver. + CLI Example: .. code-block:: bash salt myminion docker.create_network web_network driver=bridge ''' - response = _client_wrapper('create_network', name, driver=driver) + response = _client_wrapper('create_network', + name, + driver=driver, + options=driver_opts, + check_duplicate=True) + _clear_context() # Only non-error return case is a True return, so just return the response return response diff --git a/salt/states/docker_network.py b/salt/states/docker_network.py index 6b623e662edc..1df8a35c68d0 100644 --- a/salt/states/docker_network.py +++ b/salt/states/docker_network.py @@ -33,6 +33,9 @@ from __future__ import absolute_import import logging +# Import salt libs +import salt.utils + # Enable proper logging log = logging.getLogger(__name__) # pylint: disable=invalid-name @@ -49,7 +52,10 @@ def __virtual__(): return (False, __salt__.missing_fun_string('docker.version')) -def present(name, driver=None, containers=None): +def present(name, + driver=None, + driver_opts=None, + containers=None): ''' Ensure that a network is present. @@ -59,6 +65,9 @@ def present(name, driver=None, containers=None): driver Type of driver for that network. + driver_opts + Options for the network driver. + containers: List of container names that should be part of this network @@ -75,6 +84,8 @@ def present(name, driver=None, containers=None): network_bar: docker_network.present - name: bar + - driver_opts: + - com.docker.network.driver.mtu: "1450" - containers: - cont1 - cont2 @@ -84,6 +95,10 @@ def present(name, driver=None, containers=None): 'changes': {}, 'result': False, 'comment': ''} + + if salt.utils.is_dictlist(driver_opts): + driver_opts = salt.utils.repack_dictlist(driver_opts) + if containers is None: containers = [] # map containers to container's Ids. @@ -110,7 +125,11 @@ def present(name, driver=None, containers=None): else: try: ret['changes']['created'] = __salt__['docker.create_network']( - name, driver=driver) + name, + driver=driver, + driver_opts=driver_opts, + check_duplicate=True) + except Exception as exc: ret['comment'] = ('Failed to create network \'{0}\': {1}' .format(name, exc)) diff --git a/tests/unit/modules/test_dockermod.py b/tests/unit/modules/test_dockermod.py index ffd26aff698e..9cef67f81b70 100644 --- a/tests/unit/modules/test_dockermod.py +++ b/tests/unit/modules/test_dockermod.py @@ -182,8 +182,13 @@ def test_create_network(self, *args): with patch.dict(docker_mod.__dict__, {'__salt__': __salt__}): with patch.object(docker_mod, '_get_client', get_client_mock): - docker_mod.create_network('foo', driver='bridge') - client.create_network.assert_called_once_with('foo', driver='bridge') + docker_mod.create_network('foo', + driver='bridge', + driver_opts={}) + client.create_network.assert_called_once_with('foo', + driver='bridge', + options={}, + check_duplicate=True) @skipIf(docker_version < (1, 5, 0), 'docker module must be installed to run this test or is too old. >=1.5.0') diff --git a/tests/unit/states/test_docker_network.py b/tests/unit/states/test_docker_network.py index 7b0037a7d4fb..172deae7ac3c 100644 --- a/tests/unit/states/test_docker_network.py +++ b/tests/unit/states/test_docker_network.py @@ -54,7 +54,10 @@ def test_present(self): 'network_foo', containers=['container'], ) - docker_create_network.assert_called_with('network_foo', driver=None) + docker_create_network.assert_called_with('network_foo', + driver=None, + driver_opts=None, + check_duplicate=True) docker_connect_container_to_network.assert_called_with('abcd', 'network_foo') self.assertEqual(ret, {'name': 'network_foo',