diff --git a/newsfragments/267.bugfix b/newsfragments/267.bugfix new file mode 100644 index 0000000..2cd21cf --- /dev/null +++ b/newsfragments/267.bugfix @@ -0,0 +1 @@ +- Fixed the --scale flag as described in issue #267 [Podman not supporting --scale flag] diff --git a/podman_compose.py b/podman_compose.py index b206d7f..015880d 100755 --- a/podman_compose.py +++ b/podman_compose.py @@ -2107,7 +2107,23 @@ class PodmanCompose: container_names_by_service = {} self.services = services for service_name, service_desc in services.items(): - replicas = try_int(service_desc.get("deploy", {}).get("replicas"), fallback=1) + replicas = 1 + if "scale" in args and args.scale is not None: + # Check `--scale` args from CLI command + scale_args = args.scale.split('=') + if service_name == scale_args[0]: + replicas = try_int(scale_args[1], fallback=1) + elif "scale" in service_desc: + # Check `scale` value from compose yaml file + replicas = try_int(service_desc.get("scale"), fallback=1) + elif ( + "deploy" in service_desc + and "replicas" in service_desc.get("deploy", {}) + and "replicated" == service_desc.get("deploy", {}).get("mode", '') + ): + # Check `deploy: replicas:` value from compose yaml file + # Note: All conditions are necessary to handle case + replicas = try_int(service_desc.get("deploy", {}).get("replicas"), fallback=1) container_names_by_service[service_name] = [] for num in range(1, replicas + 1): @@ -3423,12 +3439,13 @@ def compose_up_parse(parser): action="store_true", help="Remove containers for services not defined in the Compose file.", ) + # `--scale` argument needs to store as single value and not append, + # as multiple scale values could be confusing. parser.add_argument( "--scale", metavar="SERVICE=NUM", - action="append", - help="Scale SERVICE to NUM instances. Overrides the `scale` setting in the Compose file if " - "present.", + help="Scale SERVICE to NUM instances. " + "Overrides the `scale` setting in the Compose file if present.", ) parser.add_argument( "--exit-code-from", diff --git a/tests/integration/service_scale/scaleup_cli/docker-compose.yml b/tests/integration/service_scale/scaleup_cli/docker-compose.yml new file mode 100644 index 0000000..d7d860c --- /dev/null +++ b/tests/integration/service_scale/scaleup_cli/docker-compose.yml @@ -0,0 +1,6 @@ +name: podman-compose + +services: + service1: + image: docker.io/library/busybox:latest + tty: true diff --git a/tests/integration/service_scale/scaleup_deploy_replicas_parameter/docker-compose.yml b/tests/integration/service_scale/scaleup_deploy_replicas_parameter/docker-compose.yml new file mode 100644 index 0000000..e08f795 --- /dev/null +++ b/tests/integration/service_scale/scaleup_deploy_replicas_parameter/docker-compose.yml @@ -0,0 +1,9 @@ +name: podman-compose + +services: + service1: + image: docker.io/library/busybox:latest + tty: true + deploy: + mode: replicated + replicas: 2 diff --git a/tests/integration/service_scale/scaleup_scale_parameter/docker-compose.yml b/tests/integration/service_scale/scaleup_scale_parameter/docker-compose.yml new file mode 100644 index 0000000..1f641c0 --- /dev/null +++ b/tests/integration/service_scale/scaleup_scale_parameter/docker-compose.yml @@ -0,0 +1,7 @@ +name: podman-compose + +services: + service1: + image: docker.io/library/busybox:latest + tty: true + scale: 2 diff --git a/tests/integration/service_scale/test_podman_compose_scale.py b/tests/integration/service_scale/test_podman_compose_scale.py new file mode 100644 index 0000000..34c3cf9 --- /dev/null +++ b/tests/integration/service_scale/test_podman_compose_scale.py @@ -0,0 +1,111 @@ +# SPDX-License-Identifier: GPL-2.0 + +import os +import unittest + +from tests.integration.test_utils import RunSubprocessMixin +from tests.integration.test_utils import podman_compose_path +from tests.integration.test_utils import test_path + + +def compose_yaml_path(test_ref_folder): + return os.path.join(test_path(), "service_scale", test_ref_folder, "docker-compose.yml") + + +class TestComposeScale(unittest.TestCase, RunSubprocessMixin): + # scale-up using `scale` prarmeter in docker-compose.yml + def test_scaleup_scale_parameter(self): + try: + output, _, return_code = self.run_subprocess([ + podman_compose_path(), + "-f", + compose_yaml_path("scaleup_scale_parameter"), + "up", + "-d", + ]) + self.assertEqual(return_code, 0) + output, _, return_code = self.run_subprocess([ + podman_compose_path(), + "-f", + compose_yaml_path("scaleup_scale_parameter"), + "ps", + "-q", + ]) + self.assertEqual(len(output.splitlines()), 2) + finally: + self.run_subprocess_assert_returncode([ + podman_compose_path(), + "-f", + compose_yaml_path("scaleup_scale_parameter"), + "down", + "-t", + "0", + ]) + + # scale-up using `deploy => replicas` prarmeter in docker-compose.yml + def test_scaleup_deploy_replicas_parameter(self): + try: + output, _, return_code = self.run_subprocess([ + podman_compose_path(), + "-f", + compose_yaml_path('scaleup_deploy_replicas_parameter'), + "up", + "-d", + ]) + self.assertEqual(return_code, 0) + output, _, return_code = self.run_subprocess([ + podman_compose_path(), + "-f", + compose_yaml_path("scaleup_scale_parameter"), + "ps", + "-q", + ]) + self.assertEqual(len(output.splitlines()), 2) + finally: + self.run_subprocess_assert_returncode([ + podman_compose_path(), + "-f", + compose_yaml_path('scaleup_deploy_replicas_parameter'), + "down", + "-t", + "0", + ]) + + # scale-up using `--scale =` argument in CLI + def test_scaleup_cli(self): + try: + output, _, return_code = self.run_subprocess([ + podman_compose_path(), + "-f", + compose_yaml_path('scaleup_cli'), + "up", + "-d", + ]) + self.assertEqual(return_code, 0) + output, _, return_code = self.run_subprocess([ + podman_compose_path(), + "-f", + compose_yaml_path('scaleup_cli'), + "up", + "-d", + "--scale", + "service1=2", + ]) + self.assertEqual(return_code, 0) + output, _, return_code = self.run_subprocess([ + podman_compose_path(), + "-f", + compose_yaml_path("scaleup_scale_parameter"), + "ps", + "-q", + ]) + self.assertEqual(len(output.splitlines()), 2) + finally: + self.run_subprocess_assert_returncode([ + podman_compose_path(), + "-f", + compose_yaml_path('scaleup_cli'), + "down", + "-t", + "0", + ])