summaryrefslogtreecommitdiff
path: root/docker
diff options
context:
space:
mode:
authorJoffrey F <joffrey@docker.com>2018-01-31 12:29:26 -0800
committerJoffrey F <joffrey@docker.com>2018-01-31 12:42:11 -0800
commit5347c168d022836bd19f63c5527c59169ae22f53 (patch)
treea89da7f120f21332ab645995d97de70fc594d056 /docker
parent0750337f6a77bdfb46579184ac4950a212e5d048 (diff)
downloaddocker-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.py15
-rw-r--r--docker/types/services.py14
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