Explorar o código

Prevent service to create a container if it is referencing itself in an external link

Signed-off-by: Joffrey F <[email protected]>
Joffrey F %!s(int64=8) %!d(string=hai) anos
pai
achega
5ea9167334
Modificáronse 2 ficheiros con 21 adicións e 1 borrados
  1. 12 1
      compose/service.py
  2. 9 0
      tests/unit/service_test.py

+ 12 - 1
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:

+ 9 - 0
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 = {}