mirror of https://github.com/docker/compose.git
Containers have names which are used to isolate them to their service
This commit is contained in:
parent
630f6fcf02
commit
4e426e77fa
|
@ -14,7 +14,7 @@ class Service(object):
|
|||
|
||||
@property
|
||||
def containers(self):
|
||||
return self.client.containers()
|
||||
return [c for c in self.client.containers() if parse_name(get_container_name(c))[0] == self.name]
|
||||
|
||||
def start(self):
|
||||
if len(self.containers) == 0:
|
||||
|
@ -31,8 +31,37 @@ class Service(object):
|
|||
self.stop_container()
|
||||
|
||||
def start_container(self):
|
||||
container = self.client.create_container(self.image, self.command)
|
||||
number = self.next_container_number()
|
||||
name = make_name(self.name, number)
|
||||
container = self.client.create_container(self.image, self.command, name=name)
|
||||
self.client.start(container['Id'])
|
||||
|
||||
def stop_container(self):
|
||||
self.client.kill(self.containers[0]['Id'])
|
||||
|
||||
def next_container_number(self):
|
||||
numbers = [parse_name(get_container_name(c))[1] for c in self.containers]
|
||||
|
||||
if len(numbers) == 0:
|
||||
return 1
|
||||
else:
|
||||
return max(numbers) + 1
|
||||
|
||||
|
||||
def make_name(prefix, number):
|
||||
return '%s_%s' % (prefix, number)
|
||||
|
||||
|
||||
def parse_name(name):
|
||||
match = re.match('^(.+)_(\d+)$', name)
|
||||
|
||||
if match is None:
|
||||
raise ValueError("Invalid name: %s" % name)
|
||||
|
||||
(service_name, suffix) = match.groups()
|
||||
|
||||
return (service_name, int(suffix))
|
||||
|
||||
|
||||
def get_container_name(container):
|
||||
return container['Names'][0][1:]
|
||||
|
|
|
@ -39,6 +39,22 @@ class NameTestCase(ServiceTestCase):
|
|||
Service('_____')
|
||||
|
||||
|
||||
class ContainersTestCase(ServiceTestCase):
|
||||
def test_containers(self):
|
||||
foo = self.create_service('foo')
|
||||
bar = self.create_service('bar')
|
||||
|
||||
foo.start()
|
||||
|
||||
self.assertEqual(len(foo.containers), 1)
|
||||
self.assertEqual(len(bar.containers), 0)
|
||||
|
||||
bar.scale(2)
|
||||
|
||||
self.assertEqual(len(foo.containers), 1)
|
||||
self.assertEqual(len(bar.containers), 2)
|
||||
|
||||
|
||||
class ScalingTestCase(ServiceTestCase):
|
||||
def setUp(self):
|
||||
super(ServiceTestCase, self).setUp()
|
||||
|
|
Loading…
Reference in New Issue