From 9964604b17b6ad2d10e73fb2718059c62d3955ef Mon Sep 17 00:00:00 2001 From: Povilas Kanapickas Date: Mon, 30 Dec 2024 00:52:45 +0200 Subject: [PATCH 1/2] Extract container_to_build_args() Signed-off-by: Povilas Kanapickas --- podman_compose.py | 34 ++++++++++++++++++++-------------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/podman_compose.py b/podman_compose.py index 363dc21d..da2a9ed9 100755 --- a/podman_compose.py +++ b/podman_compose.py @@ -2429,18 +2429,7 @@ async def compose_push(compose, args): await compose.podman.run([], "push", [cnt["image"]]) -async def build_one(compose, args, cnt): - if "build" not in cnt: - return None - if getattr(args, "if_not_exists", None): - try: - img_id = await compose.podman.output( - [], "inspect", ["-t", "image", "-f", "{{.Id}}", cnt["image"]] - ) - except subprocess.CalledProcessError: - img_id = None - if img_id: - return None +def container_to_build_args(compose, cnt, args, path_exists): build_desc = cnt["build"] if not hasattr(build_desc, "items"): build_desc = {"context": build_desc} @@ -2459,9 +2448,9 @@ async def build_one(compose, args, cnt): ] for dockerfile in dockerfile_alts: dockerfile = os.path.join(ctx, dockerfile) - if os.path.exists(dockerfile): + if path_exists(dockerfile): break - if not os.path.exists(dockerfile): + if not path_exists(dockerfile): raise OSError("Dockerfile not found in " + ctx) build_args = ["-f", dockerfile, "-t", cnt["image"]] if "platform" in cnt: @@ -2495,6 +2484,23 @@ async def build_one(compose, args, cnt): build_arg, )) build_args.append(ctx) + return build_args + + +async def build_one(compose, args, cnt): + if "build" not in cnt: + return None + if getattr(args, "if_not_exists", None): + try: + img_id = await compose.podman.output( + [], "inspect", ["-t", "image", "-f", "{{.Id}}", cnt["image"]] + ) + except subprocess.CalledProcessError: + img_id = None + if img_id: + return None + + build_args = container_to_build_args(compose, cnt, args, os.path.exists) status = await compose.podman.run([], "build", build_args) return status From 35cf4bcb728d333551b81a184e4e80c05ce879ca Mon Sep 17 00:00:00 2001 From: Povilas Kanapickas Date: Mon, 30 Dec 2024 00:52:46 +0200 Subject: [PATCH 2/2] tests: Add test for container_to_build_args() Signed-off-by: Povilas Kanapickas --- tests/unit/test_container_to_build_args.py | 128 +++++++++++++++++++++ 1 file changed, 128 insertions(+) create mode 100644 tests/unit/test_container_to_build_args.py diff --git a/tests/unit/test_container_to_build_args.py b/tests/unit/test_container_to_build_args.py new file mode 100644 index 00000000..61ddf6e4 --- /dev/null +++ b/tests/unit/test_container_to_build_args.py @@ -0,0 +1,128 @@ +# SPDX-License-Identifier: GPL-2.0 + +import unittest +from unittest import mock + +from podman_compose import container_to_build_args + + +def create_compose_mock(project_name='test_project_name'): + compose = mock.Mock() + compose.project_name = project_name + compose.dirname = 'test_dirname' + compose.container_names_by_service.get = mock.Mock(return_value=None) + compose.prefer_volume_over_mount = False + compose.default_net = None + compose.networks = {} + compose.x_podman = {} + return compose + + +def get_minimal_container(): + return { + 'name': 'project_name_service_name1', + 'service_name': 'service_name', + 'image': 'new-image', + 'build': {}, + } + + +def get_minimal_args(): + args = mock.Mock() + args.build_arg = [] + return args + + +class TestContainerToBuildArgs(unittest.TestCase): + def test_minimal(self): + c = create_compose_mock() + + cnt = get_minimal_container() + args = get_minimal_args() + + args = container_to_build_args(c, cnt, args, lambda path: True) + self.assertEqual( + args, + [ + '-f', + './Containerfile', + '-t', + 'new-image', + '--no-cache', + '--pull-always', + '.', + ], + ) + + def test_platform(self): + c = create_compose_mock() + + cnt = get_minimal_container() + cnt['platform'] = 'linux/amd64' + args = get_minimal_args() + + args = container_to_build_args(c, cnt, args, lambda path: True) + self.assertEqual( + args, + [ + '-f', + './Containerfile', + '-t', + 'new-image', + '--platform', + 'linux/amd64', + '--no-cache', + '--pull-always', + '.', + ], + ) + + def test_tags(self): + c = create_compose_mock() + + cnt = get_minimal_container() + cnt['build']['tags'] = ['some-tag1', 'some-tag2:2'] + args = get_minimal_args() + + args = container_to_build_args(c, cnt, args, lambda path: True) + self.assertEqual( + args, + [ + '-f', + './Containerfile', + '-t', + 'new-image', + '-t', + 'some-tag1', + '-t', + 'some-tag2:2', + '--no-cache', + '--pull-always', + '.', + ], + ) + + def test_labels(self): + c = create_compose_mock() + + cnt = get_minimal_container() + cnt['build']['labels'] = ['some-label1', 'some-label2.2'] + args = get_minimal_args() + + args = container_to_build_args(c, cnt, args, lambda path: True) + self.assertEqual( + args, + [ + '-f', + './Containerfile', + '-t', + 'new-image', + '--label', + 'some-label1', + '--label', + 'some-label2.2', + '--no-cache', + '--pull-always', + '.', + ], + )