From 6cf72381f9359c3040153324540f478c907311b3 Mon Sep 17 00:00:00 2001 From: aiordache Date: Fri, 10 Jul 2020 17:28:02 +0200 Subject: [PATCH] error out on both scale and deploy.replicas being set Signed-off-by: aiordache --- compose/project.py | 36 ++++++++++++++++++++++++------------ 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/compose/project.py b/compose/project.py index c02a1d8dd..af6b9ce0c 100644 --- a/compose/project.py +++ b/compose/project.py @@ -276,19 +276,31 @@ class Project(object): def get_service_scale(self, service_dict): # service.scale for v2 and deploy.replicas for v3 - scale = service_dict.get('scale', 1) + scale = service_dict.get('scale', None) deploy_dict = service_dict.get('deploy', None) - if deploy_dict: - if deploy_dict.get('mode', 'replicated') == 'replicated': - scale = deploy_dict.get('replicas', scale) - # deploy may contain placement constraints introduced in v3.8 - max_replicas = deploy_dict.get('placement', {}).get( - 'max_replicas_per_node', - scale) - scale = min(scale, max_replicas) - if max_replicas < scale: - log.warning("Scale is limited to {} ('max_replicas_per_node' field).".format( - max_replicas)) + if not deploy_dict: + return 1 if scale is None else scale + + if deploy_dict.get('mode', 'replicated') != 'replicated': + return 1 if scale is None else scale + + replicas = deploy_dict.get('replicas', None) + if scale and replicas: + raise ConfigurationError( + "Both service.scale and service.deploy.replicas are set." + " Only one of them must be set." + ) + if replicas: + scale = replicas + # deploy may contain placement constraints introduced in v3.8 + max_replicas = deploy_dict.get('placement', {}).get( + 'max_replicas_per_node', + scale) + + scale = min(scale, max_replicas) + if max_replicas < scale: + log.warning("Scale is limited to {} ('max_replicas_per_node' field).".format( + max_replicas)) return scale def start(self, service_names=None, **options):