summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoffrey F <joffrey@docker.com>2015-09-28 12:06:10 -0700
committerJoffrey F <joffrey@docker.com>2015-09-28 12:06:10 -0700
commitd0ccc2e261c2abb3d87dd664011ac83015938534 (patch)
tree207710ba118940cfb4ed259988e2a1ece361e1da
parent5e331a55a8e8e10354693172dce1aa63f58ebe97 (diff)
downloaddocker-py-d0ccc2e261c2abb3d87dd664011ac83015938534.tar.gz
Support explicit protocol in Client.port792-fix-ports-command
User can now specify a protocol in Client.port using the port/proto syntax. Default port is now TCP instead of UDP (to match the behavior of `docker port`) when no proto is specified. Regression test Signed-off-by: Joffrey F <joffrey@docker.com>
-rw-r--r--docker/api/container.py9
-rw-r--r--tests/integration_test.py25
2 files changed, 31 insertions, 3 deletions
diff --git a/docker/api/container.py b/docker/api/container.py
index e7ddd73..f2d8a5b 100644
--- a/docker/api/container.py
+++ b/docker/api/container.py
@@ -196,7 +196,7 @@ class ContainerApiMixin(object):
res = self._get(self._url("/containers/{0}/json", container))
self._raise_for_status(res)
json_ = res.json()
- s_port = str(private_port)
+ private_port = str(private_port)
h_ports = None
# Port settings is None when the container is running with
@@ -205,9 +205,12 @@ class ContainerApiMixin(object):
if port_settings is None:
return None
- h_ports = port_settings.get(s_port + '/udp')
+ if '/' in private_port:
+ return port_settings.get(private_port)
+
+ h_ports = port_settings.get(private_port + '/tcp')
if h_ports is None:
- h_ports = port_settings.get(s_port + '/tcp')
+ h_ports = port_settings.get(private_port + '/udp')
return h_ports
diff --git a/tests/integration_test.py b/tests/integration_test.py
index 763c863..7dd716f 100644
--- a/tests/integration_test.py
+++ b/tests/integration_test.py
@@ -17,6 +17,7 @@ import contextlib
import json
import io
import os
+import random
import shutil
import signal
import socket
@@ -1718,3 +1719,27 @@ class TestRegressions(BaseTestCase):
if six.PY3:
logs = logs.decode('utf-8')
assert logs == '1000\n'
+
+ def test_792_explicit_port_protocol(self):
+
+ tcp_port, udp_port = random.sample(range(9999, 32000), 2)
+ ctnr = self.client.create_container(
+ BUSYBOX, 'true', ports=[2000, (2000, 'udp')],
+ host_config=self.client.create_host_config(
+ port_bindings={'2000/tcp': tcp_port, '2000/udp': udp_port}
+ )
+ )
+ self.tmp_containers.append(ctnr)
+ self.client.start(ctnr)
+ self.assertEqual(
+ self.client.port(ctnr, 2000)[0]['HostPort'],
+ six.text_type(tcp_port)
+ )
+ self.assertEqual(
+ self.client.port(ctnr, '2000/tcp')[0]['HostPort'],
+ six.text_type(tcp_port)
+ )
+ self.assertEqual(
+ self.client.port(ctnr, '2000/udp')[0]['HostPort'],
+ six.text_type(udp_port)
+ )