Skip to content

Commit edb9e3c

Browse files
committed
Added scale method to the Service model.
Signed-off-by: Felipe Ruhland <[email protected]>
1 parent 190d95c commit edb9e3c

File tree

2 files changed

+39
-1
lines changed

2 files changed

+39
-1
lines changed

docker/models/services.py

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import copy
22
from docker.errors import create_unexpected_kwargs_error
3-
from docker.types import TaskTemplate, ContainerSpec
3+
from docker.types import TaskTemplate, ContainerSpec, ServiceMode
44
from .resource import Model, Collection
55

66

@@ -105,6 +105,22 @@ def logs(self, **kwargs):
105105
)
106106
return self.client.api.service_logs(self.id, is_tty=is_tty, **kwargs)
107107

108+
def scale(self, replicas):
109+
"""
110+
Scale service container.
111+
112+
Args:
113+
replicas (int): The number of containers that should be running.
114+
115+
Returns:
116+
``True``if successful.
117+
"""
118+
119+
service_mode = ServiceMode('replicated', replicas)
120+
return self.client.api.update_service(self.id, self.version,
121+
service_mode,
122+
fetch_current_spec=True)
123+
108124

109125
class ServiceCollection(Collection):
110126
"""Services on the Docker server."""

tests/integration/models_services_test.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,28 @@ def test_scale_service(self):
203203
spec = service.attrs['Spec']['TaskTemplate']['ContainerSpec']
204204
assert spec.get('Command') == ['sleep', '300']
205205

206+
def test_scale_method_service(self):
207+
client = docker.from_env(version=TEST_API_VERSION)
208+
service = client.services.create(
209+
# create arguments
210+
name=helpers.random_name(),
211+
# ContainerSpec arguments
212+
image="alpine",
213+
command="sleep 300"
214+
)
215+
tasks = []
216+
while len(tasks) == 0:
217+
tasks = service.tasks()
218+
assert len(tasks) == 1
219+
service.scale(2)
220+
while len(tasks) == 1:
221+
tasks = service.tasks()
222+
assert len(tasks) >= 2
223+
# check that the container spec is not overridden with None
224+
service.reload()
225+
spec = service.attrs['Spec']['TaskTemplate']['ContainerSpec']
226+
assert spec.get('Command') == ['sleep', '300']
227+
206228
@helpers.requires_api_version('1.25')
207229
def test_restart_service(self):
208230
client = docker.from_env(version=TEST_API_VERSION)

0 commit comments

Comments
 (0)