From 5ea916733495a3e09726b96c4716a87da60f8bb2 Mon Sep 17 00:00:00 2001 From: Joffrey F Date: Wed, 8 Mar 2017 18:29:09 -0800 Subject: [PATCH] Prevent service to create a container if it is referencing itself in an external link Signed-off-by: Joffrey F --- compose/service.py | 13 ++++++++++++- tests/unit/service_test.py | 9 +++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/compose/service.py b/compose/service.py index 29ee70476..b9f77beb9 100644 --- a/compose/service.py +++ b/compose/service.py @@ -22,6 +22,7 @@ from . import const from . import progress_stream from .config import DOCKER_CONFIG_KEYS from .config import merge_environment +from .config.errors import DependencyError from .config.types import ServicePort from .config.types import VolumeSpec from .const import DEFAULT_TIMEOUT @@ -872,7 +873,17 @@ class Service(object): if self.custom_container_name and not one_off: return self.custom_container_name - return build_container_name(self.project, self.name, number, one_off) + container_name = build_container_name( + self.project, self.name, number, one_off, + ) + ext_links_origins = [l.split(':')[0] for l in self.options.get('external_links', [])] + if container_name in ext_links_origins: + raise DependencyError( + 'Service {0} has a self-referential external link: {1}'.format( + self.name, container_name + ) + ) + return container_name def remove_image(self, image_type): if not image_type or image_type == ImageType.none: diff --git a/tests/unit/service_test.py b/tests/unit/service_test.py index b3c8c4d7d..f3f3a2a83 100644 --- a/tests/unit/service_test.py +++ b/tests/unit/service_test.py @@ -7,6 +7,7 @@ from docker.errors import APIError from .. import mock from .. import unittest +from compose.config.errors import DependencyError from compose.config.types import ServicePort from compose.config.types import VolumeFromSpec from compose.config.types import VolumeSpec @@ -170,6 +171,14 @@ class ServiceTest(unittest.TestCase): 2000000000 ) + def test_self_reference_external_link(self): + service = Service( + name='foo', + external_links=['default_foo_1'] + ) + with self.assertRaises(DependencyError): + service.get_container_name(1) + def test_mem_reservation(self): self.mock_client.create_host_config.return_value = {}