diff options
| author | Joffrey F <f.joffrey@gmail.com> | 2018-01-24 18:08:35 -0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2018-01-24 18:08:35 -0800 |
| commit | 4590e2a816ec925ddc2a8f85c5c4cc4bb243e6e0 (patch) | |
| tree | 4b85356ad35d425ce29d8953ac86f8f9fc8a9586 | |
| parent | 766d89055850fc5f42c9937001b426172d6e8a88 (diff) | |
| parent | 663c6089e962f024eafad7fb5bcf88847dd8b28a (diff) | |
| download | docker-py-4590e2a816ec925ddc2a8f85c5c4cc4bb243e6e0.tar.gz | |
Merge pull request #1846 from feliperuhland/issue-1734-scale-method
Added scale method to the Service model.
| -rw-r--r-- | docker/models/services.py | 23 | ||||
| -rw-r--r-- | tests/integration/models_services_test.py | 46 |
2 files changed, 67 insertions, 2 deletions
diff --git a/docker/models/services.py b/docker/models/services.py index 009e455..337ed44 100644 --- a/docker/models/services.py +++ b/docker/models/services.py @@ -1,6 +1,6 @@ import copy -from docker.errors import create_unexpected_kwargs_error -from docker.types import TaskTemplate, ContainerSpec +from docker.errors import create_unexpected_kwargs_error, InvalidArgument +from docker.types import TaskTemplate, ContainerSpec, ServiceMode from .resource import Model, Collection @@ -105,6 +105,25 @@ class Service(Model): ) return self.client.api.service_logs(self.id, is_tty=is_tty, **kwargs) + def scale(self, replicas): + """ + Scale service container. + + Args: + replicas (int): The number of containers that should be running. + + Returns: + ``True``if successful. + """ + + if 'Global' in self.attrs['Spec']['Mode'].keys(): + raise InvalidArgument('Cannot scale a global container') + + service_mode = ServiceMode('replicated', replicas) + return self.client.api.update_service(self.id, self.version, + service_mode, + fetch_current_spec=True) + class ServiceCollection(Collection): """Services on the Docker server.""" diff --git a/tests/integration/models_services_test.py b/tests/integration/models_services_test.py index b4df745..ce83428 100644 --- a/tests/integration/models_services_test.py +++ b/tests/integration/models_services_test.py @@ -4,6 +4,8 @@ import docker from .. import helpers from .base import TEST_API_VERSION +from docker.errors import InvalidArgument +from docker.types.services import ServiceMode class ServiceTest(unittest.TestCase): @@ -227,6 +229,50 @@ class ServiceTest(unittest.TestCase): spec = service.attrs['Spec']['TaskTemplate']['ContainerSpec'] assert spec.get('Command') == ['sleep', '300'] + def test_scale_method_service(self): + client = docker.from_env(version=TEST_API_VERSION) + service = client.services.create( + # create arguments + name=helpers.random_name(), + # ContainerSpec arguments + image="alpine", + command="sleep 300", + ) + tasks = [] + while len(tasks) == 0: + tasks = service.tasks() + assert len(tasks) == 1 + service.scale(2) + while len(tasks) == 1: + tasks = service.tasks() + assert len(tasks) >= 2 + # check that the container spec is not overridden with None + service.reload() + spec = service.attrs['Spec']['TaskTemplate']['ContainerSpec'] + assert spec.get('Command') == ['sleep', '300'] + + def test_scale_method_global_service(self): + client = docker.from_env(version=TEST_API_VERSION) + mode = ServiceMode('global') + service = client.services.create( + name=helpers.random_name(), + image="alpine", + command="sleep 300", + mode=mode + ) + tasks = [] + while len(tasks) == 0: + tasks = service.tasks() + assert len(tasks) == 1 + with self.assertRaises(InvalidArgument, + msg='Cannot scale a global container'): + service.scale(2) + + assert len(tasks) == 1 + service.reload() + spec = service.attrs['Spec']['TaskTemplate']['ContainerSpec'] + assert spec.get('Command') == ['sleep', '300'] + @helpers.requires_api_version('1.25') def test_restart_service(self): client = docker.from_env(version=TEST_API_VERSION) |
