diff options
| author | Joffrey F <joffrey@docker.com> | 2018-01-31 12:29:26 -0800 |
|---|---|---|
| committer | Joffrey F <joffrey@docker.com> | 2018-01-31 12:42:11 -0800 |
| commit | 5347c168d022836bd19f63c5527c59169ae22f53 (patch) | |
| tree | a89da7f120f21332ab645995d97de70fc594d056 /docker | |
| parent | 0750337f6a77bdfb46579184ac4950a212e5d048 (diff) | |
| download | docker-py-1878-publishmode.tar.gz | |
Add support for publish mode for endpointspec ports1878-publishmode
Signed-off-by: Joffrey F <joffrey@docker.com>
Diffstat (limited to 'docker')
| -rw-r--r-- | docker/api/service.py | 15 | ||||
| -rw-r--r-- | docker/types/services.py | 14 |
2 files changed, 23 insertions, 6 deletions
diff --git a/docker/api/service.py b/docker/api/service.py index 4f7123e..051d34f 100644 --- a/docker/api/service.py +++ b/docker/api/service.py @@ -3,7 +3,7 @@ from .. import auth, errors, utils from ..types import ServiceMode -def _check_api_features(version, task_template, update_config): +def _check_api_features(version, task_template, update_config, endpoint_spec): def raise_version_error(param, min_version): raise errors.InvalidVersion( @@ -23,6 +23,11 @@ def _check_api_features(version, task_template, update_config): if 'Order' in update_config: raise_version_error('UpdateConfig.order', '1.29') + if endpoint_spec is not None: + if utils.version_lt(version, '1.32') and 'Ports' in endpoint_spec: + if any(p.get('PublishMode') for p in endpoint_spec['Ports']): + raise_version_error('EndpointSpec.Ports[].mode', '1.32') + if task_template is not None: if 'ForceUpdate' in task_template and utils.version_lt( version, '1.25'): @@ -125,7 +130,9 @@ class ServiceApiMixin(object): ) endpoint_spec = endpoint_config - _check_api_features(self._version, task_template, update_config) + _check_api_features( + self._version, task_template, update_config, endpoint_spec + ) url = self._url('/services/create') headers = {} @@ -370,7 +377,9 @@ class ServiceApiMixin(object): ) endpoint_spec = endpoint_config - _check_api_features(self._version, task_template, update_config) + _check_api_features( + self._version, task_template, update_config, endpoint_spec + ) if fetch_current_spec: inspect_defaults = True diff --git a/docker/types/services.py b/docker/types/services.py index ef1ca69..d530e61 100644 --- a/docker/types/services.py +++ b/docker/types/services.py @@ -450,8 +450,9 @@ class EndpointSpec(dict): ``'vip'`` if not provided. ports (dict): Exposed ports that this service is accessible on from the outside, in the form of ``{ published_port: target_port }`` or - ``{ published_port: (target_port, protocol) }``. Ports can only be - provided if the ``vip`` resolution mode is used. + ``{ published_port: <port_config_tuple> }``. Port config tuple format + is ``(target_port [, protocol [, publish_mode]])``. + Ports can only be provided if the ``vip`` resolution mode is used. """ def __init__(self, mode=None, ports=None): if ports: @@ -477,8 +478,15 @@ def convert_service_ports(ports): if isinstance(v, tuple): port_spec['TargetPort'] = v[0] - if len(v) == 2: + if len(v) >= 2 and v[1] is not None: port_spec['Protocol'] = v[1] + if len(v) == 3: + port_spec['PublishMode'] = v[2] + if len(v) > 3: + raise ValueError( + 'Service port configuration can have at most 3 elements: ' + '(target_port, protocol, mode)' + ) else: port_spec['TargetPort'] = v |
