Skip to content

Commit 24044fa

Browse files
committed
Some additional validation for container ports, and a couple extra test cases.
Signed-off-by: Daniel Nephin <dnephin@gmail.com>
1 parent 07fa169 commit 24044fa

2 files changed

Lines changed: 29 additions & 17 deletions

File tree

fig/service.py

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -245,7 +245,7 @@ def start_container(self, container=None, intermediate_container=None, **overrid
245245
def start_or_create_containers(self):
246246
containers = self.containers(stopped=True)
247247

248-
if len(containers) == 0:
248+
if not containers:
249249
log.info("Creating %s..." % self.next_container_name())
250250
new_container = self.create_container()
251251
return [self.start_container(new_container)]
@@ -451,20 +451,20 @@ def build_volume_binding(volume_spec):
451451

452452

453453
def split_port(port):
454-
port = str(port)
455-
external_ip = None
456-
if ':' in port:
457-
external_port, internal_port = port.rsplit(':', 1)
458-
if ':' in external_port:
459-
external_ip, external_port = external_port.split(':', 1)
460-
else:
461-
external_port, internal_port = (None, port)
462-
if external_ip:
463-
if external_port:
464-
external_port = (external_ip, external_port)
465-
else:
466-
external_port = (external_ip,)
467-
return internal_port, external_port
454+
parts = str(port).split(':')
455+
if not 1 <= len(parts) <= 3:
456+
raise ConfigError('Invalid port "%s", should be '
457+
'[[remote_ip:]remote_port:]port[/protocol]' % port)
458+
459+
if len(parts) == 1:
460+
internal_port, = parts
461+
return internal_port, None
462+
if len(parts) == 2:
463+
external_port, internal_port = parts
464+
return internal_port, external_port
465+
466+
external_ip, external_port, internal_port = parts
467+
return internal_port, (external_ip, external_port or None)
468468

469469

470470
def split_env(env):

tests/unit/service_test.py

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,23 +38,35 @@ def test_config_validation(self):
3838
self.assertRaises(ConfigError, lambda: Service(name='foo', port=['8000']))
3939
Service(name='foo', ports=['8000'])
4040

41-
def test_split_port(self):
41+
def test_split_port_with_host_ip(self):
4242
internal_port, external_port = split_port("127.0.0.1:1000:2000")
4343
self.assertEqual(internal_port, "2000")
4444
self.assertEqual(external_port, ("127.0.0.1", "1000"))
4545

46+
def test_split_port_with_protocol(self):
4647
internal_port, external_port = split_port("127.0.0.1:1000:2000/udp")
4748
self.assertEqual(internal_port, "2000/udp")
4849
self.assertEqual(external_port, ("127.0.0.1", "1000"))
4950

51+
def test_split_port_with_host_ip_no_port(self):
5052
internal_port, external_port = split_port("127.0.0.1::2000")
5153
self.assertEqual(internal_port, "2000")
52-
self.assertEqual(external_port, ("127.0.0.1",))
54+
self.assertEqual(external_port, ("127.0.0.1", None))
5355

56+
def test_split_port_with_host_port(self):
5457
internal_port, external_port = split_port("1000:2000")
5558
self.assertEqual(internal_port, "2000")
5659
self.assertEqual(external_port, "1000")
5760

61+
def test_split_port_no_host_port(self):
62+
internal_port, external_port = split_port("2000")
63+
self.assertEqual(internal_port, "2000")
64+
self.assertEqual(external_port, None)
65+
66+
def test_split_port_invalid(self):
67+
with self.assertRaises(ConfigError):
68+
split_port("0.0.0.0:1000:2000:tcp")
69+
5870
def test_split_domainname_none(self):
5971
service = Service('foo',
6072
hostname = 'name',

0 commit comments

Comments
 (0)