Skip to content

Commit 1510ab7

Browse files
committed
feat: expose *ns keys to consumers
`cgroupns`, `ipcns`, `pidns`, `userns`, `utsns` now support setting the `value` attribute. This allows to mimic the behavior of `--userns`[0] cli arg via this API. [0]: https://docs.podman.io/en/stable/markdown/podman-create.1.html#userns-mode Signed-off-by: Jose D. Gomez R <[email protected]>
1 parent cbd660d commit 1510ab7

File tree

2 files changed

+60
-5
lines changed

2 files changed

+60
-5
lines changed

podman/domain/containers_create.py

+12-5
Original file line numberDiff line numberDiff line change
@@ -436,6 +436,13 @@ def _render_payload(kwargs: MutableMapping[str, Any]) -> dict[str, Any]:
436436
def pop(k):
437437
return args.pop(k, None)
438438

439+
def normalize_nsmode(
440+
mode: Union[str, MutableMapping[str, str]],
441+
) -> dict[str, str]:
442+
if isinstance(mode, dict):
443+
return mode
444+
return {"nsmode": mode}
445+
439446
def to_bytes(size: Union[int, str, None]) -> Union[int, None]:
440447
"""
441448
Converts str or int to bytes.
@@ -746,10 +753,10 @@ def parse_host_port(_container_port, _protocol, _host):
746753
params["secret_env"] = args.pop("secret_env", {})
747754

748755
if "cgroupns" in args:
749-
params["cgroupns"] = {"nsmode": args.pop("cgroupns")}
756+
params["cgroupns"] = normalize_nsmode(args.pop("cgroupns"))
750757

751758
if "ipc_mode" in args:
752-
params["ipcns"] = {"nsmode": args.pop("ipc_mode")}
759+
params["ipcns"] = normalize_nsmode(args.pop("ipc_mode"))
753760

754761
if "network_mode" in args:
755762
network_mode = args.pop("network_mode")
@@ -760,13 +767,13 @@ def parse_host_port(_container_port, _protocol, _host):
760767
params["netns"] = {"nsmode": network_mode}
761768

762769
if "pid_mode" in args:
763-
params["pidns"] = {"nsmode": args.pop("pid_mode")}
770+
params["pidns"] = normalize_nsmode(args.pop("pid_mode"))
764771

765772
if "userns_mode" in args:
766-
params["userns"] = {"nsmode": args.pop("userns_mode")}
773+
params["userns"] = normalize_nsmode(args.pop("userns_mode"))
767774

768775
if "uts_mode" in args:
769-
params["utsns"] = {"nsmode": args.pop("uts_mode")}
776+
params["utsns"] = normalize_nsmode(args.pop("uts_mode"))
770777

771778
if len(args) > 0:
772779
raise TypeError(

podman/tests/unit/test_containersmanager.py

+48
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,54 @@ def test_create_parse_host_port(self, mock):
257257
]
258258
self.assertEqual(expected_ports, actual_ports)
259259

260+
@requests_mock.Mocker()
261+
def test_create_userns_mode_simple(self, mock):
262+
mock_response = MagicMock()
263+
mock_response.json = lambda: {
264+
"Id": "87e1325c82424e49a00abdd4de08009eb76c7de8d228426a9b8af9318ced5ecd",
265+
"Size": 1024,
266+
}
267+
self.client.containers.client.post = MagicMock(return_value=mock_response)
268+
mock.get(
269+
tests.LIBPOD_URL
270+
+ "/containers/87e1325c82424e49a00abdd4de08009eb76c7de8d228426a9b8af9318ced5ecd/json",
271+
json=FIRST_CONTAINER,
272+
)
273+
274+
userns = "keep-id"
275+
self.client.containers.create("fedora", "/usr/bin/ls", userns_mode=userns)
276+
self.client.containers.client.post.assert_called()
277+
expected_userns = {"nsmode": userns}
278+
279+
actual_userns = json.loads(self.client.containers.client.post.call_args[1]["data"])[
280+
"userns"
281+
]
282+
self.assertEqual(expected_userns, actual_userns)
283+
284+
@requests_mock.Mocker()
285+
def test_create_userns_mode_dict(self, mock):
286+
mock_response = MagicMock()
287+
mock_response.json = lambda: {
288+
"Id": "87e1325c82424e49a00abdd4de08009eb76c7de8d228426a9b8af9318ced5ecd",
289+
"Size": 1024,
290+
}
291+
self.client.containers.client.post = MagicMock(return_value=mock_response)
292+
mock.get(
293+
tests.LIBPOD_URL
294+
+ "/containers/87e1325c82424e49a00abdd4de08009eb76c7de8d228426a9b8af9318ced5ecd/json",
295+
json=FIRST_CONTAINER,
296+
)
297+
298+
userns = {"nsmode": "keep-id", "value": "uid=900"}
299+
self.client.containers.create("fedora", "/usr/bin/ls", userns_mode=userns)
300+
self.client.containers.client.post.assert_called()
301+
expected_userns = dict(**userns)
302+
303+
actual_userns = json.loads(self.client.containers.client.post.call_args[1]["data"])[
304+
"userns"
305+
]
306+
self.assertEqual(expected_userns, actual_userns)
307+
260308
def test_create_unsupported_key(self):
261309
with self.assertRaises(TypeError):
262310
self.client.containers.create("fedora", "/usr/bin/ls", blkio_weight=100.0)

0 commit comments

Comments
 (0)