From d5ebc734829f86054388fced14665c348e1d1ef5 Mon Sep 17 00:00:00 2001 From: Joffrey F Date: Fri, 4 May 2018 16:15:52 -0700 Subject: [PATCH] Don't attempt to create resources with name starting with illegal characters Signed-off-by: Joffrey F --- compose/service.py | 2 +- compose/volume.py | 2 +- tests/integration/project_test.py | 62 +++++++++++++++++++++++++++++++ 3 files changed, 64 insertions(+), 2 deletions(-) diff --git a/compose/service.py b/compose/service.py index 4ff56eea7..932ed8b34 100644 --- a/compose/service.py +++ b/compose/service.py @@ -1355,7 +1355,7 @@ class ServiceNetworkMode(object): def build_container_name(project, service, number, one_off=False): - bits = [project, service] + bits = [project.lstrip('-_'), service] if one_off: bits.append('run') return '_'.join(bits + [str(number)]) diff --git a/compose/volume.py b/compose/volume.py index 7618417ff..60c1e0fe8 100644 --- a/compose/volume.py +++ b/compose/volume.py @@ -60,7 +60,7 @@ class Volume(object): def full_name(self): if self.custom_name: return self.name - return '{0}_{1}'.format(self.project, self.name) + return '{0}_{1}'.format(self.project.lstrip('-_'), self.name) @property def legacy_full_name(self): diff --git a/tests/integration/project_test.py b/tests/integration/project_test.py index 3960d12e5..8813e84ce 100644 --- a/tests/integration/project_test.py +++ b/tests/integration/project_test.py @@ -1915,3 +1915,65 @@ class ProjectTest(DockerClientTestCase): assert len(remote_secopts) == 1 assert remote_secopts[0].startswith('seccomp=') assert json.loads(remote_secopts[0].lstrip('seccomp=')) == seccomp_data + + @no_cluster('inspect volume by name defect on Swarm Classic') + def test_project_up_name_starts_with_illegal_char(self): + config_dict = { + 'version': '2.3', + 'services': { + 'svc1': { + 'image': 'busybox:latest', + 'command': 'ls', + 'volumes': ['foo:/foo:rw'], + 'networks': ['bar'], + }, + }, + 'volumes': { + 'foo': {}, + }, + 'networks': { + 'bar': {}, + } + } + config_data = load_config(config_dict) + project = Project.from_config( + name='_underscoretest', config_data=config_data, client=self.client + ) + project.up() + self.addCleanup(project.down, None, True) + + containers = project.containers(stopped=True) + assert len(containers) == 1 + assert containers[0].name == 'underscoretest_svc1_1' + assert containers[0].project == '_underscoretest' + + full_vol_name = 'underscoretest_foo' + vol_data = self.get_volume_data(full_vol_name) + assert vol_data + assert vol_data['Labels'][LABEL_PROJECT] == '_underscoretest' + + full_net_name = '_underscoretest_bar' + net_data = self.client.inspect_network(full_net_name) + assert net_data + assert net_data['Labels'][LABEL_PROJECT] == '_underscoretest' + + project2 = Project.from_config( + name='-dashtest', config_data=config_data, client=self.client + ) + project2.up() + self.addCleanup(project2.down, None, True) + + containers = project2.containers(stopped=True) + assert len(containers) == 1 + assert containers[0].name == 'dashtest_svc1_1' + assert containers[0].project == '-dashtest' + + full_vol_name = 'dashtest_foo' + vol_data = self.get_volume_data(full_vol_name) + assert vol_data + assert vol_data['Labels'][LABEL_PROJECT] == '-dashtest' + + full_net_name = '-dashtest_bar' + net_data = self.client.inspect_network(full_net_name) + assert net_data + assert net_data['Labels'][LABEL_PROJECT] == '-dashtest'