Skip to content

Commit 0e0a852

Browse files
committed
Ensure that global containers are not scaled
Signed-off-by: Felipe Ruhland <[email protected]>
1 parent edb9e3c commit 0e0a852

File tree

2 files changed

+28
-1
lines changed

2 files changed

+28
-1
lines changed

docker/models/services.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import copy
2-
from docker.errors import create_unexpected_kwargs_error
2+
from docker.errors import create_unexpected_kwargs_error, InvalidArgument
33
from docker.types import TaskTemplate, ContainerSpec, ServiceMode
44
from .resource import Model, Collection
55

@@ -116,6 +116,9 @@ def scale(self, replicas):
116116
``True``if successful.
117117
"""
118118

119+
if not self.attrs['Spec']['Mode'].get('Global'):
120+
raise InvalidArgument('Cannot scale a global container')
121+
119122
service_mode = ServiceMode('replicated', replicas)
120123
return self.client.api.update_service(self.id, self.version,
121124
service_mode,

tests/integration/models_services_test.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44

55
from .. import helpers
66
from .base import TEST_API_VERSION
7+
from docker.errors import InvalidArgument
8+
from docker.models.services import ServiceMode
79

810

911
class ServiceTest(unittest.TestCase):
@@ -225,6 +227,28 @@ def test_scale_method_service(self):
225227
spec = service.attrs['Spec']['TaskTemplate']['ContainerSpec']
226228
assert spec.get('Command') == ['sleep', '300']
227229

230+
def test_scale_method_global_service(self):
231+
client = docker.from_env(version=TEST_API_VERSION)
232+
mode = ServiceMode('global')
233+
service = client.services.create(
234+
name=helpers.random_name(),
235+
image="alpine",
236+
command="sleep 300",
237+
mode=mode
238+
)
239+
tasks = []
240+
while len(tasks) == 0:
241+
tasks = service.tasks()
242+
assert len(tasks) == 1
243+
with self.assertRaises(InvalidArgument,
244+
msg='Cannot scale a global container'):
245+
service.scale(2)
246+
247+
assert len(tasks) == 1
248+
service.reload()
249+
spec = service.attrs['Spec']['TaskTemplate']['ContainerSpec']
250+
assert spec.get('Command') == ['sleep', '300']
251+
228252
@helpers.requires_api_version('1.25')
229253
def test_restart_service(self):
230254
client = docker.from_env(version=TEST_API_VERSION)

0 commit comments

Comments
 (0)