6 Commits

Author SHA1 Message Date
5cefd30926 Release 1.4.1
Signed-off-by: Povilas Kanapickas <povilas@radix.lt>
2025-06-05 17:15:54 +03:00
b37076bc5e Merge pull request #1233 from p12tic/release
Release notes for 1.4.1
2025-06-05 17:15:24 +03:00
3db72df49d Release notes for 1.4.1
Signed-off-by: Povilas Kanapickas <povilas@radix.lt>
2025-06-05 17:09:50 +03:00
189c086d5b Merge pull request #1232 from p12tic/1.4-backport-1231
[1.4 backports] Fix relative host path resolution for volume bind mount source
2025-06-05 17:08:16 +03:00
32b3d26ab1 Add newsfragment
Signed-off-by: Povilas Kanapickas <povilas@radix.lt>
2025-06-05 17:00:37 +03:00
35a66f5a8b Fix relative host path resolution for volume bind mount source
e03d675b9b broke relative host path
resolution by deleting os.chdir(). After this commit current working
directory is not relevant anymore.

Fixes e03d675b9b.

Signed-off-by: Monika Kairaityte <monika@kibit.lt>
2025-06-05 16:58:42 +03:00
4 changed files with 89 additions and 9 deletions

7
docs/Changelog-1.4.1.md Normal file
View File

@ -0,0 +1,7 @@
Version 1.4.1 (2025-06-05)
==========================
Bug fixes
---------
- Fixed relative host path resolution for volume bind mount source

View File

@ -40,7 +40,7 @@ except ImportError:
import yaml
from dotenv import dotenv_values
__version__ = "1.4.0"
__version__ = "1.4.1"
script = os.path.realpath(sys.argv[0])
@ -395,6 +395,7 @@ async def assert_volume(compose, mount_dict):
os.makedirs(mount_src, exist_ok=True)
except OSError:
pass
mount_dict["source"] = mount_src
return
if mount_dict["type"] != "volume" or not vol or not vol.get("name"):
return

View File

@ -36,8 +36,9 @@ class TestPodmanCompose(unittest.TestCase, RunSubprocessMixin):
"selinux_container1_1",
])
inspect_out = json.loads(out)
create_command_list = inspect_out[0].get("Config", []).get("CreateCommand", {})
self.assertIn('./host_test_text.txt:/test_text.txt:z', create_command_list)
create_command_list = inspect_out[0].get("Config", []).get("CreateCommand", [])
host_path = os.path.join(test_path(), "selinux", "host_test_text.txt")
self.assertIn(f'{host_path}:/test_text.txt:z', create_command_list)
out, _ = self.run_subprocess_assert_returncode([
"podman",
@ -45,8 +46,9 @@ class TestPodmanCompose(unittest.TestCase, RunSubprocessMixin):
"selinux_container2_1",
])
inspect_out = json.loads(out)
create_command_list = inspect_out[0].get("Config", []).get("CreateCommand", {})
self.assertIn('./host_test_text.txt:/test_text.txt', create_command_list)
create_command_list = inspect_out[0].get("Config", []).get("CreateCommand", [])
host_path = os.path.join(test_path(), "selinux", "host_test_text.txt")
self.assertIn(f'{host_path}:/test_text.txt', create_command_list)
finally:
out, _ = self.run_subprocess_assert_returncode([
podman_compose_path(),

View File

@ -529,10 +529,24 @@ class TestContainerToArgs(unittest.IsolatedAsyncioTestCase):
)
@parameterized.expand([
(False, "z", ["--mount", "type=bind,source=./foo,destination=/mnt,z"]),
(False, "Z", ["--mount", "type=bind,source=./foo,destination=/mnt,Z"]),
(True, "z", ["-v", "./foo:/mnt:z"]),
(True, "Z", ["-v", "./foo:/mnt:Z"]),
(
False,
"z",
[
"--mount",
f"type=bind,source={get_test_file_path('test_dirname/foo')},destination=/mnt,z",
],
),
(
False,
"Z",
[
"--mount",
f"type=bind,source={get_test_file_path('test_dirname/foo')},destination=/mnt,Z",
],
),
(True, "z", ["-v", f"{get_test_file_path('test_dirname/foo')}:/mnt:z"]),
(True, "Z", ["-v", f"{get_test_file_path('test_dirname/foo')}:/mnt:Z"]),
])
async def test_selinux_volume(self, prefer_volume, selinux_type, expected_additional_args):
c = create_compose_mock()
@ -567,6 +581,62 @@ class TestContainerToArgs(unittest.IsolatedAsyncioTestCase):
],
)
@parameterized.expand([
(
"absolute_path",
get_test_file_path('test_dirname/foo'),
[
"--mount",
f"type=bind,source={get_test_file_path('test_dirname/foo')},destination=/mnt",
],
),
(
"relative_path",
'./foo',
[
"--mount",
f"type=bind,source={get_test_file_path('test_dirname/foo')},destination=/mnt",
],
),
(
"home_dir",
'~/test_dirname/foo',
[
"--mount",
f"type=bind,source={os.path.expanduser('~/test_dirname/foo')},destination=/mnt",
],
),
])
async def test_volumes_bind_mount_source(
self, test_name: str, mount_source: str, expected_additional_args: list
) -> None:
c = create_compose_mock()
cnt = get_minimal_container()
# This is supposed to happen during `_parse_compose_file`
# but that is probably getting skipped during testing
cnt["_service"] = cnt["service_name"]
cnt["volumes"] = [
{
"type": "bind",
"source": f"{mount_source}",
"target": "/mnt",
}
]
args = await container_to_args(c, cnt)
self.assertEqual(
args,
[
"--name=project_name_service_name1",
"-d",
*expected_additional_args,
"--network=bridge:alias=service_name",
"busybox",
],
)
@parameterized.expand([
("not_compat", False, "test_project_name", "test_project_name_network1"),
("compat_no_dash", True, "test_project_name", "test_project_name_network1"),