Explorar o código

Fix volume merging when there's no explicit host path

Signed-off-by: Aanand Prasad <[email protected]>
Aanand Prasad %!s(int64=10) %!d(string=hai) anos
pai
achega
35c6e0314c
Modificáronse 2 ficheiros con 48 adicións e 21 borrados
  1. 15 6
      compose/config.py
  2. 33 15
      tests/unit/config_test.py

+ 15 - 6
compose/config.py

@@ -324,15 +324,24 @@ def dict_from_volumes(volumes):
         return {}
 
 
-def split_volume(volume):
-    if ':' in volume:
-        return reversed(volume.split(':', 1))
+def volumes_from_dict(d):
+    return [join_volume(v) for v in d.items()]
+
+
+def split_volume(string):
+    if ':' in string:
+        (host, container) = string.split(':', 1)
+        return (container, host)
     else:
-        return (volume, None)
+        return (string, None)
 
 
-def volumes_from_dict(d):
-    return ["%s:%s" % (host_path, container_path) for (container_path, host_path) in d.items()]
+def join_volume(pair):
+    (container, host) = pair
+    if host is None:
+        return container
+    else:
+        return ":".join((host, container))
 
 
 def expand_path(working_dir, path):

+ 33 - 15
tests/unit/config_test.py

@@ -40,26 +40,44 @@ class ConfigTest(unittest.TestCase):
 
 
 class MergeTest(unittest.TestCase):
-    def test_merge_volumes(self):
+    def test_merge_volumes_empty(self):
         service_dict = config.merge_service_dicts({}, {})
         self.assertNotIn('volumes', service_dict)
 
-        service_dict = config.merge_service_dicts({
-            'volumes': ['/foo:/data'],
-        }, {})
-        self.assertEqual(service_dict['volumes'], ['/foo:/data'])
+    def test_merge_volumes_no_override(self):
+        service_dict = config.merge_service_dicts(
+            {'volumes': ['/foo:/code', '/data']},
+            {},
+        )
+        self.assertEqual(set(service_dict['volumes']), set(['/foo:/code', '/data']))
 
-        service_dict = config.merge_service_dicts({}, {
-            'volumes': ['/bar:/data'],
-        })
-        self.assertEqual(service_dict['volumes'], ['/bar:/data'])
+    def test_merge_volumes_no_base(self):
+        service_dict = config.merge_service_dicts(
+            {},
+            {'volumes': ['/bar:/code']},
+        )
+        self.assertEqual(set(service_dict['volumes']), set(['/bar:/code']))
 
-        service_dict = config.merge_service_dicts({
-            'volumes': ['/foo:/data'],
-        }, {
-            'volumes': ['/bar:/data'],
-        })
-        self.assertEqual(service_dict['volumes'], ['/bar:/data'])
+    def test_merge_volumes_override_explicit_path(self):
+        service_dict = config.merge_service_dicts(
+            {'volumes': ['/foo:/code', '/data']},
+            {'volumes': ['/bar:/code']},
+        )
+        self.assertEqual(set(service_dict['volumes']), set(['/bar:/code', '/data']))
+
+    def test_merge_volumes_add_explicit_path(self):
+        service_dict = config.merge_service_dicts(
+            {'volumes': ['/foo:/code', '/data']},
+            {'volumes': ['/bar:/code', '/quux:/data']},
+        )
+        self.assertEqual(set(service_dict['volumes']), set(['/bar:/code', '/quux:/data']))
+
+    def test_merge_volumes_remove_explicit_path(self):
+        service_dict = config.merge_service_dicts(
+            {'volumes': ['/foo:/code', '/quux:/data']},
+            {'volumes': ['/bar:/code', '/data']},
+        )
+        self.assertEqual(set(service_dict['volumes']), set(['/bar:/code', '/data']))
 
 
 class EnvTest(unittest.TestCase):