فهرست منبع

Merge pull request #2851 from cr7pt0gr4ph7/2839-fix-networks-merging

Fix merge behavior for 'networks' and 'network_mode'.
Aanand Prasad 9 سال پیش
والد
کامیت
7b5bad6050
2فایلهای تغییر یافته به همراه47 افزوده شده و 29 حذف شده
  1. 2 0
      compose/config/config.py
  2. 45 29
      tests/unit/config/config_test.py

+ 2 - 0
compose/config/config.py

@@ -87,6 +87,7 @@ ALLOWED_KEYS = DOCKER_CONFIG_KEYS + [
     'container_name',
     'dockerfile',
     'logging',
+    'network_mode',
 ]
 
 DOCKER_VALID_URL_PREFIXES = (
@@ -698,6 +699,7 @@ def merge_service_dicts(base, override, version):
         'depends_on',
         'expose',
         'external_links',
+        'networks',
         'ports',
         'volumes_from',
     ]:

+ 45 - 29
tests/unit/config/config_test.py

@@ -1506,57 +1506,54 @@ class VolumeConfigTest(unittest.TestCase):
 
 
 class MergePathMappingTest(object):
-    def config_name(self):
-        return ""
+    config_name = ""
 
     def test_empty(self):
         service_dict = config.merge_service_dicts({}, {}, DEFAULT_VERSION)
-        assert self.config_name() not in service_dict
+        assert self.config_name not in service_dict
 
     def test_no_override(self):
         service_dict = config.merge_service_dicts(
-            {self.config_name(): ['/foo:/code', '/data']},
+            {self.config_name: ['/foo:/code', '/data']},
             {},
             DEFAULT_VERSION)
-        assert set(service_dict[self.config_name()]) == set(['/foo:/code', '/data'])
+        assert set(service_dict[self.config_name]) == set(['/foo:/code', '/data'])
 
     def test_no_base(self):
         service_dict = config.merge_service_dicts(
             {},
-            {self.config_name(): ['/bar:/code']},
+            {self.config_name: ['/bar:/code']},
             DEFAULT_VERSION)
-        assert set(service_dict[self.config_name()]) == set(['/bar:/code'])
+        assert set(service_dict[self.config_name]) == set(['/bar:/code'])
 
     def test_override_explicit_path(self):
         service_dict = config.merge_service_dicts(
-            {self.config_name(): ['/foo:/code', '/data']},
-            {self.config_name(): ['/bar:/code']},
+            {self.config_name: ['/foo:/code', '/data']},
+            {self.config_name: ['/bar:/code']},
             DEFAULT_VERSION)
-        assert set(service_dict[self.config_name()]) == set(['/bar:/code', '/data'])
+        assert set(service_dict[self.config_name]) == set(['/bar:/code', '/data'])
 
     def test_add_explicit_path(self):
         service_dict = config.merge_service_dicts(
-            {self.config_name(): ['/foo:/code', '/data']},
-            {self.config_name(): ['/bar:/code', '/quux:/data']},
+            {self.config_name: ['/foo:/code', '/data']},
+            {self.config_name: ['/bar:/code', '/quux:/data']},
             DEFAULT_VERSION)
-        assert set(service_dict[self.config_name()]) == set(['/bar:/code', '/quux:/data'])
+        assert set(service_dict[self.config_name]) == set(['/bar:/code', '/quux:/data'])
 
     def test_remove_explicit_path(self):
         service_dict = config.merge_service_dicts(
-            {self.config_name(): ['/foo:/code', '/quux:/data']},
-            {self.config_name(): ['/bar:/code', '/data']},
+            {self.config_name: ['/foo:/code', '/quux:/data']},
+            {self.config_name: ['/bar:/code', '/data']},
             DEFAULT_VERSION)
-        assert set(service_dict[self.config_name()]) == set(['/bar:/code', '/data'])
+        assert set(service_dict[self.config_name]) == set(['/bar:/code', '/data'])
 
 
 class MergeVolumesTest(unittest.TestCase, MergePathMappingTest):
-    def config_name(self):
-        return 'volumes'
+    config_name = 'volumes'
 
 
 class MergeDevicesTest(unittest.TestCase, MergePathMappingTest):
-    def config_name(self):
-        return 'devices'
+    config_name = 'devices'
 
 
 class BuildOrImageMergeTest(unittest.TestCase):
@@ -1594,30 +1591,49 @@ class BuildOrImageMergeTest(unittest.TestCase):
         )
 
 
-class MergeListsTest(unittest.TestCase):
+class MergeListsTest(object):
+    config_name = ""
+    base_config = []
+    override_config = []
+
+    def merged_config(self):
+        return set(self.base_config) | set(self.override_config)
+
     def test_empty(self):
-        assert 'ports' not in config.merge_service_dicts({}, {}, DEFAULT_VERSION)
+        assert self.config_name not in config.merge_service_dicts({}, {}, DEFAULT_VERSION)
 
     def test_no_override(self):
         service_dict = config.merge_service_dicts(
-            {'ports': ['10:8000', '9000']},
+            {self.config_name: self.base_config},
             {},
             DEFAULT_VERSION)
-        assert set(service_dict['ports']) == set(['10:8000', '9000'])
+        assert set(service_dict[self.config_name]) == set(self.base_config)
 
     def test_no_base(self):
         service_dict = config.merge_service_dicts(
             {},
-            {'ports': ['10:8000', '9000']},
+            {self.config_name: self.base_config},
             DEFAULT_VERSION)
-        assert set(service_dict['ports']) == set(['10:8000', '9000'])
+        assert set(service_dict[self.config_name]) == set(self.base_config)
 
     def test_add_item(self):
         service_dict = config.merge_service_dicts(
-            {'ports': ['10:8000', '9000']},
-            {'ports': ['20:8000']},
+            {self.config_name: self.base_config},
+            {self.config_name: self.override_config},
             DEFAULT_VERSION)
-        assert set(service_dict['ports']) == set(['10:8000', '9000', '20:8000'])
+        assert set(service_dict[self.config_name]) == set(self.merged_config())
+
+
+class MergePortsTest(unittest.TestCase, MergeListsTest):
+    config_name = 'ports'
+    base_config = ['10:8000', '9000']
+    override_config = ['20:8000']
+
+
+class MergeNetworksTest(unittest.TestCase, MergeListsTest):
+    config_name = 'networks'
+    base_config = ['frontend', 'backend']
+    override_config = ['monitoring']
 
 
 class MergeStringsOrListsTest(unittest.TestCase):