Implement --scale option on up command, allow scale config in v2.2 format

docker-compose scale modified to reuse code between up and scale

Signed-off-by: Joffrey F <joffrey@docker.com>
This commit is contained in:
Joffrey F 2017-04-17 19:03:56 -07:00 committed by Joffrey F
parent 10267a83dc
commit ffb8f9f1b4
2 changed files with 21 additions and 15 deletions

View File

@ -378,16 +378,12 @@ class Service(object):
self.start_container(container) self.start_container(container)
return container return container
containers, errors = parallel_execute( return parallel_execute(
range(i, i + scale), range(i, i + scale),
lambda n: create_and_start(self, n), lambda n: create_and_start(self, n),
lambda n: self.get_container_name(n), lambda n: self.get_container_name(n),
"Creating" "Creating"
) )[0]
for error in errors.values():
raise OperationFailedError(error)
return containers
def _execute_convergence_recreate(self, containers, scale, timeout, detached, start): def _execute_convergence_recreate(self, containers, scale, timeout, detached, start):
if len(containers) > scale: if len(containers) > scale:
@ -399,15 +395,12 @@ class Service(object):
container, timeout=timeout, attach_logs=not detached, container, timeout=timeout, attach_logs=not detached,
start_new_container=start start_new_container=start
) )
containers, errors = parallel_execute( containers = parallel_execute(
containers, containers,
recreate, recreate,
lambda c: c.name, lambda c: c.name,
"Recreating" "Recreating"
) )[0]
for error in errors.values():
raise OperationFailedError(error)
if len(containers) < scale: if len(containers) < scale:
containers.extend(self._execute_convergence_create( containers.extend(self._execute_convergence_create(
scale - len(containers), detached, start scale - len(containers), detached, start
@ -419,16 +412,13 @@ class Service(object):
self._downscale(containers[scale:], timeout) self._downscale(containers[scale:], timeout)
containers = containers[:scale] containers = containers[:scale]
if start: if start:
_, errors = parallel_execute( parallel_execute(
containers, containers,
lambda c: self.start_container_if_stopped(c, attach_logs=not detached), lambda c: self.start_container_if_stopped(c, attach_logs=not detached),
lambda c: c.name, lambda c: c.name,
"Starting" "Starting"
) )
for error in errors.values():
raise OperationFailedError(error)
if len(containers) < scale: if len(containers) < scale:
containers.extend(self._execute_convergence_create( containers.extend(self._execute_convergence_create(
scale - len(containers), detached, start scale - len(containers), detached, start

View File

@ -1866,6 +1866,7 @@ class CLITestCase(DockerClientTestCase):
self.assertEqual(len(project.get_service('simple').containers()), 0) self.assertEqual(len(project.get_service('simple').containers()), 0)
self.assertEqual(len(project.get_service('another').containers()), 0) self.assertEqual(len(project.get_service('another').containers()), 0)
<<<<<<< 10267a83dc79ba0f8cebe17b561c05367b947247
def test_scale_v2_2(self): def test_scale_v2_2(self):
self.base_dir = 'tests/fixtures/scale' self.base_dir = 'tests/fixtures/scale'
result = self.dispatch(['scale', 'web=1'], returncode=1) result = self.dispatch(['scale', 'web=1'], returncode=1)
@ -1887,6 +1888,11 @@ class CLITestCase(DockerClientTestCase):
self.base_dir = 'tests/fixtures/scale' self.base_dir = 'tests/fixtures/scale'
project = self.project project = self.project
=======
def test_up_scale(self):
self.base_dir = 'tests/fixtures/scale'
project = self.project
>>>>>>> Implement --scale option on up command, allow scale config in v2.2 format
self.dispatch(['up', '-d']) self.dispatch(['up', '-d'])
assert len(project.get_service('web').containers()) == 2 assert len(project.get_service('web').containers()) == 2
assert len(project.get_service('db').containers()) == 1 assert len(project.get_service('db').containers()) == 1
@ -1895,6 +1901,7 @@ class CLITestCase(DockerClientTestCase):
assert len(project.get_service('web').containers()) == 1 assert len(project.get_service('web').containers()) == 1
assert len(project.get_service('db').containers()) == 1 assert len(project.get_service('db').containers()) == 1
<<<<<<< 10267a83dc79ba0f8cebe17b561c05367b947247
def test_up_scale_reset(self): def test_up_scale_reset(self):
self.base_dir = 'tests/fixtures/scale' self.base_dir = 'tests/fixtures/scale'
project = self.project project = self.project
@ -1910,6 +1917,15 @@ class CLITestCase(DockerClientTestCase):
def test_up_scale_to_zero(self): def test_up_scale_to_zero(self):
self.base_dir = 'tests/fixtures/scale' self.base_dir = 'tests/fixtures/scale'
project = self.project project = self.project
=======
self.dispatch(['up', '-d', '--scale', 'web=3'])
assert len(project.get_service('web').containers()) == 3
assert len(project.get_service('db').containers()) == 1
self.dispatch(['up', '-d', '--scale', 'web=1', '--scale', 'db=2'])
assert len(project.get_service('web').containers()) == 1
assert len(project.get_service('db').containers()) == 2
>>>>>>> Implement --scale option on up command, allow scale config in v2.2 format
self.dispatch(['up', '-d']) self.dispatch(['up', '-d'])
assert len(project.get_service('web').containers()) == 2 assert len(project.get_service('web').containers()) == 2