فهرست منبع

Merge pull request #4004 from shin-/4000-extend-logging

Properly merge logging dictionaries in overriding configs
Joffrey F 9 سال پیش
والد
کامیت
7f1606545d
2فایلهای تغییر یافته به همراه169 افزوده شده و 1 حذف شده
  1. 12 0
      compose/config/config.py
  2. 157 1
      tests/unit/config/config_test.py

+ 12 - 0
compose/config/config.py

@@ -764,6 +764,8 @@ def merge_service_dicts(base, override, version):
     for field in ['dns', 'dns_search', 'env_file', 'tmpfs']:
         md.merge_field(field, merge_list_or_string)
 
+    md.merge_field('logging', merge_logging)
+
     for field in set(ALLOWED_KEYS) - set(md):
         md.merge_scalar(field)
 
@@ -793,6 +795,16 @@ def merge_build(output, base, override):
     return dict(md)
 
 
+def merge_logging(base, override):
+    md = MergeDict(base, override)
+    md.merge_scalar('driver')
+    if md.get('driver') == base.get('driver') or base.get('driver') is None:
+        md.merge_mapping('options', lambda m: m or {})
+    else:
+        md['options'] = override.get('options')
+    return dict(md)
+
+
 def legacy_v1_merge_image_or_build(output, base, override):
     output.pop('image', None)
     output.pop('build', None)

+ 157 - 1
tests/unit/config/config_test.py

@@ -1330,7 +1330,7 @@ class ConfigTest(unittest.TestCase):
                     'image': 'alpine',
                     'group_add': ["docker", 777]
                 }
-             }
+            }
         }))
 
         assert actual.services == [
@@ -1429,6 +1429,162 @@ class ConfigTest(unittest.TestCase):
             'command': 'true',
         }
 
+    def test_merge_logging_v2(self):
+        base = {
+            'image': 'alpine:edge',
+            'logging': {
+                'driver': 'json-file',
+                'options': {
+                    'frequency': '2000',
+                    'timeout': '23'
+                }
+            }
+        }
+        override = {
+            'logging': {
+                'options': {
+                    'timeout': '360',
+                    'pretty-print': 'on'
+                }
+            }
+        }
+
+        actual = config.merge_service_dicts(base, override, V2_0)
+        assert actual == {
+            'image': 'alpine:edge',
+            'logging': {
+                'driver': 'json-file',
+                'options': {
+                    'frequency': '2000',
+                    'timeout': '360',
+                    'pretty-print': 'on'
+                }
+            }
+        }
+
+    def test_merge_logging_v2_override_driver(self):
+        base = {
+            'image': 'alpine:edge',
+            'logging': {
+                'driver': 'json-file',
+                'options': {
+                    'frequency': '2000',
+                    'timeout': '23'
+                }
+            }
+        }
+        override = {
+            'logging': {
+                'driver': 'syslog',
+                'options': {
+                    'timeout': '360',
+                    'pretty-print': 'on'
+                }
+            }
+        }
+
+        actual = config.merge_service_dicts(base, override, V2_0)
+        assert actual == {
+            'image': 'alpine:edge',
+            'logging': {
+                'driver': 'syslog',
+                'options': {
+                    'timeout': '360',
+                    'pretty-print': 'on'
+                }
+            }
+        }
+
+    def test_merge_logging_v2_no_base_driver(self):
+        base = {
+            'image': 'alpine:edge',
+            'logging': {
+                'options': {
+                    'frequency': '2000',
+                    'timeout': '23'
+                }
+            }
+        }
+        override = {
+            'logging': {
+                'driver': 'json-file',
+                'options': {
+                    'timeout': '360',
+                    'pretty-print': 'on'
+                }
+            }
+        }
+
+        actual = config.merge_service_dicts(base, override, V2_0)
+        assert actual == {
+            'image': 'alpine:edge',
+            'logging': {
+                'driver': 'json-file',
+                'options': {
+                    'frequency': '2000',
+                    'timeout': '360',
+                    'pretty-print': 'on'
+                }
+            }
+        }
+
+    def test_merge_logging_v2_no_drivers(self):
+        base = {
+            'image': 'alpine:edge',
+            'logging': {
+                'options': {
+                    'frequency': '2000',
+                    'timeout': '23'
+                }
+            }
+        }
+        override = {
+            'logging': {
+                'options': {
+                    'timeout': '360',
+                    'pretty-print': 'on'
+                }
+            }
+        }
+
+        actual = config.merge_service_dicts(base, override, V2_0)
+        assert actual == {
+            'image': 'alpine:edge',
+            'logging': {
+                'options': {
+                    'frequency': '2000',
+                    'timeout': '360',
+                    'pretty-print': 'on'
+                }
+            }
+        }
+
+    def test_merge_logging_v2_no_override_options(self):
+        base = {
+            'image': 'alpine:edge',
+            'logging': {
+                'driver': 'json-file',
+                'options': {
+                    'frequency': '2000',
+                    'timeout': '23'
+                }
+            }
+        }
+        override = {
+            'logging': {
+                'driver': 'syslog'
+            }
+        }
+
+        actual = config.merge_service_dicts(base, override, V2_0)
+        assert actual == {
+            'image': 'alpine:edge',
+            'logging': {
+                'driver': 'syslog',
+                'options': None
+            }
+        }
+
     def test_external_volume_config(self):
         config_details = build_config_details({
             'version': '2',