Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions newsfragments/reject_non_list_security_opt.bugfix
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Reject a non-list ``security_opt`` in service definitions instead of silently
coercing a bare scalar into a one-element list.
4 changes: 3 additions & 1 deletion podman_compose.py
Original file line number Diff line number Diff line change
Expand Up @@ -2099,13 +2099,15 @@ def normalize_service(service: dict[str, Any], sub_dir: str = "") -> dict[str, A
if "build" in service and "args" in service["build"]:
if isinstance(build["args"], dict):
build["args"] = norm_as_list(build["args"])
for key in ("env_file", "security_opt", "volumes"):
for key in ("env_file", "volumes"):
if key not in service:
continue
if isinstance(service[key], str):
service[key] = [service[key]]
if "security_opt" in service:
sec_ls = service["security_opt"]
if not is_list(sec_ls):
raise PodmanComposeError("ERROR: security_opt must be a list")
for ix, item in enumerate(sec_ls):
if item in ("seccomp:unconfined", "apparmor:unconfined"):
sec_ls[ix] = item.replace(":", "=")
Expand Down
15 changes: 15 additions & 0 deletions tests/unit/test_normalize_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@

from parameterized import parameterized

from podman_compose import PodmanComposeError
from podman_compose import normalize_service


Expand Down Expand Up @@ -117,3 +118,17 @@ def test_command_like(
expected_service = {}
expected_service[key] = expected
self.assertEqual(normalize_service(input_service), expected_service)

@parameterized.expand([
("label=disable",),
({"label": "disable"},),
])
def test_security_opt_must_be_a_list(self, value: Any) -> None:
with self.assertRaises(PodmanComposeError):
normalize_service({"security_opt": value})

def test_security_opt_list_is_normalized(self) -> None:
self.assertEqual(
normalize_service({"security_opt": ["seccomp:unconfined", "label=disable"]}),
{"security_opt": ["seccomp=unconfined", "label=disable"]},
)