mirror of https://github.com/docker/compose.git
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:
parent
ecef5d37a7
commit
ec5111f1c2
|
@ -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,
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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',
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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
|
Loading…
Reference in New Issue