diff --git a/docker/api/service.py b/docker/api/service.py index 768d5131..66d98c78 100644 --- a/docker/api/service.py +++ b/docker/api/service.py @@ -62,6 +62,21 @@ def _check_api_features(version, task_template, update_config): raise_version_error('ContainerSpec.privileges', '1.30') +def _merge_task_template(current, override): + merged = current.copy() + if override is not None: + for ts_key, ts_value in override.items(): + if ts_key == 'ContainerSpec': + if 'ContainerSpec' not in merged: + merged['ContainerSpec'] = {} + for cs_key, cs_value in override['ContainerSpec'].items(): + if cs_value is not None: + merged['ContainerSpec'][cs_key] = cs_value + elif ts_value is not None: + merged[ts_key] = ts_value + return merged + + class ServiceApiMixin(object): @utils.minimum_version('1.24') def create_service( @@ -306,7 +321,7 @@ class ServiceApiMixin(object): def update_service(self, service, version, task_template=None, name=None, labels=None, mode=None, update_config=None, networks=None, endpoint_config=None, - endpoint_spec=None, use_current_spec=False): + endpoint_spec=None, fetch_current_spec=False): """ Update a service. @@ -328,8 +343,8 @@ class ServiceApiMixin(object): the service to. Default: ``None``. endpoint_spec (EndpointSpec): Properties that can be configured to access and load balance a service. Default: ``None``. - use_current_spec (boolean): Use the undefined settings from the - previous specification of the service. Default: ``False`` + fetch_current_spec (boolean): Use the undefined settings from the + current specification of the service. Default: ``False`` Returns: ``True`` if successful. @@ -347,11 +362,10 @@ class ServiceApiMixin(object): _check_api_features(self._version, task_template, update_config) - if use_current_spec: + if fetch_current_spec: + inspect_defaults = True if utils.version_lt(self._version, '1.29'): inspect_defaults = None - else: - inspect_defaults = True current = self.inspect_service( service, insert_defaults=inspect_defaults )['Spec'] @@ -363,15 +377,9 @@ class ServiceApiMixin(object): data = {} headers = {} - if name is not None: - data['Name'] = name - else: - data['Name'] = current.get('Name') + data['Name'] = current.get('Name') if name is None else name - if labels is not None: - data['Labels'] = labels - else: - data['Labels'] = current.get('Labels') + data['Labels'] = current.get('Labels') if labels is None else labels if mode is not None: if not isinstance(mode, dict): @@ -380,7 +388,7 @@ class ServiceApiMixin(object): else: data['Mode'] = current.get('Mode') - data['TaskTemplate'] = self._merge_task_template( + data['TaskTemplate'] = _merge_task_template( current.get('TaskTemplate', {}), task_template ) @@ -418,18 +426,3 @@ class ServiceApiMixin(object): ) self._raise_for_status(resp) return True - - @staticmethod - def _merge_task_template(current, override): - merged = current.copy() - if override is not None: - for ts_key, ts_value in override.items(): - if ts_key == 'ContainerSpec': - if 'ContainerSpec' not in merged: - merged['ContainerSpec'] = {} - for cs_key, cs_value in override['ContainerSpec'].items(): - if cs_value is not None: - merged['ContainerSpec'][cs_key] = cs_value - elif ts_value is not None: - merged[ts_key] = ts_value - return merged diff --git a/docker/models/services.py b/docker/models/services.py index 39c86efb..009e4551 100644 --- a/docker/models/services.py +++ b/docker/models/services.py @@ -299,10 +299,10 @@ def _get_create_service_kwargs(func_name, kwargs): if 'force_update' in kwargs: task_template_kwargs['force_update'] = kwargs.pop('force_update') - # use the current spec by default if updating the service + # fetch the current spec by default if updating the service # through the model - use_current_spec = kwargs.pop('use_current_spec', True) - create_kwargs['use_current_spec'] = use_current_spec + fetch_current_spec = kwargs.pop('fetch_current_spec', True) + create_kwargs['fetch_current_spec'] = fetch_current_spec # All kwargs should have been consumed by this point, so raise # error if any are left diff --git a/tests/integration/api_service_test.py b/tests/integration/api_service_test.py index 10ae1804..a35d3a57 100644 --- a/tests/integration/api_service_test.py +++ b/tests/integration/api_service_test.py @@ -726,7 +726,7 @@ class ServiceTest(BaseAPIIntegrationTest): task_tmpl = docker.types.TaskTemplate(container_spec, force_update=10) self._update_service( - svc_id, name, version_index, task_tmpl, use_current_spec=True + svc_id, name, version_index, task_tmpl, fetch_current_spec=True ) svc_info = self.client.inspect_service(svc_id) new_index = svc_info['Version']['Index'] @@ -753,7 +753,7 @@ class ServiceTest(BaseAPIIntegrationTest): task_tmpl = docker.types.TaskTemplate(container_spec, force_update=10) self._update_service( svc_id, name, version_index, task_tmpl, name=name, - use_current_spec=True + fetch_current_spec=True ) svc_info = self.client.inspect_service(svc_id) new_index = svc_info['Version']['Index'] @@ -781,7 +781,7 @@ class ServiceTest(BaseAPIIntegrationTest): self._update_service( svc_id, name, version_index, labels={'force': 'update'}, - use_current_spec=True + fetch_current_spec=True ) svc_info = self.client.inspect_service(svc_id) new_index = svc_info['Version']['Index'] @@ -811,7 +811,7 @@ class ServiceTest(BaseAPIIntegrationTest): self._update_service( svc_id, name, version_index, labels={'force': 'update'}, - use_current_spec=True + fetch_current_spec=True ) svc_info = self.client.inspect_service(svc_id) new_index = svc_info['Version']['Index'] @@ -827,7 +827,7 @@ class ServiceTest(BaseAPIIntegrationTest): ) task_tmpl = docker.types.TaskTemplate(container_spec) self._update_service( - svc_id, name, new_index, task_tmpl, use_current_spec=True + svc_id, name, new_index, task_tmpl, fetch_current_spec=True ) svc_info = self.client.inspect_service(svc_id) newer_index = svc_info['Version']['Index'] @@ -858,7 +858,7 @@ class ServiceTest(BaseAPIIntegrationTest): self._update_service( svc_id, name, version_index, labels={'force': 'update'}, - use_current_spec=True + fetch_current_spec=True ) svc_info = self.client.inspect_service(svc_id) new_index = svc_info['Version']['Index'] @@ -896,7 +896,7 @@ class ServiceTest(BaseAPIIntegrationTest): self._update_service( svc_id, name, version_index, labels={'force': 'update'}, - use_current_spec=True + fetch_current_spec=True ) svc_info = self.client.inspect_service(svc_id) new_index = svc_info['Version']['Index'] @@ -908,7 +908,7 @@ class ServiceTest(BaseAPIIntegrationTest): self._update_service( svc_id, name, new_index, networks=[net1['Id']], - use_current_spec=True + fetch_current_spec=True ) svc_info = self.client.inspect_service(svc_id) assert 'Networks' in svc_info['Spec']['TaskTemplate'] @@ -951,7 +951,7 @@ class ServiceTest(BaseAPIIntegrationTest): self._update_service( svc_id, name, version_index, labels={'force': 'update'}, - use_current_spec=True + fetch_current_spec=True ) svc_info = self.client.inspect_service(svc_id) new_index = svc_info['Version']['Index'] @@ -1003,7 +1003,7 @@ class ServiceTest(BaseAPIIntegrationTest): version_index = svc_info['Version']['Index'] self._update_service( - svc_id, name, version_index, task_tmpl, use_current_spec=True + svc_id, name, version_index, task_tmpl, fetch_current_spec=True ) svc_info = self.client.inspect_service(svc_id) new_index = svc_info['Version']['Index'] @@ -1030,7 +1030,7 @@ class ServiceTest(BaseAPIIntegrationTest): version_index = svc_info['Version']['Index'] self._update_service( - svc_id, name, version_index, labels={}, use_current_spec=True + svc_id, name, version_index, labels={}, fetch_current_spec=True ) svc_info = self.client.inspect_service(svc_id) new_index = svc_info['Version']['Index'] @@ -1061,7 +1061,7 @@ class ServiceTest(BaseAPIIntegrationTest): ) task_tmpl = docker.types.TaskTemplate(container_spec) self._update_service( - svc_id, name, version_index, task_tmpl, use_current_spec=True + svc_id, name, version_index, task_tmpl, fetch_current_spec=True ) svc_info = self.client.inspect_service(svc_id) new_index = svc_info['Version']['Index'] @@ -1100,7 +1100,7 @@ class ServiceTest(BaseAPIIntegrationTest): task_tmpl = docker.types.TaskTemplate(container_spec) self._update_service( svc_id, name, version_index, task_tmpl, name=name, - networks=[net2['Id']], use_current_spec=True + networks=[net2['Id']], fetch_current_spec=True ) svc_info = self.client.inspect_service(svc_id) task_template = svc_info['Spec']['TaskTemplate'] @@ -1114,7 +1114,7 @@ class ServiceTest(BaseAPIIntegrationTest): self._update_service( svc_id, name, new_index, name=name, networks=[net1['Id']], - use_current_spec=True + fetch_current_spec=True ) svc_info = self.client.inspect_service(svc_id) task_template = svc_info['Spec']['TaskTemplate'] @@ -1136,7 +1136,7 @@ class ServiceTest(BaseAPIIntegrationTest): ) self._update_service( svc_id, name, new_index, task_tmpl, name=name, - use_current_spec=True + fetch_current_spec=True ) svc_info = self.client.inspect_service(svc_id) task_template = svc_info['Spec']['TaskTemplate']