From cfc11515bcf7d9c76605149ae3a0e0ae7c1e7857 Mon Sep 17 00:00:00 2001 From: crierr Date: Mon, 20 Feb 2017 00:06:27 +0900 Subject: [PATCH 1/3] Allow port range like 8000-8010:80 Signed-off-by: SeungJin Oh --- docker/utils/ports.py | 9 ++++++--- tests/unit/utils_test.py | 5 +++++ 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/docker/utils/ports.py b/docker/utils/ports.py index 326ef94f..1813f83f 100644 --- a/docker/utils/ports.py +++ b/docker/utils/ports.py @@ -24,7 +24,7 @@ def build_port_bindings(ports): return port_bindings -def to_port_range(port): +def to_port_range(port, randomly_available_port = False): if not port: return None @@ -37,6 +37,9 @@ def to_port_range(port): port, protocol = parts protocol = "/" + protocol + if randomly_available_port: + return ["%s%s" % (port, protocol)] + parts = str(port).split('-') if len(parts) == 1: @@ -69,7 +72,7 @@ def split_port(port): external_port, internal_port = parts internal_range = to_port_range(internal_port) - external_range = to_port_range(external_port) + external_range = to_port_range(external_port, len(internal_range) == 1) if internal_range is None or external_range is None: _raise_invalid_port(port) @@ -81,7 +84,7 @@ def split_port(port): external_ip, external_port, internal_port = parts internal_range = to_port_range(internal_port) - external_range = to_port_range(external_port) + external_range = to_port_range(external_port, len(internal_range) == 1) if not external_range: external_range = [None] * len(internal_range) diff --git a/tests/unit/utils_test.py b/tests/unit/utils_test.py index 854d0ef2..ad6d9e09 100644 --- a/tests/unit/utils_test.py +++ b/tests/unit/utils_test.py @@ -530,6 +530,11 @@ class PortsTest(unittest.TestCase): self.assertEqual(internal_port, ["2000", "2001"]) self.assertEqual(external_port, ["1000", "1001"]) + def test_split_port_random_port_range_with_host_port(self): + internal_port, external_port = split_port("1000-1001:2000") + self.assertEqual(internal_port, ["2000"]) + self.assertEqual(external_port, ["1000-1001"]) + def test_split_port_no_host_port(self): internal_port, external_port = split_port("2000") self.assertEqual(internal_port, ["2000"]) From 8e47f297200b0bcf64d89dcb11242aace2e21a6a Mon Sep 17 00:00:00 2001 From: SeungJin Oh Date: Mon, 20 Feb 2017 01:36:09 +0900 Subject: [PATCH 2/3] check NoneType before using Signed-off-by: SeungJin Oh --- docker/utils/ports.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/docker/utils/ports.py b/docker/utils/ports.py index 1813f83f..39b158ac 100644 --- a/docker/utils/ports.py +++ b/docker/utils/ports.py @@ -72,9 +72,11 @@ def split_port(port): external_port, internal_port = parts internal_range = to_port_range(internal_port) - external_range = to_port_range(external_port, len(internal_range) == 1) + if internal_range is None: + _raise_invalid_port(port) - if internal_range is None or external_range is None: + external_range = to_port_range(external_port, len(internal_range) == 1) + if external_range is None: _raise_invalid_port(port) if len(internal_range) != len(external_range): From 60e7fd93a81bccf7b3992d5dbe23d958ac229a8f Mon Sep 17 00:00:00 2001 From: SeungJin Oh Date: Mon, 20 Feb 2017 02:05:57 +0900 Subject: [PATCH 3/3] passing flake8 test Signed-off-by: SeungJin Oh --- docker/utils/ports.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/utils/ports.py b/docker/utils/ports.py index 39b158ac..5bb7079a 100644 --- a/docker/utils/ports.py +++ b/docker/utils/ports.py @@ -24,7 +24,7 @@ def build_port_bindings(ports): return port_bindings -def to_port_range(port, randomly_available_port = False): +def to_port_range(port, randomly_available_port=False): if not port: return None