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 <joffrey@docker.com>
This commit is contained in:
Joffrey F 2015-12-08 17:21:20 -08:00
parent ecef5d37a7
commit ec5111f1c2
5 changed files with 77 additions and 12 deletions

View File

@ -211,11 +211,11 @@ class TopLevelCommand(DocoptCommand):
return return
if options['--services']: 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 return
compose_config = dict( 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( print(yaml.dump(
compose_config, compose_config,
default_flow_style=False, default_flow_style=False,

View File

@ -10,10 +10,16 @@ class Volume(object):
self.driver_opts = driver_opts self.driver_opts = driver_opts
def create(self): 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): def remove(self):
return self.client.remove_volume(self.name) return self.client.remove_volume(self.full_name)
def inspect(self): 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)

View File

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

View File

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

View File

@ -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