Browse Source

Volumes are now prefixed with the project name

When created through the compose file, volumes are prefixed
with the name of the project they belong to + underscore,
similarly to how containers are currently handled.

Signed-off-by: Joffrey F <[email protected]>
Joffrey F 10 years ago
parent
commit
ec5111f1c2

+ 2 - 2
compose/cli/main.py

@@ -211,11 +211,11 @@ class TopLevelCommand(DocoptCommand):
             return
 
         if options['--services']:
-            print('\n'.join(service['name'] for service in compose_config))
+            print('\n'.join(service['name'] for service in compose_config.services))
             return
 
         compose_config = dict(
-            (service.pop('name'), service) for service in compose_config)
+            (service.pop('name'), service) for service in compose_config.services)
         print(yaml.dump(
             compose_config,
             default_flow_style=False,

+ 9 - 3
compose/volume.py

@@ -10,10 +10,16 @@ class Volume(object):
         self.driver_opts = driver_opts
 
     def create(self):
-        return self.client.create_volume(self.name, self.driver, self.driver_opts)
+        return self.client.create_volume(
+            self.full_name, self.driver, self.driver_opts
+        )
 
     def remove(self):
-        return self.client.remove_volume(self.name)
+        return self.client.remove_volume(self.full_name)
 
     def inspect(self):
-        return self.client.inspect_volume(self.name)
+        return self.client.inspect_volume(self.full_name)
+
+    @property
+    def full_name(self):
+        return '{0}_{1}'.format(self.project, self.name)

+ 10 - 6
tests/integration/project_test.py

@@ -513,6 +513,7 @@ class ProjectTest(DockerClientTestCase):
 
     def test_project_up_volumes(self):
         vol_name = 'composetests_{0:x}'.format(random.getrandbits(32))
+        full_vol_name = 'composetest_{0}'.format(vol_name)
         config_data = config.Config(
             2, [{
                 'name': 'web',
@@ -528,12 +529,13 @@ class ProjectTest(DockerClientTestCase):
         project.up()
         self.assertEqual(len(project.containers()), 1)
 
-        volume_data = self.client.inspect_volume(vol_name)
-        self.assertEqual(volume_data['Name'], vol_name)
+        volume_data = self.client.inspect_volume(full_vol_name)
+        self.assertEqual(volume_data['Name'], full_vol_name)
         self.assertEqual(volume_data['Driver'], 'local')
 
     def test_initialize_volumes(self):
         vol_name = 'composetests_{0:x}'.format(random.getrandbits(32))
+        full_vol_name = 'composetest_{0}'.format(vol_name)
         config_data = config.Config(
             2, [{
                 'name': 'web',
@@ -548,12 +550,13 @@ class ProjectTest(DockerClientTestCase):
         )
         project.initialize_volumes()
 
-        volume_data = self.client.inspect_volume(vol_name)
-        self.assertEqual(volume_data['Name'], vol_name)
+        volume_data = self.client.inspect_volume(full_vol_name)
+        self.assertEqual(volume_data['Name'], full_vol_name)
         self.assertEqual(volume_data['Driver'], 'local')
 
     def test_project_up_implicit_volume_driver(self):
         vol_name = 'composetests_{0:x}'.format(random.getrandbits(32))
+        full_vol_name = 'composetest_{0}'.format(vol_name)
         config_data = config.Config(
             2, [{
                 'name': 'web',
@@ -568,12 +571,13 @@ class ProjectTest(DockerClientTestCase):
         )
         project.up()
 
-        volume_data = self.client.inspect_volume(vol_name)
-        self.assertEqual(volume_data['Name'], vol_name)
+        volume_data = self.client.inspect_volume(full_vol_name)
+        self.assertEqual(volume_data['Name'], full_vol_name)
         self.assertEqual(volume_data['Driver'], 'local')
 
     def test_project_up_invalid_volume_driver(self):
         vol_name = 'composetests_{0:x}'.format(random.getrandbits(32))
+
         config_data = config.Config(
             2, [{
                 'name': 'web',

+ 1 - 1
tests/integration/testcases.py

@@ -41,7 +41,7 @@ class DockerClientTestCase(unittest.TestCase):
             self.client.remove_image(i)
         volumes = self.client.volumes().get('Volumes') or []
         for v in volumes:
-            if 'composetests_' in v['Name']:
+            if 'composetest_' in v['Name']:
                 self.client.remove_volume(v['Name'])
 
     def create_service(self, name, **kwargs):

+ 55 - 0
tests/integration/volume_test.py

@@ -0,0 +1,55 @@
+from __future__ import unicode_literals
+
+from docker.errors import DockerException
+
+from .testcases import DockerClientTestCase
+from compose.volume import Volume
+
+
+class VolumeTest(DockerClientTestCase):
+    def setUp(self):
+        self.tmp_volumes = []
+
+    def tearDown(self):
+        for volume in self.tmp_volumes:
+            try:
+                self.client.remove_volume(volume.full_name)
+            except DockerException:
+                pass
+
+    def create_volume(self, name, driver=None, opts=None):
+        vol = Volume(
+            self.client, 'composetest', name, driver=driver, driver_opts=opts
+        )
+        self.tmp_volumes.append(vol)
+        return vol
+
+    def test_create_volume(self):
+        vol = self.create_volume('volume01')
+        vol.create()
+        info = self.client.inspect_volume(vol.full_name)
+        assert info['Name'] == vol.full_name
+
+    def test_recreate_existing_volume(self):
+        vol = self.create_volume('volume01')
+
+        vol.create()
+        info = self.client.inspect_volume(vol.full_name)
+        assert info['Name'] == vol.full_name
+
+        vol.create()
+        info = self.client.inspect_volume(vol.full_name)
+        assert info['Name'] == vol.full_name
+
+    def test_inspect_volume(self):
+        vol = self.create_volume('volume01')
+        vol.create()
+        info = vol.inspect()
+        assert info['Name'] == vol.full_name
+
+    def test_remove_volume(self):
+        vol = Volume(self.client, 'composetest', 'volume01')
+        vol.create()
+        vol.remove()
+        volumes = self.client.volumes()['Volumes']
+        assert len([v for v in volumes if v['Name'] == vol.full_name]) == 0