From e75a03fd6d744a96d84179eadfcc47301ca968c7 Mon Sep 17 00:00:00 2001 From: Viktor Adam Date: Fri, 12 Jan 2018 22:18:47 +0000 Subject: [PATCH] Fix regression on API < 1.25 Signed-off-by: Viktor Adam --- docker/api/service.py | 9 ++++++++- tests/integration/models_services_test.py | 24 +++++++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/docker/api/service.py b/docker/api/service.py index 86f4b073..1a8b8b5b 100644 --- a/docker/api/service.py +++ b/docker/api/service.py @@ -137,6 +137,8 @@ class ServiceApiMixin(object): auth_header = auth.get_config_header(self, registry) if auth_header: headers['X-Registry-Auth'] = auth_header + if utils.version_lt(self._version, '1.25'): + networks = networks or task_template.pop('Networks', None) data = { 'Name': name, 'Labels': labels, @@ -411,7 +413,12 @@ class ServiceApiMixin(object): if networks is not None: converted_networks = utils.convert_service_networks(networks) - data['TaskTemplate']['Networks'] = converted_networks + if utils.version_lt(self._version, '1.25'): + data['Networks'] = converted_networks + else: + data['TaskTemplate']['Networks'] = converted_networks + elif utils.version_lt(self._version, '1.25'): + data['Networks'] = current.get('Networks') elif data['TaskTemplate'].get('Networks') is None: current_task_template = current.get('TaskTemplate', {}) current_networks = current_task_template.get('Networks') diff --git a/tests/integration/models_services_test.py b/tests/integration/models_services_test.py index ca8be48d..b4df745e 100644 --- a/tests/integration/models_services_test.py +++ b/tests/integration/models_services_test.py @@ -179,6 +179,30 @@ class ServiceTest(unittest.TestCase): service.reload() assert not service.attrs['Spec'].get('Labels') + def test_update_retains_networks(self): + client = docker.from_env(version=TEST_API_VERSION) + network_name = helpers.random_name() + network = client.networks.create( + network_name, driver='overlay' + ) + service = client.services.create( + # create arguments + name=helpers.random_name(), + networks=[network.id], + # ContainerSpec arguments + image="alpine", + command="sleep 300" + ) + service.update( + # create argument + name=service.name, + # ContainerSpec argument + command="sleep 600" + ) + service.reload() + networks = service.attrs['Spec']['TaskTemplate']['Networks'] + assert networks == [{'Target': network.id}] + def test_scale_service(self): client = docker.from_env(version=TEST_API_VERSION) service = client.services.create(