From 0dcbb2c58231264c2f0a0374733b5e9cf8747e1f Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Fri, 26 Apr 2024 06:05:57 +0200 Subject: Merging upstream version 9.5.1+dfsg. Signed-off-by: Daniel Baumann --- .../containers/podman/CHANGELOG.rst | 52 + ansible_collections/containers/podman/FILES.json | 1127 ++++++++++---------- .../containers/podman/MANIFEST.json | 4 +- .../containers/podman/changelogs/changelog.yaml | 33 + .../containers/podman/docs/buildah_connection.html | 2 +- .../containers/podman/docs/index.html | 2 +- .../containers/podman/docs/objects.inv | Bin 6943 -> 7128 bytes .../containers/podman/docs/podman_connection.html | 2 +- .../podman/docs/podman_container_exec_module.html | 18 +- .../podman/docs/podman_container_info_module.html | 2 +- .../podman/docs/podman_container_module.html | 105 +- .../podman/docs/podman_containers_module.html | 2 +- .../podman/docs/podman_export_module.html | 2 +- .../docs/podman_generate_systemd_module.html | 3 +- .../podman/docs/podman_image_info_module.html | 4 +- .../podman/docs/podman_image_module.html | 42 +- .../podman/docs/podman_import_module.html | 2 +- .../containers/podman/docs/podman_load_module.html | 2 +- .../podman/docs/podman_login_info_module.html | 2 +- .../podman/docs/podman_login_module.html | 2 +- .../podman/docs/podman_logout_module.html | 2 +- .../podman/docs/podman_network_info_module.html | 2 +- .../podman/docs/podman_network_module.html | 36 +- .../containers/podman/docs/podman_play_module.html | 51 +- .../podman/docs/podman_pod_info_module.html | 2 +- .../containers/podman/docs/podman_pod_module.html | 50 +- .../podman/docs/podman_prune_module.html | 2 +- .../podman/docs/podman_runlabel_module.html | 2 +- .../containers/podman/docs/podman_save_module.html | 2 +- .../podman/docs/podman_secret_info_module.html | 2 +- .../podman/docs/podman_secret_module.html | 2 +- .../containers/podman/docs/podman_tag_module.html | 2 +- .../podman/docs/podman_unshare_become.html | 2 +- .../podman/docs/podman_volume_info_module.html | 2 +- .../podman/docs/podman_volume_module.html | 39 +- .../module_utils/podman/podman_container_lib.py | 30 +- .../plugins/module_utils/podman/podman_pod_lib.py | 49 +- .../podman/plugins/module_utils/podman/quadlet.py | 636 +++++++++++ .../podman/plugins/modules/podman_container.py | 36 + .../plugins/modules/podman_container_exec.py | 14 +- .../plugins/modules/podman_generate_systemd.py | 1 + .../podman/plugins/modules/podman_image.py | 45 +- .../podman/plugins/modules/podman_image_info.py | 2 +- .../podman/plugins/modules/podman_login.py | 5 +- .../podman/plugins/modules/podman_network.py | 41 +- .../podman/plugins/modules/podman_play.py | 100 +- .../podman/plugins/modules/podman_pod.py | 33 +- .../podman/plugins/modules/podman_pod_info.py | 7 +- .../podman/plugins/modules/podman_volume.py | 45 +- .../targets/podman_container/tasks/main.yml | 277 ++++- .../targets/podman_container_exec/tasks/main.yml | 20 + .../podman_container_idempotency/tasks/main.yml | 20 + .../tasks/rootless-podman-network.yml | 139 ++- .../targets/podman_generate_systemd/tasks/main.yml | 11 +- .../targets/podman_image/tasks/main.yml | 128 +++ .../targets/podman_network/tasks/main.yml | 125 +++ .../targets/podman_play/tasks/files/multi-yaml.yml | 27 + .../integration/targets/podman_play/tasks/main.yml | 184 +++- .../targets/podman_play/tasks/play-multi-yaml.yml | 40 + .../targets/podman_play/tasks/play-with-build.yml | 3 + .../podman_play/tasks/play-with-options.yml | 4 + .../integration/targets/podman_pod/tasks/main.yml | 332 +++++- .../targets/podman_pod/tasks/resource-limit.yml | 3 + .../targets/podman_prune/tasks/main.yml | 16 + .../targets/podman_volume/tasks/main.yml | 128 +++ .../containers/podman/tests/sanity/ignore-2.10.txt | 1 + .../containers/podman/tests/sanity/ignore-2.11.txt | 1 + .../containers/podman/tests/sanity/ignore-2.12.txt | 1 + .../containers/podman/tests/sanity/ignore-2.13.txt | 1 + .../containers/podman/tests/sanity/ignore-2.14.txt | 1 + .../containers/podman/tests/sanity/ignore-2.15.txt | 1 + .../containers/podman/tests/sanity/ignore-2.16.txt | 1 + .../containers/podman/tests/sanity/ignore-2.17.txt | 1 + .../containers/podman/tests/sanity/ignore-2.18.txt | 1 + .../containers/podman/tests/sanity/ignore-2.9.txt | 1 + 75 files changed, 3340 insertions(+), 777 deletions(-) create mode 100644 ansible_collections/containers/podman/plugins/module_utils/podman/quadlet.py create mode 100644 ansible_collections/containers/podman/tests/integration/targets/podman_play/tasks/files/multi-yaml.yml create mode 100644 ansible_collections/containers/podman/tests/integration/targets/podman_play/tasks/play-multi-yaml.yml (limited to 'ansible_collections/containers') diff --git a/ansible_collections/containers/podman/CHANGELOG.rst b/ansible_collections/containers/podman/CHANGELOG.rst index 7f94f59cc..84fa3621b 100644 --- a/ansible_collections/containers/podman/CHANGELOG.rst +++ b/ansible_collections/containers/podman/CHANGELOG.rst @@ -5,6 +5,58 @@ Ansible Podman modules and plugins Release Notes .. contents:: Topics +v1.13.0 +======= + +Release Summary +--------------- + +Quadlet support for Podman + +Major Changes +------------- + +- Add quadlet support for Podman modules + +Bugfixes +-------- + +- Fix pod info for non-existant pods + +v1.12.1 +======= + +Release Summary +--------------- + +Support for Podman v5 and bugfixes + +Minor Changes +------------- + +- CI - Fix rootfs test in CI +- CI - add custom podman path to tasks +- CI - add parametrized executables to tests +- podman_container - Add pasta as default network mode after v5 +- podman_container_exec - Return data for podman exec module +- podman_generate_systemd - Fix broken example for podman_generate_systemd (#708) +- podman_login - Update podman_login.py +- podman_play - Add support for kube yaml files with multi-documents (#724) +- podman_play - Update the logic for deleting pods/containers in podman_play +- podman_pod_info - handle return being list in Podman 5 (#713) + +Bugfixes +-------- + +- podman_container - Add check and fixed for v5 network diff +- podman_container - Fix pasta networking idempotency for v5 (#728) +- podman_container_exec - Remove unnecessary quotes in podman_container_exec module +- podman_image_info - Fix wrong return data type in podman_image_info +- podman_play - Fix kube play annotations +- podman_pod - Fix broken info of pods in Podman v5 +- podman_pod - Fix pod for Podman v5 +- podman_pod - Fix podman pod v5 broken info issue + v1.12.0 ======= diff --git a/ansible_collections/containers/podman/FILES.json b/ansible_collections/containers/podman/FILES.json index 717a994c3..ebc8fb138 100644 --- a/ansible_collections/containers/podman/FILES.json +++ b/ansible_collections/containers/podman/FILES.json @@ -8,101 +8,80 @@ "format": 1 }, { - "name": "setup.py", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "85ef52c56819164efc5178d25aa03a432cdb8431ad0c99255802ce19a1719602", - "format": 1 - }, - { - "name": "test-requirements.txt", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "9b72b7289eba420f51eb614c54f609181bb26e96caef2abf06c02339a77d2e08", + "name": "docs", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, "format": 1 }, { - "name": "changelogs", + "name": "docs/_static", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "changelogs/config.yaml", + "name": "docs/_static/pygments.css", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "72cc16b684890f4595ab75ffdd6f80f5ae19bc84cbb2d82606bc840eb7842209", + "chksum_sha256": "6f6d5ca74e8fbc721d70c8db260ab4ac75b69316daa3854a4614d9f3b2ff0631", "format": 1 }, { - "name": "changelogs/changelog.yaml", + "name": "docs/_static/minus.png", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "1bb58fab4d48702b87006c6ac9577c634e8f42aef65280dbca266caf6468d50b", - "format": 1 - }, - { - "name": "meta", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, + "chksum_sha256": "47e7fc50db3699f1ca41ce9a2ffa202c00c5d1d5180c55f62ba859b1bd6cc008", "format": 1 }, { - "name": "meta/runtime.yml", + "name": "docs/_static/documentation_options.js", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "f07aa47b7583a6a8420798081029b8cdfb09cbf5564acff6f49b6c3237102618", - "format": 1 - }, - { - "name": "docs", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, + "chksum_sha256": "e2718b75af040caf95a8915192026ec541cc7ad4c73b0160b7c4c2f4564d7d4f", "format": 1 }, { - "name": "docs/_static", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, + "name": "docs/_static/language_data.js", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "95b1d44e1ba5a3155d89f8427a3b2c981158f956bf48b9cdf0030265e8b7a609", "format": 1 }, { - "name": "docs/_static/custom.css", + "name": "docs/_static/underscore-1.13.1.js", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "39f23a6561786e3cb4e33e4a96562a1305a8b74c0d45dc215a64018692cd5d4c", + "chksum_sha256": "cc10f799cd0f6b65f95c4012445497e5ba3cb9f51964a9468940b27bde98b487", "format": 1 }, { - "name": "docs/_static/sphinx_highlight.js", + "name": "docs/_static/jquery-3.6.0.js", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "0a20464b65797522de18421a7db1a0851a26aae6dd06b7109d442236313c27ee", + "chksum_sha256": "1fe2bb5390a75e5d61e72c107cab528fc3c29a837d69aab7d200e1dbb5dcd239", "format": 1 }, { - "name": "docs/_static/documentation_options.js", + "name": "docs/_static/alabaster.css", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "e2718b75af040caf95a8915192026ec541cc7ad4c73b0160b7c4c2f4564d7d4f", + "chksum_sha256": "13f494414f5bca3551442ddf4ad0e42e2403a8757304c1b9787b18ef539a2eac", "format": 1 }, { - "name": "docs/_static/pygments.css", + "name": "docs/_static/custom.css", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "6f6d5ca74e8fbc721d70c8db260ab4ac75b69316daa3854a4614d9f3b2ff0631", + "chksum_sha256": "39f23a6561786e3cb4e33e4a96562a1305a8b74c0d45dc215a64018692cd5d4c", "format": 1 }, { - "name": "docs/_static/alabaster.css", + "name": "docs/_static/underscore-1.3.1.js", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "13f494414f5bca3551442ddf4ad0e42e2403a8757304c1b9787b18ef539a2eac", + "chksum_sha256": "f808f0aa32fbe90fb9c9c846917faff3fdd4e236c284b76c02dd33753dc90177", "format": 1 }, { @@ -113,17 +92,17 @@ "format": 1 }, { - "name": "docs/_static/jquery-3.6.0.js", + "name": "docs/_static/file.png", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "1fe2bb5390a75e5d61e72c107cab528fc3c29a837d69aab7d200e1dbb5dcd239", + "chksum_sha256": "5c4bc9a16aebf38c4b950f59b8e501ca36495328cb9eb622218bce9064a35e3e", "format": 1 }, { - "name": "docs/_static/searchtools.js", + "name": "docs/_static/jquery-3.5.1.js", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "5b9facbcb36e5e15e409e2db42439fb8cbc1e43275e337a645bb3c76c3191b93", + "chksum_sha256": "416a3b2c3bf16d64f6b5b6d0f7b079df2267614dd6847fc2f3271b4409233c37", "format": 1 }, { @@ -134,24 +113,24 @@ "format": 1 }, { - "name": "docs/_static/language_data.js", + "name": "docs/_static/basic.css", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "95b1d44e1ba5a3155d89f8427a3b2c981158f956bf48b9cdf0030265e8b7a609", + "chksum_sha256": "9980fa28cbdcd8d6b437edcb1a911e0e2a788d7fa0dfe6ea25a302d824a3094d", "format": 1 }, { - "name": "docs/_static/underscore-1.3.1.js", + "name": "docs/_static/doctools.js", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "f808f0aa32fbe90fb9c9c846917faff3fdd4e236c284b76c02dd33753dc90177", + "chksum_sha256": "3d62b81f63b0418a39a8f5a323203d88ddafc8c5226f86d311970025d86d7b6c", "format": 1 }, { - "name": "docs/_static/basic.css", + "name": "docs/_static/plus.png", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "9980fa28cbdcd8d6b437edcb1a911e0e2a788d7fa0dfe6ea25a302d824a3094d", + "chksum_sha256": "54115199b96a130cba02147c47c0deb43dcc9b9f08b5162bba8642b34980ac63", "format": 1 }, { @@ -162,206 +141,206 @@ "format": 1 }, { - "name": "docs/_static/jquery-3.5.1.js", + "name": "docs/_static/antsibull-minimal.css", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "416a3b2c3bf16d64f6b5b6d0f7b079df2267614dd6847fc2f3271b4409233c37", + "chksum_sha256": "dd914facd58095fed7317de336bdf32ac00ff3de539432463df397d2ae15a696", "format": 1 }, { - "name": "docs/_static/doctools.js", + "name": "docs/_static/sphinx_highlight.js", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "3d62b81f63b0418a39a8f5a323203d88ddafc8c5226f86d311970025d86d7b6c", + "chksum_sha256": "0a20464b65797522de18421a7db1a0851a26aae6dd06b7109d442236313c27ee", "format": 1 }, { - "name": "docs/_static/underscore-1.13.1.js", + "name": "docs/_static/searchtools.js", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "cc10f799cd0f6b65f95c4012445497e5ba3cb9f51964a9468940b27bde98b487", + "chksum_sha256": "5b9facbcb36e5e15e409e2db42439fb8cbc1e43275e337a645bb3c76c3191b93", "format": 1 }, { - "name": "docs/_static/plus.png", + "name": "docs/podman_secret_info_module.html", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "54115199b96a130cba02147c47c0deb43dcc9b9f08b5162bba8642b34980ac63", + "chksum_sha256": "afbe8b5e852d8ac13eda2acb5a4424bbe50e04775b182de9c73acdbd4e4572c3", "format": 1 }, { - "name": "docs/_static/antsibull-minimal.css", + "name": "docs/podman_prune_module.html", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "dd914facd58095fed7317de336bdf32ac00ff3de539432463df397d2ae15a696", + "chksum_sha256": "52583bf414f29d8a289f7844bb87e870e438eb4c680fe6efe3b84ac9b24919cf", "format": 1 }, { - "name": "docs/_static/minus.png", + "name": "docs/podman_container_exec_module.html", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "47e7fc50db3699f1ca41ce9a2ffa202c00c5d1d5180c55f62ba859b1bd6cc008", + "chksum_sha256": "3c7a400e7e16df1d1904f5dad17d5358e90a95e8ae611072a7cc4b2fd19b0f70", "format": 1 }, { - "name": "docs/_static/file.png", + "name": "docs/podman_unshare_become.html", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "5c4bc9a16aebf38c4b950f59b8e501ca36495328cb9eb622218bce9064a35e3e", + "chksum_sha256": "6caccafc43ebbbeb0c043d2e8a2fa2c8736166a0f94a117514eed3be946685ec", "format": 1 }, { - "name": "docs/.nojekyll", + "name": "docs/objects.inv", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "chksum_sha256": "4e8f308bf4441db6759e6d8a1b54535cf24e77f1ecee4d66caf6b5582f79efa7", "format": 1 }, { - "name": "docs/podman_runlabel_module.html", + "name": "docs/podman_image_info_module.html", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "bd2c799ac88932287c4882a8eb6df2658a00db7555612154b0eca97045f11e73", + "chksum_sha256": "e8b61d10e778183647fd7b720d030addce99763e759ad1eb7daa14ece8b9913b", "format": 1 }, { - "name": "docs/podman_image_module.html", + "name": "docs/podman_secret_module.html", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "ad81d2bc548a343fbc3d4a3a05b1c33d2d68e25e508f2693a701e6f01dcf417b", + "chksum_sha256": "62e01ebdfbc9e2a163c747e013c5aa3ec7219b3bb260147a929080d445f0dbbd", "format": 1 }, { - "name": "docs/podman_container_exec_module.html", + "name": "docs/podman_network_info_module.html", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "883fc959057af7f386aa0660220cab0747ecac6eb6d407b94d2df2dc35c74a7e", + "chksum_sha256": "b5763fa0a99790ef332056f61dc499b455de1a37349d006289427922aae21395", "format": 1 }, { - "name": "docs/podman_container_info_module.html", + "name": "docs/podman_image_module.html", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "1586177c16bee40047743f246310abd28bb7b51abd946c720b8470a22b5bd749", + "chksum_sha256": "9b6b1b68675c355b8306fae41e7a399d1c203028b18aab10e2515c710f4a9a13", "format": 1 }, { - "name": "docs/podman_play_module.html", + "name": "docs/podman_volume_module.html", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "24e23f870e9fe67c6ef322ec6b2ccfae6bc050c15bbf8dda518db96f144326db", + "chksum_sha256": "9eb4b8acf3aecbd24f06e73c0b9d52370377032f5884327f4bb7de0483d2db2f", "format": 1 }, { - "name": "docs/podman_containers_module.html", + "name": "docs/podman_load_module.html", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "1178735f6fadfbf2d7cbd4985b604aaa430546edafa114af5e3d20dc04e5460a", + "chksum_sha256": "4532a90f7cba943ba79959f0cd05af85c790bdd51f30888de95861e60ab77bd0", "format": 1 }, { - "name": "docs/podman_pod_info_module.html", + "name": "docs/podman_runlabel_module.html", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "f2ffd379e0f542e651766415c6287f569f2dd42ee5a3e9933684bc250b0d11fd", + "chksum_sha256": "4089cfd62f3250303175edaac0e1b9ed017e7dcfa8ebd11c334862e5e4be6324", "format": 1 }, { - "name": "docs/podman_login_info_module.html", + "name": "docs/podman_play_module.html", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "ce4892819aba341084ce055cc05d9bb5bb613e266f3efe4a2052da2aa20094ca", + "chksum_sha256": "ef65885a17acc3bfcabad46054472594f0fb7cc3968e8d25746bff6bf99722da", "format": 1 }, { - "name": "docs/buildah_connection.html", + "name": "docs/podman_container_module.html", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "881d9972167f058e968516dbc4fe01bc1cea54a16fb0e6f9de03addf58ca7fc8", + "chksum_sha256": "538fd60bc9d58b266c163ed7ac7bcf3305dc787935222f7f2c4c9e112a4cf30b", "format": 1 }, { - "name": "docs/podman_import_module.html", + "name": "docs/podman_containers_module.html", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "5b288cf15269fc040df5d04a3ae7e96c08635006c9322b53c1675e5c6d44ee81", + "chksum_sha256": "c929fa197c9e07d10d05101e6472dcdef409ced23a50da5918ec4841a4e50d08", "format": 1 }, { - "name": "docs/podman_unshare_become.html", + "name": "docs/index.html", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "79fa1444a95d81dc3a7dbdd1c4796fdb14e277e787b96b7229a3fe0561c862d1", + "chksum_sha256": "a05292a1b3cd446a6ea3667d7519b521dc50c7efc04fd3b1af4d42dc219fe37d", "format": 1 }, { - "name": "docs/podman_volume_module.html", + "name": "docs/podman_logout_module.html", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "cf2a4a5caff2f79ccc6e51d9bdfee1484b24523fd31b9f6a058bd2bf3f741470", + "chksum_sha256": "4d81428e5df90da2490fd620e3af3b1a1ddd347b086cee77dff057a580267002", "format": 1 }, { "name": "docs/podman_save_module.html", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "c7ce5ddbc8c5d95d67fb1d7d90d6393f772a256f1f76a7b71062e4f9f177c847", + "chksum_sha256": "5cf2070ca153d3bf60ea9e0440ffb1b72b847e32565a3fd8f953ca7de24a9586", "format": 1 }, { - "name": "docs/podman_generate_systemd_module.html", + "name": "docs/genindex.html", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "4e5d799252e205b60924cd5158976f71995f5e4e06edd348bb0fa608199dfcef", + "chksum_sha256": "267654c6dfb8d96914725b0bd774e09c72dfdcfb065ae073f9fc732b01b543d0", "format": 1 }, { - "name": "docs/searchindex.js", + "name": "docs/podman_network_module.html", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "68a79c703ad84cc805f3945b454e0871f6e2562c6e75ec6f20702a8c1a96a6fa", + "chksum_sha256": "367a0a1343aa808bb256561200464764dc2b165271d028b1508d95b6b7251410", "format": 1 }, { - "name": "docs/podman_container_module.html", + "name": "docs/buildah_connection.html", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "c9489eb47093750ec7c7780a6e6fcd84041f34b115371e7300df05af4ae3b112", + "chksum_sha256": "a2f915dd35461f1a8d9806999382c0976f9b1fe03e2fe7b3e1973e20a46157b1", "format": 1 }, { - "name": "docs/podman_network_info_module.html", + "name": "docs/searchindex.js", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "50a9aa361b09cbeb8311501040429f537223523ac993cc29e8e841c1a330b338", + "chksum_sha256": "668d68ce702cf98c3d9cbc91d08d64a1fda5060257ad8393f99b06fe0de1d9a7", "format": 1 }, { - "name": "docs/podman_logout_module.html", + "name": "docs/podman_container_info_module.html", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "980d9040d448274ca106e7e3ea1a2d7e8781a83518bcf30acb4f088f9a8e5585", + "chksum_sha256": "13dc267968457dd4b2271a4a03b497d80354ed3aadb843c4ce0a8829f7ae99e5", "format": 1 }, { - "name": "docs/objects.inv", + "name": "docs/podman_tag_module.html", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "d0b13de8051aab95f660ee9e17f976cc53853a562fead4c6e95ac30562f6252d", + "chksum_sha256": "176e3fedadbfe0c2bd801ac7b2ad9d90027b76d33a2cb28a2fef572e4e7846fc", "format": 1 }, { - "name": "docs/podman_load_module.html", + "name": "docs/environment_variables.html", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "0c34f66544c9547d6873175f5f828992f22eb7180ed2867f7e1b113495e832d1", + "chksum_sha256": "754ab0bc744fd2f640f433d8ec17c4520c35bf5985108501b479b3653fe3c0d0", "format": 1 }, { - "name": "docs/podman_tag_module.html", + "name": "docs/podman_volume_info_module.html", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "b0318bb65447c742ad02998a8e0ec8c3b322fb552fdcc97c86d0d5aa94b0511d", + "chksum_sha256": "b8a2a6fad503cd6adb9160e77bb2f31118bf0daa6d977fa03759e28eb6c3f131", "format": 1 }, { @@ -372,124 +351,124 @@ "format": 1 }, { - "name": "docs/podman_pod_module.html", + "name": "docs/podman_login_info_module.html", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "291e6c4c92da12468197580b183b4e33f3764f2363c21d811318fbd5fdad31d4", + "chksum_sha256": "94a726afed1d890e8b184d3084ca0c0070313a067b90dfdbc542b55ecdeea1ca", "format": 1 }, { - "name": "docs/podman_network_module.html", + "name": "docs/podman_login_module.html", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "c0e41390cf13ce9e63c26d28fbb7c919ddba089f32405bd1c86144dbe25fec98", + "chksum_sha256": "c66423dcc7cc34aed5e2d110a4a874fbd6540cc6f1612e86c33406c919bcf79c", "format": 1 }, { - "name": "docs/podman_image_info_module.html", + "name": "docs/podman_pod_info_module.html", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "8052d065501c86d3fce53e1a870b257b1b120d4cee5787d65b09e33a8dcb3cc5", + "chksum_sha256": "a28ac5a8b511831dfa23f72c1f9bb344ef8ba447b35fa5324abb75d01c48c229", "format": 1 }, { - "name": "docs/podman_secret_module.html", + "name": "docs/podman_export_module.html", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "1aa857495902d922a8d34cc1f99ea5ed5832bba967598980ee126d3e2d672194", + "chksum_sha256": "678fc32756bc2c3bfe8666d9b32144bcee1371e213e1885abea262bee7da0b86", "format": 1 }, { - "name": "docs/genindex.html", + "name": "docs/podman_import_module.html", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "267654c6dfb8d96914725b0bd774e09c72dfdcfb065ae073f9fc732b01b543d0", + "chksum_sha256": "efe1e379667f9f72c2d6b68dac89fce6a21b1c2bed58e6159a8da49fa343c7c0", "format": 1 }, { - "name": "docs/podman_login_module.html", + "name": "docs/podman_generate_systemd_module.html", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "f85b0efcef6198ef699a371ba9cdfe4dd13563fd1982e82b9d5faaa47be08324", + "chksum_sha256": "a39b726dd24891ea2baed0fa82f0d6441a8de98ec924a34f1429d8f3b5c0db90", "format": 1 }, { - "name": "docs/index.html", + "name": "docs/podman_pod_module.html", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "5b7c42262b9c12a137d255adf2a28983e897e6651689f7a49573b919d32e0722", + "chksum_sha256": "8df83296245cffb0523875e8045091ef06d9052f1c0193d48c4e4f6fb43ff3fb", "format": 1 }, { - "name": "docs/environment_variables.html", + "name": "docs/.nojekyll", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "754ab0bc744fd2f640f433d8ec17c4520c35bf5985108501b479b3653fe3c0d0", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "format": 1 }, { - "name": "docs/podman_export_module.html", + "name": "docs/podman_connection.html", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "ba113aee00093ea0a28f737e4b0d628c509ac7a901714b33e921faba02ab1b22", + "chksum_sha256": "163a4dd0ca2c99c1d58fe2e2400f9c4b3b431feb5913408185a6d175ad5f23e7", "format": 1 }, { - "name": "docs/podman_volume_info_module.html", + "name": "Makefile", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "a4aebadb3c98b409f3b467ef8c4bccdc58d0368ec499779854c1dd888cd452ef", + "chksum_sha256": "77424e5d6417f24ffd8e4d00d85e942ba4eaa912129ae01f5f4e26a2e2500d2d", "format": 1 }, { - "name": "docs/podman_prune_module.html", + "name": "ansible-collection-containers-podman.spec", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "df4a1997ae54270f03a880ab39fd691e19b14ed22c1840605b54481168894738", + "chksum_sha256": "78cf0e2fef0e96de69fd18ab38b358a03a22a5ce2e0ecafbd149407d6bcafb47", "format": 1 }, { - "name": "docs/podman_secret_info_module.html", + "name": "setup.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "02c6ca29827997e672d37dc06699e7ef832c7d5738ed3e93e592a00c6de05804", + "chksum_sha256": "85ef52c56819164efc5178d25aa03a432cdb8431ad0c99255802ce19a1719602", "format": 1 }, { - "name": "docs/podman_connection.html", + "name": "README.md", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "0b3c0bf86d855ce3b4341bf6f72a5ea3e6300c09ca88d793ca3b149175eaa30c", + "format": 1 + }, + { + "name": "CODE-OF-CONDUCT.md", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "f8c5acf0a527705c23c59bc4153c6f24a825d1ce2bd77b4672ff185ab34d4b61", + "chksum_sha256": "5b42ff686c8d61fc9879d2512a9fa01f8810a7274318e7952ad3322eeea02f11", "format": 1 }, { - "name": "CHANGELOG.rst", + "name": "SECURITY.md", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "96fa1187145da3dfde0d211ecf989620afdaf7e7f43970273741cb962be65dde", + "chksum_sha256": "b73dc04e41dbb3774a3244e8e40d13eb97d169caa3e1230a622e077d60c1edd9", "format": 1 }, { - "name": "plugins", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, + "name": "COPYING", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "3972dc9744f6499f0f9b2dbf76696f2ae7ad8af9b23dde66d6af86c9dfb36986", "format": 1 }, { - "name": "plugins/become", + "name": "plugins", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, - { - "name": "plugins/become/podman_unshare.py", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "2dab878a68742976acd46a1310a37e9e0777b1953f86ee31dd9e0a29e9dfc3f3", - "format": 1 - }, { "name": "plugins/connection", "ftype": "dir", @@ -526,108 +505,108 @@ "format": 1 }, { - "name": "plugins/modules/podman_volume_info.py", + "name": "plugins/modules/podman_generate_systemd.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "eb8cf9d38d438d24589d547458f4c0ba8341f687eb8a1ded30de1fc0b8933c83", + "chksum_sha256": "262b7b1263967adfa45d98192ac38169e51026db3b60eac7b365dc81bbd7b784", "format": 1 }, { - "name": "plugins/modules/podman_import.py", + "name": "plugins/modules/podman_login_info.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "9b17de1350a59abf3d1dd3b6faa6b7a66e7085bb06746027bee22be1371ba5b5", + "chksum_sha256": "e8f615071a379d21b8f012a60c24036c4812239faf8e6aea2be6e5ca21bbcc4f", "format": 1 }, { - "name": "plugins/modules/podman_secret.py", + "name": "plugins/modules/podman_export.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "6b19a2f4453349e74339f952ca4d86512b55e792c3ed8d991ec7a681ec1de850", + "chksum_sha256": "48a73c06e5fe4b1f1d4cd70262d32559a13e73eda7012ea5c074fdbabbc2470a", "format": 1 }, { - "name": "plugins/modules/podman_load.py", + "name": "plugins/modules/podman_network_info.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "96694bda39431f44186d599db567446d72debdf52a4a5c51f5fd66fa515229fc", + "chksum_sha256": "9beb6e0c733ca304f38f95116dfd89569df21a68428039ef59ec9650314c5222", "format": 1 }, { - "name": "plugins/modules/podman_export.py", + "name": "plugins/modules/podman_image_info.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "48a73c06e5fe4b1f1d4cd70262d32559a13e73eda7012ea5c074fdbabbc2470a", + "chksum_sha256": "30d4db967b76884039d8ccaaf99f098e86b85efd9bef6bc0ceea4b8292905e6b", "format": 1 }, { - "name": "plugins/modules/podman_prune.py", + "name": "plugins/modules/podman_container_info.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "214aa5244363a5d1e8423c82a770e5c02f7dfc331b8756607a567995e6d6ec50", + "chksum_sha256": "c0ccb2118efb225624f13e01c499eec274d0d864fd151cca94e0128e994d4b5e", "format": 1 }, { - "name": "plugins/modules/podman_volume.py", + "name": "plugins/modules/podman_pod.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "880e428a2c953a1b550330b8e70159b775166dd21547056e75d64650c0892091", + "chksum_sha256": "32d5458b844ee1798d4abdc5384dc9b1056bd3a3585e6e38b48bfd3bd0ea43f5", "format": 1 }, { - "name": "plugins/modules/podman_pod.py", + "name": "plugins/modules/podman_container.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "c2f505a53d4948d78ada958c5f33d94f5a703c684b97e12f47b5837654a55575", + "chksum_sha256": "ada302bbc6c4378e586edc7f0e2c0d9e78b161f325b7d886bfa9ee4deeb41882", "format": 1 }, { - "name": "plugins/modules/podman_image.py", + "name": "plugins/modules/podman_prune.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "03afa78794f979607671d9ce4676e1e51daa11fb1f706a2d3dbb498b2cee16bd", + "chksum_sha256": "214aa5244363a5d1e8423c82a770e5c02f7dfc331b8756607a567995e6d6ec50", "format": 1 }, { - "name": "plugins/modules/podman_container.py", + "name": "plugins/modules/podman_secret.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "f31967e1063756efda806e7645d28c0d7bf1d794f92302c79d907dd44f2f3b68", + "chksum_sha256": "6b19a2f4453349e74339f952ca4d86512b55e792c3ed8d991ec7a681ec1de850", "format": 1 }, { - "name": "plugins/modules/podman_save.py", + "name": "plugins/modules/podman_tag.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "ddb55cc96d2a174a1f2e61fcd22a435b11394d53199bd2afeca374139a43be2c", + "chksum_sha256": "f748d6640b2cd18ac2caaf0a9d74917c1f139649df48dd514a11d8a1e7abc7cf", "format": 1 }, { - "name": "plugins/modules/podman_play.py", + "name": "plugins/modules/__init__.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "453838a1c683a4e7e9cbc2e72f7ad8912961a16e87c3aa2d3ed3319fb934eb90", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "format": 1 }, { - "name": "plugins/modules/podman_network_info.py", + "name": "plugins/modules/podman_logout.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "9beb6e0c733ca304f38f95116dfd89569df21a68428039ef59ec9650314c5222", + "chksum_sha256": "7cc7da9cf123ffb9180e98f2fe5704f628831d44014efd25c48cedd1c28a9b7c", "format": 1 }, { - "name": "plugins/modules/__init__.py", + "name": "plugins/modules/podman_load.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "chksum_sha256": "96694bda39431f44186d599db567446d72debdf52a4a5c51f5fd66fa515229fc", "format": 1 }, { - "name": "plugins/modules/podman_login_info.py", + "name": "plugins/modules/podman_save.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "e8f615071a379d21b8f012a60c24036c4812239faf8e6aea2be6e5ca21bbcc4f", + "chksum_sha256": "ddb55cc96d2a174a1f2e61fcd22a435b11394d53199bd2afeca374139a43be2c", "format": 1 }, { @@ -638,80 +617,80 @@ "format": 1 }, { - "name": "plugins/modules/podman_image_info.py", + "name": "plugins/modules/podman_pod_info.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "d79ccfb526e599404fcb618d04195f8c7fa8158a7cce1f2d5d592b626a6976e2", + "chksum_sha256": "dae42675e5739995587997d9d2475219339f222053a99a121f28270444f717b9", "format": 1 }, { - "name": "plugins/modules/podman_network.py", + "name": "plugins/modules/podman_container_exec.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "ca507252b965895a3ed3e24ccbb28541700212ac0f2b340abb901b35a909d760", + "chksum_sha256": "936c9c3ff873c18d2283dd352e6dbaaf46c228678db474dd88eb9df1e824d833", "format": 1 }, { - "name": "plugins/modules/podman_containers.py", + "name": "plugins/modules/podman_login.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "166b573ae344ccf93b2e33703fc8d8eeb1cd5e251eba40a95ba037cad4716b7a", + "chksum_sha256": "1414953f8525bcfa294fb57d70565a02ede619e29ef256d88c34bdb6b2712fb3", "format": 1 }, { - "name": "plugins/modules/podman_generate_systemd.py", + "name": "plugins/modules/podman_play.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "54348fd0d118db0d4f7596c60250814aa61ef9dc2a4bae74522bf61287fa35a7", + "chksum_sha256": "1fef01d23b5083bd5687f63d23e3e692fe0230f73e9a59da523fd8ce8be3509d", "format": 1 }, { - "name": "plugins/modules/podman_container_info.py", + "name": "plugins/modules/podman_containers.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "c0ccb2118efb225624f13e01c499eec274d0d864fd151cca94e0128e994d4b5e", + "chksum_sha256": "166b573ae344ccf93b2e33703fc8d8eeb1cd5e251eba40a95ba037cad4716b7a", "format": 1 }, { - "name": "plugins/modules/podman_logout.py", + "name": "plugins/modules/podman_import.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "7cc7da9cf123ffb9180e98f2fe5704f628831d44014efd25c48cedd1c28a9b7c", + "chksum_sha256": "9b17de1350a59abf3d1dd3b6faa6b7a66e7085bb06746027bee22be1371ba5b5", "format": 1 }, { - "name": "plugins/modules/podman_secret_info.py", + "name": "plugins/modules/podman_volume_info.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "d6254c8325c6ff5fffb632062f7401d8a1a94d5f1786691e88bee07fe26734f9", + "chksum_sha256": "eb8cf9d38d438d24589d547458f4c0ba8341f687eb8a1ded30de1fc0b8933c83", "format": 1 }, { - "name": "plugins/modules/podman_login.py", + "name": "plugins/modules/podman_secret_info.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "54abe75a9053423a2189bdadee8b0e6c9b8f530ba82523a8024ea211626ecde2", + "chksum_sha256": "d6254c8325c6ff5fffb632062f7401d8a1a94d5f1786691e88bee07fe26734f9", "format": 1 }, { - "name": "plugins/modules/podman_pod_info.py", + "name": "plugins/modules/podman_network.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "18e5fd6f6142467654af44f458a13c662d3beb2fa7957b137cbc13852cfcb440", + "chksum_sha256": "28e23bfd5e1a689ec64ecd78dc5c2ade91064cc8db4523e2a3c84b3f0a527f09", "format": 1 }, { - "name": "plugins/modules/podman_container_exec.py", + "name": "plugins/modules/podman_volume.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "071bce898ea72b63aff4d47909fd191bbdbdca0f53fb6813b48c1b4ace95478a", + "chksum_sha256": "b6807a2c1cbb53a163eb761017d9cc4af0e22a7b151c78e73be0d1cdf6822d61", "format": 1 }, { - "name": "plugins/modules/podman_tag.py", + "name": "plugins/modules/podman_image.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "f748d6640b2cd18ac2caaf0a9d74917c1f139649df48dd514a11d8a1e7abc7cf", + "chksum_sha256": "61096d944871085194097913b73ad99565cb445245366fa19067f3a279e6fe56", "format": 1 }, { @@ -732,14 +711,14 @@ "name": "plugins/module_utils/podman/podman_pod_lib.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "2d25257e5aa77d26f60370d64385254353450c6ef9b86b1a442723a7adf8e1f8", + "chksum_sha256": "0c5f4b77c737bc856aef858fe0515bcc2351dec0b1beacff3772a441a280d2fe", "format": 1 }, { - "name": "plugins/module_utils/podman/__init__.py", + "name": "plugins/module_utils/podman/quadlet.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "chksum_sha256": "5574a455e924ea0eb4d8dd50cb0e04d86ee0ad3507826626be66bec766863c60", "format": 1 }, { @@ -749,11 +728,18 @@ "chksum_sha256": "0faf94fa1606dc1a67c73def618c0e4c366ef60ff26723d1613c1f157cc5bb32", "format": 1 }, + { + "name": "plugins/module_utils/podman/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, { "name": "plugins/module_utils/podman/podman_container_lib.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "ab338a3648ebff54756f05cd349d74d686f626884db95440dba379232c40ea34", + "chksum_sha256": "8a80171364990a53ad52201232c9bee988d2f02a91f0883e862c533a06b5730a", "format": 1 }, { @@ -764,10 +750,31 @@ "format": 1 }, { - "name": "COPYING", + "name": "plugins/become", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/become/podman_unshare.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "3972dc9744f6499f0f9b2dbf76696f2ae7ad8af9b23dde66d6af86c9dfb36986", + "chksum_sha256": "2dab878a68742976acd46a1310a37e9e0777b1953f86ee31dd9e0a29e9dfc3f3", + "format": 1 + }, + { + "name": "meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "meta/runtime.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "f07aa47b7583a6a8420798081029b8cdfb09cbf5564acff6f49b6c3237102618", "format": 1 }, { @@ -778,17 +785,45 @@ "format": 1 }, { - "name": "Makefile", + "name": "changelogs", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "changelogs/config.yaml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "77424e5d6417f24ffd8e4d00d85e942ba4eaa912129ae01f5f4e26a2e2500d2d", + "chksum_sha256": "72cc16b684890f4595ab75ffdd6f80f5ae19bc84cbb2d82606bc840eb7842209", "format": 1 }, { - "name": "SECURITY.md", + "name": "changelogs/changelog.yaml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "b73dc04e41dbb3774a3244e8e40d13eb97d169caa3e1230a622e077d60c1edd9", + "chksum_sha256": "7a25ebd33b1475eaf97acf3e5ba1b50461aabd200f501a6130f0aae1cc2e2e74", + "format": 1 + }, + { + "name": "galaxy.yml.in", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "ba21f50b97b7f801dd811f96d4941327fccab34b13311e9bfcc5facfeec16999", + "format": 1 + }, + { + "name": "CHANGELOG.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "37440385853bd43f5b71ba017515bd1c7c68ac45c0429cfaae320b3661c75de1", + "format": 1 + }, + { + "name": "test-requirements.txt", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "9b72b7289eba420f51eb614c54f609181bb26e96caef2abf06c02339a77d2e08", "format": 1 }, { @@ -806,38 +841,38 @@ "format": 1 }, { - "name": "tests/sanity/ignore-2.18.txt", + "name": "tests/sanity/ignore-2.12.txt", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "361bd77aa7cbdafdfcdec95128188299e4641bcce983571a747031794cca7cf5", + "chksum_sha256": "67fc6067f750369421d81d68b9f2d30afe4eb13f9d0963eaa1aa07a8c924556b", "format": 1 }, { - "name": "tests/sanity/ignore-2.13.txt", + "name": "tests/sanity/ignore-2.9.txt", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "361bd77aa7cbdafdfcdec95128188299e4641bcce983571a747031794cca7cf5", + "chksum_sha256": "67fc6067f750369421d81d68b9f2d30afe4eb13f9d0963eaa1aa07a8c924556b", "format": 1 }, { - "name": "tests/sanity/ignore-2.10.txt", + "name": "tests/sanity/ignore-2.15.txt", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "361bd77aa7cbdafdfcdec95128188299e4641bcce983571a747031794cca7cf5", + "chksum_sha256": "67fc6067f750369421d81d68b9f2d30afe4eb13f9d0963eaa1aa07a8c924556b", "format": 1 }, { - "name": "tests/sanity/ignore-2.11.txt", + "name": "tests/sanity/ignore-2.13.txt", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "361bd77aa7cbdafdfcdec95128188299e4641bcce983571a747031794cca7cf5", + "chksum_sha256": "67fc6067f750369421d81d68b9f2d30afe4eb13f9d0963eaa1aa07a8c924556b", "format": 1 }, { - "name": "tests/sanity/ignore-2.9.txt", + "name": "tests/sanity/ignore-2.17.txt", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "361bd77aa7cbdafdfcdec95128188299e4641bcce983571a747031794cca7cf5", + "chksum_sha256": "67fc6067f750369421d81d68b9f2d30afe4eb13f9d0963eaa1aa07a8c924556b", "format": 1 }, { @@ -848,38 +883,45 @@ "format": 1 }, { - "name": "tests/sanity/ignore-2.14.txt", + "name": "tests/sanity/ignore-2.11.txt", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "361bd77aa7cbdafdfcdec95128188299e4641bcce983571a747031794cca7cf5", + "chksum_sha256": "67fc6067f750369421d81d68b9f2d30afe4eb13f9d0963eaa1aa07a8c924556b", "format": 1 }, { - "name": "tests/sanity/ignore-2.12.txt", + "name": "tests/sanity/ignore-2.10.txt", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "361bd77aa7cbdafdfcdec95128188299e4641bcce983571a747031794cca7cf5", + "chksum_sha256": "67fc6067f750369421d81d68b9f2d30afe4eb13f9d0963eaa1aa07a8c924556b", "format": 1 }, { - "name": "tests/sanity/ignore-2.17.txt", + "name": "tests/sanity/ignore-2.18.txt", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "361bd77aa7cbdafdfcdec95128188299e4641bcce983571a747031794cca7cf5", + "chksum_sha256": "67fc6067f750369421d81d68b9f2d30afe4eb13f9d0963eaa1aa07a8c924556b", "format": 1 }, { "name": "tests/sanity/ignore-2.16.txt", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "361bd77aa7cbdafdfcdec95128188299e4641bcce983571a747031794cca7cf5", + "chksum_sha256": "67fc6067f750369421d81d68b9f2d30afe4eb13f9d0963eaa1aa07a8c924556b", "format": 1 }, { - "name": "tests/sanity/ignore-2.15.txt", + "name": "tests/sanity/ignore-2.14.txt", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "67fc6067f750369421d81d68b9f2d30afe4eb13f9d0963eaa1aa07a8c924556b", + "format": 1 + }, + { + "name": "tests/.gitignore", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "361bd77aa7cbdafdfcdec95128188299e4641bcce983571a747031794cca7cf5", + "chksum_sha256": "b5726d3ec9335a09c124469eca039523847a6b0f08a083efaefd002b83326600", "format": 1 }, { @@ -903,13 +945,6 @@ "chksum_sha256": null, "format": 1 }, - { - "name": "tests/unit/plugins/modules/test_common.py", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "79b1c212210b13bb60b8d97b140351ce088707f3574b8fc61b076e827e050891", - "format": 1 - }, { "name": "tests/unit/plugins/modules/test_container_lib.py", "ftype": "file", @@ -918,10 +953,10 @@ "format": 1 }, { - "name": "tests/.gitignore", + "name": "tests/unit/plugins/modules/test_common.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "b5726d3ec9335a09c124469eca039523847a6b0f08a083efaefd002b83326600", + "chksum_sha256": "79b1c212210b13bb60b8d97b140351ce088707f3574b8fc61b076e827e050891", "format": 1 }, { @@ -939,507 +974,528 @@ "format": 1 }, { - "name": "tests/integration/targets/podman_volume_info", + "name": "tests/integration/targets/podman_pod", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/podman_volume_info/tasks", + "name": "tests/integration/targets/podman_pod/tasks", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/podman_volume_info/tasks/main.yml", + "name": "tests/integration/targets/podman_pod/tasks/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "d951a17810a5d38195f5b6b9f2b61997be78c33f425b3d6c8424250d658d4115", + "chksum_sha256": "1c065036caae1e7933a92eead273136e4ebc1340257766746ad8d4954269bc10", "format": 1 }, { - "name": "tests/integration/targets/podman_volume", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, + "name": "tests/integration/targets/podman_pod/tasks/root-pod.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "32a941c1ab343de12be5b6b942885697a47a90e70b4ba8b8f6b41830fd748be7", "format": 1 }, { - "name": "tests/integration/targets/podman_volume/tasks", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, + "name": "tests/integration/targets/podman_pod/tasks/network-tests.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "9a8a2c641891bca7bd86d7c984970b869bad967b127d9ea5cad004dbb7bf1401", "format": 1 }, { - "name": "tests/integration/targets/podman_volume/tasks/main.yml", + "name": "tests/integration/targets/podman_pod/tasks/net-pod.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "fcf996710e030b8188cd7f49daa73c153c23513dfedcacea9e22615223ce8d7d", + "chksum_sha256": "a0f34f0ea7dc20a24b1a0bd29ef7b71fc5b145fd6ee364cea413c01cc858c30d", "format": 1 }, { - "name": "tests/integration/targets/podman_image", + "name": "tests/integration/targets/podman_pod/tasks/resource-limit.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c401b840f46b7d047ffff490a03eb414be614b23f41ac053bf85b2b9e2eaef44", + "format": 1 + }, + { + "name": "tests/integration/targets/podman_containers", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/podman_image/files", + "name": "tests/integration/targets/podman_containers/tasks", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/podman_image/files/Containerfile", + "name": "tests/integration/targets/podman_containers/tasks/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "ec6bc9968ca494ec22fcb0bed27fc12ddf2241fea1fe58d0d8a4f0b33487b506", - "format": 1 - }, - { - "name": "tests/integration/targets/podman_image/tasks", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, + "chksum_sha256": "f0693a6b04d4dc0d91ff26d5c155f0dde26d8b54d38bad24379b4b45115572ba", "format": 1 }, { - "name": "tests/integration/targets/podman_image/tasks/main.yml", + "name": "tests/integration/targets/podman_containers/tasks/root-multi.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "71b89cf589c2372b615111daa3acc9134561569dafea88fbe85fb4601f341d76", + "chksum_sha256": "99e92a4d72c87817aa74687d7a9fc99da5adbeeaffb04fa8da55cac88d2082ad", "format": 1 }, { - "name": "tests/integration/targets/podman_save", + "name": "tests/integration/targets/podman_import", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/podman_save/tasks", + "name": "tests/integration/targets/podman_import/tasks", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/podman_save/tasks/main.yml", + "name": "tests/integration/targets/podman_import/tasks/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "18dd5ac7950abeb6dcfdb97f4b9b6e00aeacd1be3b41dae762cca6e237bbbf93", + "chksum_sha256": "aee5d8c4cdcd8ca56109a6fcc93be0dcce03ebc65cf6c8d606b1e195ad7bc37a", "format": 1 }, { - "name": "tests/integration/targets/podman_logout", + "name": "tests/integration/targets/podman_container_exec", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/podman_logout/tasks", + "name": "tests/integration/targets/podman_container_exec/tasks", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/podman_logout/tasks/main.yml", + "name": "tests/integration/targets/podman_container_exec/tasks/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "2e1c3fcd8cd0d917e7faad2dc447381ec2ccff2bc3a57b02060cd965ffbb45c1", + "chksum_sha256": "0e0ddeed9ec3f80a8dbe98de6b8ca92d6906a8ed8b4e732b57d7aa56ea603766", "format": 1 }, { - "name": "tests/integration/targets/connection_podman", + "name": "tests/integration/targets/podman_export", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/connection_podman/test_connection.inventory", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "05ecc4306d853f3a6057303bbcc0750d7fbb86e044cd135faf01c35ad06b6d25", + "name": "tests/integration/targets/podman_export/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/connection_podman/runme.sh", + "name": "tests/integration/targets/podman_export/tasks/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "06a213f3e9c159069f1fd055653438f8487d1b8939ee735a0025b151ef2a4626", + "chksum_sha256": "608c9d218d3e66b53ad1b5f2b3d6c295ca109edf2d82b08eccc3d8840278f4ab", "format": 1 }, { - "name": "tests/integration/targets/podman_container_exec", + "name": "tests/integration/targets/podman_container", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/podman_container_exec/tasks", + "name": "tests/integration/targets/podman_container/tasks", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/podman_container_exec/tasks/main.yml", + "name": "tests/integration/targets/podman_container/tasks/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "f30d948810c85f961037c816face62e7a9591a26d566ecf5d19f6490161788de", + "chksum_sha256": "75e7c7c41efe6771b55a034dbeeb25b2ecfb16df84db581e3ba58a16f8192fbb", "format": 1 }, { - "name": "tests/integration/targets/podman_export", + "name": "tests/integration/targets/podman_image", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/podman_export/tasks", + "name": "tests/integration/targets/podman_image/tasks", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/podman_export/tasks/main.yml", + "name": "tests/integration/targets/podman_image/tasks/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "608c9d218d3e66b53ad1b5f2b3d6c295ca109edf2d82b08eccc3d8840278f4ab", + "chksum_sha256": "0d8f32e61e6e8357c8a08b3ec698a9a599b10b9dfdb0a03cef829d22b5eb177d", "format": 1 }, { - "name": "tests/integration/targets/podman_container_idempotency", + "name": "tests/integration/targets/podman_image/files", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/podman_container_idempotency/files", + "name": "tests/integration/targets/podman_image/files/Containerfile", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "ec6bc9968ca494ec22fcb0bed27fc12ddf2241fea1fe58d0d8a4f0b33487b506", + "format": 1 + }, + { + "name": "tests/integration/targets/connection", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/podman_container_idempotency/files/start.sh", + "name": "tests/integration/targets/connection/create-nonroot-user.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "bb80ab18f5df29c7c77f8acea5285af4f0f4d1ddac161801d0ff26ac242c2d86", + "chksum_sha256": "7af8e41655a36f526418cadf93e37da7117cc67761e34ab9c41b68ac8c00a268", "format": 1 }, { - "name": "tests/integration/targets/podman_container_idempotency/files/Dockerfile", + "name": "tests/integration/targets/connection/test_connection.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "002a8a2bf46c5da32a3583bc93c08347c6f7e16c51cd5abdf562d77df313da5c", + "chksum_sha256": "3b9bd8af9cbdf99e7d47189d08b57d0eb5030fde078c88a3387d2af701ae85a8", "format": 1 }, { - "name": "tests/integration/targets/podman_container_idempotency/tasks", + "name": "tests/integration/targets/podman_volume", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/podman_container_idempotency/tasks/idem_ports.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "cc446d64740817d2b04de867ac5e17e3118a4191e332f1c4bc493a34bc58b298", + "name": "tests/integration/targets/podman_volume/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/podman_container_idempotency/tasks/main.yml", + "name": "tests/integration/targets/podman_volume/tasks/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "7b740c06632cb043c3fc57f226023b59b4a425dc28d4c3c1e005835bc3e6f727", + "chksum_sha256": "02a99c50e7aebf79d8a7d254f9c2c25f03bfa7f940b3593907d0b26bd018880e", "format": 1 }, { - "name": "tests/integration/targets/podman_container_idempotency/tasks/root-podman.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "ed7d2ee3e9e352efc0266c2264469b3f759f1630562794c98f5da83949506bec", + "name": "tests/integration/targets/podman_container_info", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/podman_container_idempotency/tasks/idem_systemd.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "272808017955d5ef59448a1b9ce1bb98d18bce0b1e4b658d1fe6c5b4fcdc884b", + "name": "tests/integration/targets/podman_container_info/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/podman_container_idempotency/tasks/idem_stopsignal.yml", + "name": "tests/integration/targets/podman_container_info/tasks/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "262e884e0b4a561fbc57726f13763e3b07a92786386c9a5c7ccd13270e38b475", + "chksum_sha256": "f753b105c6b8ca293911422dc3372b82e98ba5b3f7065cac0a20976933a0c03f", "format": 1 }, { - "name": "tests/integration/targets/podman_container_idempotency/tasks/idem_volumes.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "5e330c3f7359aaf7e6e3379db977b909e04bcec89b894f1f8f0d44dfebdecffd", + "name": "tests/integration/targets/podman_volume_info", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/podman_container_idempotency/tasks/idem_network_aliases.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "04c6bf4fd56edcc1a49a47e98f448c89cf8e90e1d7d67db9997f0af94ef09dc6", + "name": "tests/integration/targets/podman_volume_info/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/podman_container_idempotency/tasks/rootless-podman-network.yml", + "name": "tests/integration/targets/podman_volume_info/tasks/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "a4d6028c7466608b10983c9acf25af9b99d9ce0aa27ed17500af287d28070af4", + "chksum_sha256": "d951a17810a5d38195f5b6b9f2b61997be78c33f425b3d6c8424250d658d4115", "format": 1 }, { - "name": "tests/integration/targets/podman_container_idempotency/tasks/idem_workdir.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "23d729589e61ae790bd81b281f89b48b443b830cf3a6932eb0bdf4289289f677", + "name": "tests/integration/targets/podman_runlabel", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/podman_container_idempotency/tasks/idem_labels.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "d375e2ec31f9f9d16adca8328db880ee3d0b56238db5686ac9bbb0dcc2017fe7", + "name": "tests/integration/targets/podman_runlabel/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/podman_container_idempotency/tasks/build_test_container.yml", + "name": "tests/integration/targets/podman_runlabel/tasks/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "a61627e2d0be2e1400f0d0f60df5d636eea74b18aa87fa2a0d7eb4c419c2a8ae", + "chksum_sha256": "0beafe98862363c62951e9c1a1398446a78b4e00aee1c91a7343e38eb5380fb0", "format": 1 }, { - "name": "tests/integration/targets/podman_container_idempotency/tasks/root-podman-network.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "ab1cc0f347537ab4403395b2b2b43f815fe49c7ae35b88b498931fdcb33abd75", + "name": "tests/integration/targets/podman_runlabel/files", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/podman_container_idempotency/tasks/idem_users.yml", + "name": "tests/integration/targets/podman_runlabel/files/testinstall.sh", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "36f44ffaa058046e62d0e53be0f7edf8232d9145ec44a948c64c15d0c0c3cd23", + "chksum_sha256": "6450871e198c27b65e85883b3ca93b78f63261667b2332689d7f5b01fd293077", "format": 1 }, { - "name": "tests/integration/targets/podman_container_idempotency/tasks/idem_pods.yml", + "name": "tests/integration/targets/podman_runlabel/files/Dockerfile", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "53d129901494fa24a8075ade0576e2536ae3cbfc5d8fb8d116a10978594a6a49", + "chksum_sha256": "4afccdec25a964d39944882c25dbb0df6f0f844cfcfb72bbd89bb505167d1241", "format": 1 }, { - "name": "tests/integration/targets/podman_container_idempotency/tasks/idem_networks.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "3a0f1de00361a8381b06934149d6433afd307d010d7396be307f7d7f6f27a52e", + "name": "tests/integration/targets/podman_image_info", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/podman_container_idempotency/tasks/idem_all.yml", + "name": "tests/integration/targets/podman_image_info/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/podman_image_info/tasks/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "f7ccc04c97fb27dfdf4462cc73f74e244c76759ce0a5b4b7d785e6f8a50b7a56", + "chksum_sha256": "2e2b22b24c5afbaf5f7565c37a37cd0294bb0be58d758a75fca3cf7828f283ac", "format": 1 }, { - "name": "tests/integration/targets/podman_secret_info", + "name": "tests/integration/targets/podman_load", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/podman_secret_info/tasks", + "name": "tests/integration/targets/podman_load/tasks", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/podman_secret_info/tasks/main.yml", + "name": "tests/integration/targets/podman_load/tasks/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "3181d366cf3f25687ff6cceaf0677803bedc1d64e6b766fa66d5882c89240674", + "chksum_sha256": "078d5ae2eb9bf74046e34c6e7c003e87bb6e08f1a6fd49fcf5d6bb2174bae393", "format": 1 }, { - "name": "tests/integration/targets/podman_login", + "name": "tests/integration/targets/podman_play", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/podman_login/tasks", + "name": "tests/integration/targets/podman_play/tasks", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/podman_login/tasks/main.yml", + "name": "tests/integration/targets/podman_play/tasks/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "5156c546ca2b45f035ae5b28a7220e06c4fb8051f93a6077e0308b06cafa15b3", + "chksum_sha256": "164bc510cd1be9cb89f2d4845154d7f5854149ca347cdd4f2a115e70316c10f2", "format": 1 }, { - "name": "tests/integration/targets/podman_tag", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, + "name": "tests/integration/targets/podman_play/tasks/play-with-build.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "dbfd032b6d71ce241ee643cfcaa09997efc32ef57a0f4494982f43caad353678", "format": 1 }, { - "name": "tests/integration/targets/podman_tag/tasks", + "name": "tests/integration/targets/podman_play/tasks/files", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/podman_tag/tasks/main.yml", + "name": "tests/integration/targets/podman_play/tasks/files/play-root3.yaml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "2d0f2ae65dac8386961528eb33d02de73fe60026cb5566ffa68b4467b7c45678", + "chksum_sha256": "3e26cb69976a1b7d1f79a5dafc74e368d9297bb63b29c1c213d5bbddc0e62bf3", "format": 1 }, { - "name": "tests/integration/targets/podman_containers", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, + "name": "tests/integration/targets/podman_play/tasks/files/play1.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "1031804932a82f741e8cddaa397e73554e4784a790a3d4493d1b5c8f5f6bbf7e", "format": 1 }, { - "name": "tests/integration/targets/podman_containers/tasks", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, + "name": "tests/integration/targets/podman_play/tasks/files/Containerfile", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c0268928bf1b6b6307404eff5d25e292b78239d330dc585c87d810db40307609", "format": 1 }, { - "name": "tests/integration/targets/podman_containers/tasks/main.yml", + "name": "tests/integration/targets/podman_play/tasks/files/play3.yaml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "f0693a6b04d4dc0d91ff26d5c155f0dde26d8b54d38bad24379b4b45115572ba", + "chksum_sha256": "c92c31b3ad0cd9992a6a9e391d07d69b2b9f3cc39b410e1cbc710bda40323b3d", "format": 1 }, { - "name": "tests/integration/targets/podman_containers/tasks/root-multi.yml", + "name": "tests/integration/targets/podman_play/tasks/files/kube-buil-test.yaml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "99e92a4d72c87817aa74687d7a9fc99da5adbeeaffb04fa8da55cac88d2082ad", + "chksum_sha256": "c813ffc1f16f8324acbbaad0cf5ad7ee00e0ebd47f314b9ad74f24fd9e2177b0", "format": 1 }, { - "name": "tests/integration/targets/podman_network", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, + "name": "tests/integration/targets/podman_play/tasks/files/play-pod.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "28fd560a9ff59811770316563e3320dbd77ed04c2c2dd9d698c54870fbcaafb4", "format": 1 }, { - "name": "tests/integration/targets/podman_network/tasks", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, + "name": "tests/integration/targets/podman_play/tasks/files/envdata.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d5ebdb092f5473ae5174dfbac83b6623343326f308d02eea8fb58fbb7b42d264", "format": 1 }, { - "name": "tests/integration/targets/podman_network/tasks/main.yml", + "name": "tests/integration/targets/podman_play/tasks/files/multi-yaml.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "b7659bb415aa72e1ff4ec1b2fc681ce7261fccdaa21804c1ecc9e9ee1a3b2cd0", + "chksum_sha256": "984f73601cc75a5052b22b3d9a670ea93e7cc0c4f3fe2fb89f4f341392fb8af6", "format": 1 }, { - "name": "tests/integration/targets/podman_image_info", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, + "name": "tests/integration/targets/podman_play/tasks/files/play-root1.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "049f1ad67c57e019423f28c77ca8cec13e714ae8727fedfde71792ec56131344", "format": 1 }, { - "name": "tests/integration/targets/podman_image_info/tasks", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, + "name": "tests/integration/targets/podman_play/tasks/play-with-options.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "fcf6f0e7a8768422425a667d29e28c831e4f284102ab3b62d8c7eb4b0fca6083", "format": 1 }, { - "name": "tests/integration/targets/podman_image_info/tasks/main.yml", + "name": "tests/integration/targets/podman_play/tasks/root-play.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "2e2b22b24c5afbaf5f7565c37a37cd0294bb0be58d758a75fca3cf7828f283ac", + "chksum_sha256": "65c0fccbaf7c464b539f895addc0cf3e7536f9cb8b9f7d8e28725a90d345326b", "format": 1 }, { - "name": "tests/integration/targets/podman_prune", + "name": "tests/integration/targets/podman_play/tasks/play-multi-yaml.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "099247fe1f2666caf7035895336008b05e7e773353747c18015d36d795d9afaa", + "format": 1 + }, + { + "name": "tests/integration/targets/podman_logout", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/podman_prune/tasks", + "name": "tests/integration/targets/podman_logout/tasks", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/podman_prune/tasks/main.yml", + "name": "tests/integration/targets/podman_logout/tasks/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "724466a522dc7a0d89201a540856373a6613e11f6869faf0accfe01497c972c8", + "chksum_sha256": "2e1c3fcd8cd0d917e7faad2dc447381ec2ccff2bc3a57b02060cd965ffbb45c1", "format": 1 }, { - "name": "tests/integration/targets/connection", + "name": "tests/integration/targets/connection_buildah", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/connection/create-nonroot-user.yml", + "name": "tests/integration/targets/connection_buildah/test_connection.inventory", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "7af8e41655a36f526418cadf93e37da7117cc67761e34ab9c41b68ac8c00a268", + "chksum_sha256": "5012fc0a2af812b87b675f31cd605ecf8d80fe32667b6ed20ea51fe0c8685742", "format": 1 }, { - "name": "tests/integration/targets/connection/test_connection.yml", + "name": "tests/integration/targets/connection_buildah/runme.sh", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "3b9bd8af9cbdf99e7d47189d08b57d0eb5030fde078c88a3387d2af701ae85a8", + "chksum_sha256": "b4d64b01f03eb7aa81f3fbe7202c816188bc8432fedccb5251feeb330f7c16e4", "format": 1 }, { @@ -1450,346 +1506,339 @@ "format": 1 }, { - "name": "tests/integration/targets/podman_pod", + "name": "tests/integration/targets/podman_tag", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/podman_pod/tasks", + "name": "tests/integration/targets/podman_tag/tasks", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/podman_pod/tasks/main.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "bbe9d769c0aadaea64fb4a3263a8e1cb746e9f78e0f3308dfda1641b5abcc808", - "format": 1 - }, - { - "name": "tests/integration/targets/podman_pod/tasks/network-tests.yml", + "name": "tests/integration/targets/podman_tag/tasks/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "9a8a2c641891bca7bd86d7c984970b869bad967b127d9ea5cad004dbb7bf1401", + "chksum_sha256": "2d0f2ae65dac8386961528eb33d02de73fe60026cb5566ffa68b4467b7c45678", "format": 1 }, { - "name": "tests/integration/targets/podman_pod/tasks/net-pod.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "a0f34f0ea7dc20a24b1a0bd29ef7b71fc5b145fd6ee364cea413c01cc858c30d", + "name": "tests/integration/targets/podman_login_info", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/podman_pod/tasks/root-pod.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "32a941c1ab343de12be5b6b942885697a47a90e70b4ba8b8f6b41830fd748be7", + "name": "tests/integration/targets/podman_login_info/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/podman_pod/tasks/resource-limit.yml", + "name": "tests/integration/targets/podman_login_info/tasks/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "368abd818cd3d326f926d4e0d9e5ee7531f7fa337d48d9abfbb130e4c2e009a5", + "chksum_sha256": "21ef50fdd0d92d39240b082c1f9ba3782478e615863d3e8d9a0960b175b8158e", "format": 1 }, { - "name": "tests/integration/targets/podman_load", + "name": "tests/integration/targets/podman_network_info", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/podman_load/tasks", + "name": "tests/integration/targets/podman_network_info/tasks", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/podman_load/tasks/main.yml", + "name": "tests/integration/targets/podman_network_info/tasks/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "078d5ae2eb9bf74046e34c6e7c003e87bb6e08f1a6fd49fcf5d6bb2174bae393", + "chksum_sha256": "5d60cdf4f76199919395dd477e7feb32d8ebbb4b736d0a13052290a3fcb5e5e3", "format": 1 }, { - "name": "tests/integration/targets/podman_play", + "name": "tests/integration/targets/podman_pod_info", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/podman_play/tasks", + "name": "tests/integration/targets/podman_pod_info/tasks", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/podman_play/tasks/root-play.yml", + "name": "tests/integration/targets/podman_pod_info/tasks/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "65c0fccbaf7c464b539f895addc0cf3e7536f9cb8b9f7d8e28725a90d345326b", + "chksum_sha256": "f04166aa3908442835ca6e7f747429d54cdeb8bcbf272e3977de79f3ad653271", "format": 1 }, { - "name": "tests/integration/targets/podman_play/tasks/files", + "name": "tests/integration/targets/podman_container_idempotency", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/podman_play/tasks/files/kube-buil-test.yaml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "c813ffc1f16f8324acbbaad0cf5ad7ee00e0ebd47f314b9ad74f24fd9e2177b0", + "name": "tests/integration/targets/podman_container_idempotency/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/podman_play/tasks/files/play3.yaml", + "name": "tests/integration/targets/podman_container_idempotency/tasks/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "c92c31b3ad0cd9992a6a9e391d07d69b2b9f3cc39b410e1cbc710bda40323b3d", + "chksum_sha256": "aa7ee1e6dad1b84726df6521d749c31263b9d6d2cb7c5ab38b04ddf8fadb58f9", "format": 1 }, { - "name": "tests/integration/targets/podman_play/tasks/files/Containerfile", + "name": "tests/integration/targets/podman_container_idempotency/tasks/idem_network_aliases.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "c0268928bf1b6b6307404eff5d25e292b78239d330dc585c87d810db40307609", + "chksum_sha256": "04c6bf4fd56edcc1a49a47e98f448c89cf8e90e1d7d67db9997f0af94ef09dc6", "format": 1 }, { - "name": "tests/integration/targets/podman_play/tasks/files/envdata.yaml", + "name": "tests/integration/targets/podman_container_idempotency/tasks/rootless-podman-network.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "d5ebdb092f5473ae5174dfbac83b6623343326f308d02eea8fb58fbb7b42d264", + "chksum_sha256": "407d946210fd0801b2626b36ca0921299c75d644ff508caeac1cc2fa49ef6c50", "format": 1 }, { - "name": "tests/integration/targets/podman_play/tasks/files/play-root1.yaml", + "name": "tests/integration/targets/podman_container_idempotency/tasks/build_test_container.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "049f1ad67c57e019423f28c77ca8cec13e714ae8727fedfde71792ec56131344", + "chksum_sha256": "a61627e2d0be2e1400f0d0f60df5d636eea74b18aa87fa2a0d7eb4c419c2a8ae", "format": 1 }, { - "name": "tests/integration/targets/podman_play/tasks/files/play-pod.yaml", + "name": "tests/integration/targets/podman_container_idempotency/tasks/idem_networks.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "28fd560a9ff59811770316563e3320dbd77ed04c2c2dd9d698c54870fbcaafb4", + "chksum_sha256": "3a0f1de00361a8381b06934149d6433afd307d010d7396be307f7d7f6f27a52e", "format": 1 }, { - "name": "tests/integration/targets/podman_play/tasks/files/play1.yaml", + "name": "tests/integration/targets/podman_container_idempotency/tasks/idem_users.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "1031804932a82f741e8cddaa397e73554e4784a790a3d4493d1b5c8f5f6bbf7e", + "chksum_sha256": "36f44ffaa058046e62d0e53be0f7edf8232d9145ec44a948c64c15d0c0c3cd23", "format": 1 }, { - "name": "tests/integration/targets/podman_play/tasks/files/play-root3.yaml", + "name": "tests/integration/targets/podman_container_idempotency/tasks/root-podman.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "3e26cb69976a1b7d1f79a5dafc74e368d9297bb63b29c1c213d5bbddc0e62bf3", + "chksum_sha256": "ed7d2ee3e9e352efc0266c2264469b3f759f1630562794c98f5da83949506bec", "format": 1 }, { - "name": "tests/integration/targets/podman_play/tasks/main.yml", + "name": "tests/integration/targets/podman_container_idempotency/tasks/idem_pods.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "6e09a063081bc323f0bed0bde99945514ced8f79728cb0e6505cf9830e39210c", + "chksum_sha256": "53d129901494fa24a8075ade0576e2536ae3cbfc5d8fb8d116a10978594a6a49", "format": 1 }, { - "name": "tests/integration/targets/podman_play/tasks/play-with-build.yml", + "name": "tests/integration/targets/podman_container_idempotency/tasks/idem_workdir.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "e69e16e846f4c167878eadf1701af4af637704a1441bf20fb9c05161e93c034f", + "chksum_sha256": "23d729589e61ae790bd81b281f89b48b443b830cf3a6932eb0bdf4289289f677", "format": 1 }, { - "name": "tests/integration/targets/podman_play/tasks/play-with-options.yml", + "name": "tests/integration/targets/podman_container_idempotency/tasks/idem_ports.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "0774269b8b1a0fa19000a0c0bfe4bb6ff8410a7fa46b80d1c4876ac39108580c", + "chksum_sha256": "cc446d64740817d2b04de867ac5e17e3118a4191e332f1c4bc493a34bc58b298", "format": 1 }, { - "name": "tests/integration/targets/podman_container", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, + "name": "tests/integration/targets/podman_container_idempotency/tasks/idem_systemd.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "272808017955d5ef59448a1b9ce1bb98d18bce0b1e4b658d1fe6c5b4fcdc884b", "format": 1 }, { - "name": "tests/integration/targets/podman_container/tasks", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, + "name": "tests/integration/targets/podman_container_idempotency/tasks/root-podman-network.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "ab1cc0f347537ab4403395b2b2b43f815fe49c7ae35b88b498931fdcb33abd75", "format": 1 }, { - "name": "tests/integration/targets/podman_container/tasks/main.yml", + "name": "tests/integration/targets/podman_container_idempotency/tasks/idem_all.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "01fca5192bb2072e35c91ce42643accf53cd7cc51166f8845bf71a373e99dd87", + "chksum_sha256": "f7ccc04c97fb27dfdf4462cc73f74e244c76759ce0a5b4b7d785e6f8a50b7a56", "format": 1 }, { - "name": "tests/integration/targets/podman_secret", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, + "name": "tests/integration/targets/podman_container_idempotency/tasks/idem_stopsignal.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "262e884e0b4a561fbc57726f13763e3b07a92786386c9a5c7ccd13270e38b475", "format": 1 }, { - "name": "tests/integration/targets/podman_secret/tasks", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, + "name": "tests/integration/targets/podman_container_idempotency/tasks/idem_volumes.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "5e330c3f7359aaf7e6e3379db977b909e04bcec89b894f1f8f0d44dfebdecffd", "format": 1 }, { - "name": "tests/integration/targets/podman_secret/tasks/main.yml", + "name": "tests/integration/targets/podman_container_idempotency/tasks/idem_labels.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "b9b9415b024f3f617149c74d980afccb22e7223dac8bb673465504507ca4e2aa", + "chksum_sha256": "d375e2ec31f9f9d16adca8328db880ee3d0b56238db5686ac9bbb0dcc2017fe7", "format": 1 }, { - "name": "tests/integration/targets/podman_container_info", + "name": "tests/integration/targets/podman_container_idempotency/files", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/podman_container_info/tasks", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, + "name": "tests/integration/targets/podman_container_idempotency/files/start.sh", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "bb80ab18f5df29c7c77f8acea5285af4f0f4d1ddac161801d0ff26ac242c2d86", "format": 1 }, { - "name": "tests/integration/targets/podman_container_info/tasks/main.yml", + "name": "tests/integration/targets/podman_container_idempotency/files/Dockerfile", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "f753b105c6b8ca293911422dc3372b82e98ba5b3f7065cac0a20976933a0c03f", + "chksum_sha256": "002a8a2bf46c5da32a3583bc93c08347c6f7e16c51cd5abdf562d77df313da5c", "format": 1 }, { - "name": "tests/integration/targets/podman_import", + "name": "tests/integration/targets/podman_secret", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/podman_import/tasks", + "name": "tests/integration/targets/podman_secret/tasks", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/podman_import/tasks/main.yml", + "name": "tests/integration/targets/podman_secret/tasks/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "aee5d8c4cdcd8ca56109a6fcc93be0dcce03ebc65cf6c8d606b1e195ad7bc37a", + "chksum_sha256": "b9b9415b024f3f617149c74d980afccb22e7223dac8bb673465504507ca4e2aa", "format": 1 }, { - "name": "tests/integration/targets/podman_runlabel", + "name": "tests/integration/targets/podman_network", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/podman_runlabel/files", + "name": "tests/integration/targets/podman_network/tasks", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/podman_runlabel/files/testinstall.sh", + "name": "tests/integration/targets/podman_network/tasks/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "6450871e198c27b65e85883b3ca93b78f63261667b2332689d7f5b01fd293077", + "chksum_sha256": "8415501667bf5315c747424b0ffbe15b3283803e26f52d78d7de13836bba1e90", "format": 1 }, { - "name": "tests/integration/targets/podman_runlabel/files/Dockerfile", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "4afccdec25a964d39944882c25dbb0df6f0f844cfcfb72bbd89bb505167d1241", + "name": "tests/integration/targets/podman_login", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/podman_runlabel/tasks", + "name": "tests/integration/targets/podman_login/tasks", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/podman_runlabel/tasks/main.yml", + "name": "tests/integration/targets/podman_login/tasks/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "0beafe98862363c62951e9c1a1398446a78b4e00aee1c91a7343e38eb5380fb0", + "chksum_sha256": "5156c546ca2b45f035ae5b28a7220e06c4fb8051f93a6077e0308b06cafa15b3", "format": 1 }, { - "name": "tests/integration/targets/connection_buildah", + "name": "tests/integration/targets/podman_save", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/connection_buildah/test_connection.inventory", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "5012fc0a2af812b87b675f31cd605ecf8d80fe32667b6ed20ea51fe0c8685742", + "name": "tests/integration/targets/podman_save/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/connection_buildah/runme.sh", + "name": "tests/integration/targets/podman_save/tasks/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "b4d64b01f03eb7aa81f3fbe7202c816188bc8432fedccb5251feeb330f7c16e4", + "chksum_sha256": "18dd5ac7950abeb6dcfdb97f4b9b6e00aeacd1be3b41dae762cca6e237bbbf93", "format": 1 }, { - "name": "tests/integration/targets/podman_login_info", + "name": "tests/integration/targets/podman_secret_info", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/podman_login_info/tasks", + "name": "tests/integration/targets/podman_secret_info/tasks", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/podman_login_info/tasks/main.yml", + "name": "tests/integration/targets/podman_secret_info/tasks/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "21ef50fdd0d92d39240b082c1f9ba3782478e615863d3e8d9a0960b175b8158e", + "chksum_sha256": "3181d366cf3f25687ff6cceaf0677803bedc1d64e6b766fa66d5882c89240674", "format": 1 }, { @@ -1810,77 +1859,49 @@ "name": "tests/integration/targets/podman_generate_systemd/tasks/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "4c4a2b75bf6b0c5816e27b25bd3b7ba836e3d040b606b84f2a15d8f96bfc7ad5", + "chksum_sha256": "e8a7e30fe0a898ba81b62400058b9bab61da64e588148084ddb14911943d2b8b", "format": 1 }, { - "name": "tests/integration/targets/podman_network_info", + "name": "tests/integration/targets/connection_podman", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/podman_network_info/tasks", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, + "name": "tests/integration/targets/connection_podman/test_connection.inventory", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "05ecc4306d853f3a6057303bbcc0750d7fbb86e044cd135faf01c35ad06b6d25", "format": 1 }, { - "name": "tests/integration/targets/podman_network_info/tasks/main.yml", + "name": "tests/integration/targets/connection_podman/runme.sh", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "5d60cdf4f76199919395dd477e7feb32d8ebbb4b736d0a13052290a3fcb5e5e3", + "chksum_sha256": "06a213f3e9c159069f1fd055653438f8487d1b8939ee735a0025b151ef2a4626", "format": 1 }, { - "name": "tests/integration/targets/podman_pod_info", + "name": "tests/integration/targets/podman_prune", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/podman_pod_info/tasks", + "name": "tests/integration/targets/podman_prune/tasks", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/podman_pod_info/tasks/main.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "f04166aa3908442835ca6e7f747429d54cdeb8bcbf272e3977de79f3ad653271", - "format": 1 - }, - { - "name": "CODE-OF-CONDUCT.md", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "5b42ff686c8d61fc9879d2512a9fa01f8810a7274318e7952ad3322eeea02f11", - "format": 1 - }, - { - "name": "ansible-collection-containers-podman.spec", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "78cf0e2fef0e96de69fd18ab38b358a03a22a5ce2e0ecafbd149407d6bcafb47", - "format": 1 - }, - { - "name": "README.md", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "0b3c0bf86d855ce3b4341bf6f72a5ea3e6300c09ca88d793ca3b149175eaa30c", - "format": 1 - }, - { - "name": "galaxy.yml.in", + "name": "tests/integration/targets/podman_prune/tasks/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "ba21f50b97b7f801dd811f96d4941327fccab34b13311e9bfcc5facfeec16999", + "chksum_sha256": "ea735326ddf2a4077cab00b44e2c064c686d90d5d55e0c373a02c045aaabddf4", "format": 1 } ], diff --git a/ansible_collections/containers/podman/MANIFEST.json b/ansible_collections/containers/podman/MANIFEST.json index 42a7515a2..ac80755e7 100644 --- a/ansible_collections/containers/podman/MANIFEST.json +++ b/ansible_collections/containers/podman/MANIFEST.json @@ -2,7 +2,7 @@ "collection_info": { "namespace": "containers", "name": "podman", - "version": "1.12.0", + "version": "1.13.0", "authors": [ "Sagi Shnaidman ", "Ansible team" @@ -28,7 +28,7 @@ "name": "FILES.json", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "b77266449f88b742113a208a520a3141a8e68154485dde86e743014eb8d58d58", + "chksum_sha256": "c7ca356d6a22a0996ed4045ff5711e5cf96cd60a62009e0da6f63fea100d538f", "format": 1 }, "format": 1 diff --git a/ansible_collections/containers/podman/changelogs/changelog.yaml b/ansible_collections/containers/podman/changelogs/changelog.yaml index 05857773e..bb58cacf4 100644 --- a/ansible_collections/containers/podman/changelogs/changelog.yaml +++ b/ansible_collections/containers/podman/changelogs/changelog.yaml @@ -257,6 +257,39 @@ releases: name: podman_secret_info namespace: '' release_date: '2024-01-30' + 1.12.1: + changes: + bugfixes: + - podman_container - Add check and fixed for v5 network diff + - podman_container - Fix pasta networking idempotency for v5 (#728) + - podman_container_exec - Remove unnecessary quotes in podman_container_exec + module + - podman_image_info - Fix wrong return data type in podman_image_info + - podman_play - Fix kube play annotations + - podman_pod - Fix broken info of pods in Podman v5 + - podman_pod - Fix pod for Podman v5 + - podman_pod - Fix podman pod v5 broken info issue + minor_changes: + - CI - Fix rootfs test in CI + - CI - add custom podman path to tasks + - CI - add parametrized executables to tests + - podman_container - Add pasta as default network mode after v5 + - podman_container_exec - Return data for podman exec module + - podman_generate_systemd - Fix broken example for podman_generate_systemd (#708) + - podman_login - Update podman_login.py + - podman_play - Add support for kube yaml files with multi-documents (#724) + - podman_play - Update the logic for deleting pods/containers in podman_play + - podman_pod_info - handle return being list in Podman 5 (#713) + release_summary: Support for Podman v5 and bugfixes + release_date: '2024-04-08' + 1.13.0: + changes: + bugfixes: + - Fix pod info for non-existant pods + major_changes: + - Add quadlet support for Podman modules + release_summary: Quadlet support for Podman + release_date: '2024-04-22' 1.2.0: changes: minor_changes: diff --git a/ansible_collections/containers/podman/docs/buildah_connection.html b/ansible_collections/containers/podman/docs/buildah_connection.html index 0d16691d4..28b73f8bf 100644 --- a/ansible_collections/containers/podman/docs/buildah_connection.html +++ b/ansible_collections/containers/podman/docs/buildah_connection.html @@ -37,7 +37,7 @@

containers.podman.buildah connection – Interact with an existing buildah container

Note

-

This connection plugin is part of the containers.podman collection (version 1.11.0).

+

This connection plugin is part of the containers.podman collection (version 1.13.0).

It is not included in ansible-core. To check whether it is installed, run ansible-galaxy collection list.

To install it, use: ansible-galaxy collection install containers.podman.

diff --git a/ansible_collections/containers/podman/docs/index.html b/ansible_collections/containers/podman/docs/index.html index ec765ccb4..8880530d7 100644 --- a/ansible_collections/containers/podman/docs/index.html +++ b/ansible_collections/containers/podman/docs/index.html @@ -34,7 +34,7 @@

Containers.Podman

-

Collection version 1.11.0

+

Collection version 1.13.0

diff --git a/ansible_collections/containers/podman/docs/podman_containers_module.html b/ansible_collections/containers/podman/docs/podman_containers_module.html index e84707d36..adc0dca87 100644 --- a/ansible_collections/containers/podman/docs/podman_containers_module.html +++ b/ansible_collections/containers/podman/docs/podman_containers_module.html @@ -37,7 +37,7 @@

containers.podman.podman_containers module – Manage podman containers in a batch

Note

-

This module is part of the containers.podman collection (version 1.11.0).

+

This module is part of the containers.podman collection (version 1.13.0).

It is not included in ansible-core. To check whether it is installed, run ansible-galaxy collection list.

To install it, use: ansible-galaxy collection install containers.podman. diff --git a/ansible_collections/containers/podman/docs/podman_export_module.html b/ansible_collections/containers/podman/docs/podman_export_module.html index 5a51a171c..b5e525aa4 100644 --- a/ansible_collections/containers/podman/docs/podman_export_module.html +++ b/ansible_collections/containers/podman/docs/podman_export_module.html @@ -37,7 +37,7 @@

containers.podman.podman_export module – Export a podman container

Note

-

This module is part of the containers.podman collection (version 1.11.0).

+

This module is part of the containers.podman collection (version 1.13.0).

It is not included in ansible-core. To check whether it is installed, run ansible-galaxy collection list.

To install it, use: ansible-galaxy collection install containers.podman. diff --git a/ansible_collections/containers/podman/docs/podman_generate_systemd_module.html b/ansible_collections/containers/podman/docs/podman_generate_systemd_module.html index 892160486..daec06e3f 100644 --- a/ansible_collections/containers/podman/docs/podman_generate_systemd_module.html +++ b/ansible_collections/containers/podman/docs/podman_generate_systemd_module.html @@ -37,7 +37,7 @@

containers.podman.podman_generate_systemd module – Generate systemd unit from a pod or a container

Note

-

This module is part of the containers.podman collection (version 1.11.0).

+

This module is part of the containers.podman collection (version 1.13.0).

It is not included in ansible-core. To check whether it is installed, run ansible-galaxy collection list.

To install it, use: ansible-galaxy collection install containers.podman. @@ -318,6 +318,7 @@ see - name: Postgres container must be started and enabled on systemd ansible.builtin.systemd: name: container-postgres_local + scope: user daemon_reload: true state: started enabled: true diff --git a/ansible_collections/containers/podman/docs/podman_image_info_module.html b/ansible_collections/containers/podman/docs/podman_image_info_module.html index be1f33883..b64277209 100644 --- a/ansible_collections/containers/podman/docs/podman_image_info_module.html +++ b/ansible_collections/containers/podman/docs/podman_image_info_module.html @@ -37,7 +37,7 @@

containers.podman.podman_image_info module – Gather info about images using podman

Note

-

This module is part of the containers.podman collection (version 1.11.0).

+

This module is part of the containers.podman collection (version 1.13.0).

It is not included in ansible-core. To check whether it is installed, run ansible-galaxy collection list.

To install it, use: ansible-galaxy collection install containers.podman.

@@ -123,7 +123,7 @@ To check whether it is installed, run

images

-

dictionary

+

list / elements=string

info from all or specified images

Returned: always

diff --git a/ansible_collections/containers/podman/docs/podman_image_module.html b/ansible_collections/containers/podman/docs/podman_image_module.html index 74c1dac80..941b06dfa 100644 --- a/ansible_collections/containers/podman/docs/podman_image_module.html +++ b/ansible_collections/containers/podman/docs/podman_image_module.html @@ -37,7 +37,7 @@

containers.podman.podman_image module – Pull images for use by podman

Note

-

This module is part of the containers.podman collection (version 1.11.0).

+

This module is part of the containers.podman collection (version 1.13.0).

It is not included in ansible-core. To check whether it is installed, run ansible-galaxy collection list.

To install it, use: ansible-galaxy collection install containers.podman.

@@ -344,6 +344,27 @@ To check whether it is installed, run
+

quadlet_dir

+

path

+
+

Path to the directory to write quadlet file in. By default, it will be set as /etc/containers/systemd/ for root user, ~/.config/containers/systemd/ for non-root users.

+
+ +
+

quadlet_filename

+

string

+
+

Name of quadlet file to write. By default it takes image name without prefixes and tags.

+
+ +
+

quadlet_options

+

list / elements=string

+
+

Options for the quadlet file. Provide missing in usual network args options as a list of lines to add.

+
+ +

state

string

@@ -353,10 +374,11 @@ To check whether it is installed, run "present" ← (default)

  • "absent"

  • "build"

  • +
  • "quadlet"

  • -
    +

    tag

    string

    @@ -364,14 +386,14 @@ To check whether it is installed, run Default: "latest"

    -
    +

    username

    string

    username to use when authenticating to remote registries.

    -
    +

    validate_certs

    @@ -493,6 +515,18 @@ To check whether it is installed, run containers.podman.podman_image: name: nginx arch: amd64 + +- name: Create a quadlet file for an image + containers.podman.podman_image: + name: docker.io/library/alpine:latest + state: quadlet + quadlet_dir: /etc/containers/systemd + quadlet_filename: alpine-latest + quadlet_options: + - Variant=arm/v7 + - | + [Install] + WantedBy=default.target
    diff --git a/ansible_collections/containers/podman/docs/podman_import_module.html b/ansible_collections/containers/podman/docs/podman_import_module.html index e1dea2279..b7140a6b9 100644 --- a/ansible_collections/containers/podman/docs/podman_import_module.html +++ b/ansible_collections/containers/podman/docs/podman_import_module.html @@ -37,7 +37,7 @@

    containers.podman.podman_import module – Import Podman container from a tar file.

    Note

    -

    This module is part of the containers.podman collection (version 1.11.0).

    +

    This module is part of the containers.podman collection (version 1.13.0).

    It is not included in ansible-core. To check whether it is installed, run ansible-galaxy collection list.

    To install it, use: ansible-galaxy collection install containers.podman. diff --git a/ansible_collections/containers/podman/docs/podman_load_module.html b/ansible_collections/containers/podman/docs/podman_load_module.html index a81014f03..256597ef5 100644 --- a/ansible_collections/containers/podman/docs/podman_load_module.html +++ b/ansible_collections/containers/podman/docs/podman_load_module.html @@ -37,7 +37,7 @@

    containers.podman.podman_load module – Load image from a tar file.

    Note

    -

    This module is part of the containers.podman collection (version 1.11.0).

    +

    This module is part of the containers.podman collection (version 1.13.0).

    It is not included in ansible-core. To check whether it is installed, run ansible-galaxy collection list.

    To install it, use: ansible-galaxy collection install containers.podman. diff --git a/ansible_collections/containers/podman/docs/podman_login_info_module.html b/ansible_collections/containers/podman/docs/podman_login_info_module.html index 7230f2de7..9b18049cd 100644 --- a/ansible_collections/containers/podman/docs/podman_login_info_module.html +++ b/ansible_collections/containers/podman/docs/podman_login_info_module.html @@ -37,7 +37,7 @@

    containers.podman.podman_login_info module – Return the logged-in user if any for a given registry

    Note

    -

    This module is part of the containers.podman collection (version 1.11.0).

    +

    This module is part of the containers.podman collection (version 1.13.0).

    It is not included in ansible-core. To check whether it is installed, run ansible-galaxy collection list.

    To install it, use: ansible-galaxy collection install containers.podman. diff --git a/ansible_collections/containers/podman/docs/podman_login_module.html b/ansible_collections/containers/podman/docs/podman_login_module.html index 20a3e1475..61adafae2 100644 --- a/ansible_collections/containers/podman/docs/podman_login_module.html +++ b/ansible_collections/containers/podman/docs/podman_login_module.html @@ -37,7 +37,7 @@

    containers.podman.podman_login module – Login to a container registry using podman

    Note

    -

    This module is part of the containers.podman collection (version 1.11.0).

    +

    This module is part of the containers.podman collection (version 1.13.0).

    It is not included in ansible-core. To check whether it is installed, run ansible-galaxy collection list.

    To install it, use: ansible-galaxy collection install containers.podman. diff --git a/ansible_collections/containers/podman/docs/podman_logout_module.html b/ansible_collections/containers/podman/docs/podman_logout_module.html index e52d3f016..9d0295c50 100644 --- a/ansible_collections/containers/podman/docs/podman_logout_module.html +++ b/ansible_collections/containers/podman/docs/podman_logout_module.html @@ -37,7 +37,7 @@

    containers.podman.podman_logout module – Log out of a container registry using podman

    Note

    -

    This module is part of the containers.podman collection (version 1.11.0).

    +

    This module is part of the containers.podman collection (version 1.13.0).

    It is not included in ansible-core. To check whether it is installed, run ansible-galaxy collection list.

    To install it, use: ansible-galaxy collection install containers.podman. diff --git a/ansible_collections/containers/podman/docs/podman_network_info_module.html b/ansible_collections/containers/podman/docs/podman_network_info_module.html index 488b52f62..cb8f98328 100644 --- a/ansible_collections/containers/podman/docs/podman_network_info_module.html +++ b/ansible_collections/containers/podman/docs/podman_network_info_module.html @@ -37,7 +37,7 @@

    containers.podman.podman_network_info module – Gather info about podman networks

    Note

    -

    This module is part of the containers.podman collection (version 1.11.0).

    +

    This module is part of the containers.podman collection (version 1.13.0).

    It is not included in ansible-core. To check whether it is installed, run ansible-galaxy collection list.

    To install it, use: ansible-galaxy collection install containers.podman. diff --git a/ansible_collections/containers/podman/docs/podman_network_module.html b/ansible_collections/containers/podman/docs/podman_network_module.html index c83643774..daaf3bc22 100644 --- a/ansible_collections/containers/podman/docs/podman_network_module.html +++ b/ansible_collections/containers/podman/docs/podman_network_module.html @@ -37,7 +37,7 @@

    containers.podman.podman_network module – Manage podman networks

    Note

    -

    This module is part of the containers.podman collection (version 1.11.0).

    +

    This module is part of the containers.podman collection (version 1.13.0).

    It is not included in ansible-core. To check whether it is installed, run ansible-galaxy collection list.

    To install it, use: ansible-galaxy collection install containers.podman. @@ -242,6 +242,27 @@ see

    +

    Path to the directory to write quadlet file in. By default, it will be set as /etc/containers/systemd/ for root user, ~/.config/containers/systemd/ for non-root users.

    +
    + +
    +

    quadlet_filename

    +

    string

    +
    +

    Name of quadlet file to write. By default it takes name value.

    +
    + +
    +

    quadlet_options

    +

    list / elements=string

    +
    +

    Options for the quadlet file. Provide missing in usual network args options as a list of lines to add.

    +
    + +

    recreate

    boolean

    @@ -253,7 +274,7 @@ see -
    diff --git a/ansible_collections/containers/podman/docs/podman_play_module.html b/ansible_collections/containers/podman/docs/podman_play_module.html index 4c27c4841..30a3654c8 100644 --- a/ansible_collections/containers/podman/docs/podman_play_module.html +++ b/ansible_collections/containers/podman/docs/podman_play_module.html @@ -37,7 +37,7 @@

    containers.podman.podman_play module – Play kubernetes YAML file using podman

    Note

    -

    This module is part of the containers.podman collection (version 1.11.0).

    +

    This module is part of the containers.podman collection (version 1.13.0).

    It is not included in ansible-core. To check whether it is installed, run ansible-galaxy collection list.

    To install it, use: ansible-galaxy collection install containers.podman. @@ -205,7 +205,7 @@ see

    tag

    string

    -

    specify a custom log tag for the container. This option is currently supported only by the journald log driver in Podman.

    +

    Specify a custom log tag for the container. This option is currently supported only by the journald log driver in Podman.

    @@ -223,6 +223,27 @@ see +

    Path to the directory to write quadlet file in. By default, it will be set as /etc/containers/systemd/ for root user, ~/.config/containers/systemd/ for non-root users.

    +
    + +
    +

    quadlet_filename

    +

    string

    +
    +

    Name of quadlet file to write. Must be specified if state is quadlet.

    +
    + +
    +

    quadlet_options

    +

    list / elements=string

    +
    +

    Options for the quadlet file. Provide missing in usual network args options as a list of lines to add.

    +
    + +

    quiet

    boolean

    @@ -234,7 +255,7 @@ see
    +

    recreate

    boolean

    @@ -246,14 +267,14 @@ see
    +

    Directory path for seccomp profiles (default is “/var/lib/kubelet/seccomp”). This option is not available with the remote Podman client

    -
    +

    state

    string / required

    @@ -263,10 +284,11 @@ see "created"

  • "started"

  • "absent"

  • +
  • "quadlet"

  • -
    +

    tls_verify

    boolean

    @@ -278,14 +300,14 @@ see
    diff --git a/ansible_collections/containers/podman/docs/podman_pod_info_module.html b/ansible_collections/containers/podman/docs/podman_pod_info_module.html index b708bdb1f..d93a4370c 100644 --- a/ansible_collections/containers/podman/docs/podman_pod_info_module.html +++ b/ansible_collections/containers/podman/docs/podman_pod_info_module.html @@ -37,7 +37,7 @@

    containers.podman.podman_pod_info module – Gather info about podman pods

    Note

    -

    This module is part of the containers.podman collection (version 1.11.0).

    +

    This module is part of the containers.podman collection (version 1.13.0).

    It is not included in ansible-core. To check whether it is installed, run ansible-galaxy collection list.

    To install it, use: ansible-galaxy collection install containers.podman. diff --git a/ansible_collections/containers/podman/docs/podman_pod_module.html b/ansible_collections/containers/podman/docs/podman_pod_module.html index ff057319e..6cd068f33 100644 --- a/ansible_collections/containers/podman/docs/podman_pod_module.html +++ b/ansible_collections/containers/podman/docs/podman_pod_module.html @@ -37,7 +37,7 @@

    containers.podman.podman_pod module – Manage Podman pods

    Note

    -

    This module is part of the containers.podman collection (version 1.11.0).

    +

    This module is part of the containers.podman collection (version 1.13.0).

    It is not included in ansible-core. To check whether it is installed, run ansible-galaxy collection list.

    To install it, use: ansible-galaxy collection install containers.podman. @@ -486,6 +486,27 @@ see

    +

    Path to the directory to write quadlet file in. By default, it will be set as /etc/containers/systemd/ for root user, ~/.config/containers/systemd/ for non-root users.

    +
    + +
    +

    quadlet_filename

    +

    string

    +
    +

    Name of quadlet file to write. By default it takes name value.

    +
    + +
    +

    quadlet_options

    +

    list / elements=string

    +
    +

    Options for the quadlet file. Provide missing in usual container args options as a list of lines to add.

    +
    + +

    recreate

    boolean

    @@ -497,14 +518,14 @@ see
    +

    share

    string

    A comma delimited list of kernel namespaces to share. If none or “” is specified, no namespaces will be shared. The namespaces to choose from are ipc, net, pid, user, uts.

    -
    +

    state

    string

    @@ -519,38 +540,39 @@ see "stopped"

  • "paused"

  • "unpaused"

  • +
  • "quadlet"

  • -
    +

    Name for GID map from the /etc/subgid file. Using this flag will run the container with user namespace enabled. This flag conflicts with `userns` and `gidmap`.

    -
    +

    subuidname

    string

    Name for UID map from the /etc/subuid file. Using this flag will run the container with user namespace enabled. This flag conflicts with `userns` and `uidmap`.

    -
    +

    uidmap

    list / elements=string

    Run the container in a new user namespace using the supplied mapping. This option conflicts with the `userns` and `subuidname` options. This option provides a way to map host UIDs to container UIDs. It can be passed several times to map different ranges.

    -
    +

    userns

    string

    Set the user namespace mode for all the containers in a pod. It defaults to the PODMAN_USERNS environment variable. An empty value (“”) means user namespaces are disabled.

    -
    +

    volume

    aliases: volumes

    @@ -565,7 +587,7 @@ see

    Examples

    diff --git a/ansible_collections/containers/podman/docs/podman_prune_module.html b/ansible_collections/containers/podman/docs/podman_prune_module.html index a596a9c9d..5340e199c 100644 --- a/ansible_collections/containers/podman/docs/podman_prune_module.html +++ b/ansible_collections/containers/podman/docs/podman_prune_module.html @@ -37,7 +37,7 @@

    containers.podman.podman_prune module – Allows to prune various podman objects

    Note

    -

    This module is part of the containers.podman collection (version 1.11.0).

    +

    This module is part of the containers.podman collection (version 1.13.0).

    It is not included in ansible-core. To check whether it is installed, run ansible-galaxy collection list.

    To install it, use: ansible-galaxy collection install containers.podman. diff --git a/ansible_collections/containers/podman/docs/podman_runlabel_module.html b/ansible_collections/containers/podman/docs/podman_runlabel_module.html index 133d14adf..9fa123e9d 100644 --- a/ansible_collections/containers/podman/docs/podman_runlabel_module.html +++ b/ansible_collections/containers/podman/docs/podman_runlabel_module.html @@ -37,7 +37,7 @@

    containers.podman.podman_runlabel module – Run given label from given image

    Note

    -

    This module is part of the containers.podman collection (version 1.11.0).

    +

    This module is part of the containers.podman collection (version 1.13.0).

    It is not included in ansible-core. To check whether it is installed, run ansible-galaxy collection list.

    To install it, use: ansible-galaxy collection install containers.podman. diff --git a/ansible_collections/containers/podman/docs/podman_save_module.html b/ansible_collections/containers/podman/docs/podman_save_module.html index 7a58a96b0..ea7fe01b5 100644 --- a/ansible_collections/containers/podman/docs/podman_save_module.html +++ b/ansible_collections/containers/podman/docs/podman_save_module.html @@ -37,7 +37,7 @@

    containers.podman.podman_save module – Saves podman image to tar file

    Note

    -

    This module is part of the containers.podman collection (version 1.11.0).

    +

    This module is part of the containers.podman collection (version 1.13.0).

    It is not included in ansible-core. To check whether it is installed, run ansible-galaxy collection list.

    To install it, use: ansible-galaxy collection install containers.podman. diff --git a/ansible_collections/containers/podman/docs/podman_secret_info_module.html b/ansible_collections/containers/podman/docs/podman_secret_info_module.html index acab00e36..7c8f69c54 100644 --- a/ansible_collections/containers/podman/docs/podman_secret_info_module.html +++ b/ansible_collections/containers/podman/docs/podman_secret_info_module.html @@ -37,7 +37,7 @@

    containers.podman.podman_secret_info module – Gather info about podman secrets

    Note

    -

    This module is part of the containers.podman collection (version 1.11.0).

    +

    This module is part of the containers.podman collection (version 1.13.0).

    It is not included in ansible-core. To check whether it is installed, run ansible-galaxy collection list.

    To install it, use: ansible-galaxy collection install containers.podman. diff --git a/ansible_collections/containers/podman/docs/podman_secret_module.html b/ansible_collections/containers/podman/docs/podman_secret_module.html index ace978f70..11b33f02c 100644 --- a/ansible_collections/containers/podman/docs/podman_secret_module.html +++ b/ansible_collections/containers/podman/docs/podman_secret_module.html @@ -37,7 +37,7 @@

    containers.podman.podman_secret module – Manage podman secrets

    Note

    -

    This module is part of the containers.podman collection (version 1.11.0).

    +

    This module is part of the containers.podman collection (version 1.13.0).

    It is not included in ansible-core. To check whether it is installed, run ansible-galaxy collection list.

    To install it, use: ansible-galaxy collection install containers.podman. diff --git a/ansible_collections/containers/podman/docs/podman_tag_module.html b/ansible_collections/containers/podman/docs/podman_tag_module.html index d7a369d5c..17687a89a 100644 --- a/ansible_collections/containers/podman/docs/podman_tag_module.html +++ b/ansible_collections/containers/podman/docs/podman_tag_module.html @@ -37,7 +37,7 @@

    containers.podman.podman_tag module – Add an additional name to a local image

    Note

    -

    This module is part of the containers.podman collection (version 1.11.0).

    +

    This module is part of the containers.podman collection (version 1.13.0).

    It is not included in ansible-core. To check whether it is installed, run ansible-galaxy collection list.

    To install it, use: ansible-galaxy collection install containers.podman. diff --git a/ansible_collections/containers/podman/docs/podman_unshare_become.html b/ansible_collections/containers/podman/docs/podman_unshare_become.html index 0a149528d..ae5b9003b 100644 --- a/ansible_collections/containers/podman/docs/podman_unshare_become.html +++ b/ansible_collections/containers/podman/docs/podman_unshare_become.html @@ -37,7 +37,7 @@

    containers.podman.podman_unshare become – Run tasks using podman unshare

    Note

    -

    This become plugin is part of the containers.podman collection (version 1.11.0).

    +

    This become plugin is part of the containers.podman collection (version 1.13.0).

    It is not included in ansible-core. To check whether it is installed, run ansible-galaxy collection list.

    To install it, use: ansible-galaxy collection install containers.podman.

    diff --git a/ansible_collections/containers/podman/docs/podman_volume_info_module.html b/ansible_collections/containers/podman/docs/podman_volume_info_module.html index 94481a108..35af76fc6 100644 --- a/ansible_collections/containers/podman/docs/podman_volume_info_module.html +++ b/ansible_collections/containers/podman/docs/podman_volume_info_module.html @@ -37,7 +37,7 @@

    containers.podman.podman_volume_info module – Gather info about podman volumes

    Note

    -

    This module is part of the containers.podman collection (version 1.11.0).

    +

    This module is part of the containers.podman collection (version 1.13.0).

    It is not included in ansible-core. To check whether it is installed, run ansible-galaxy collection list.

    To install it, use: ansible-galaxy collection install containers.podman. diff --git a/ansible_collections/containers/podman/docs/podman_volume_module.html b/ansible_collections/containers/podman/docs/podman_volume_module.html index d982f9e1b..11f57bf97 100644 --- a/ansible_collections/containers/podman/docs/podman_volume_module.html +++ b/ansible_collections/containers/podman/docs/podman_volume_module.html @@ -37,7 +37,7 @@

    containers.podman.podman_volume module – Manage Podman volumes

    Note

    -

    This module is part of the containers.podman collection (version 1.11.0).

    +

    This module is part of the containers.podman collection (version 1.13.0).

    It is not included in ansible-core. To check whether it is installed, run ansible-galaxy collection list.

    To install it, use: ansible-galaxy collection install containers.podman. @@ -126,6 +126,27 @@ see

    +

    Path to the directory to write quadlet file in. By default, it will be set as /etc/containers/systemd/ for root user, ~/.config/containers/systemd/ for non-root users.

    +
    + +
    +

    quadlet_filename

    +

    string

    +
    +

    Name of quadlet file to write. By default it takes name value.

    +
    + +
    +

    quadlet_options

    +

    list / elements=string

    +
    +

    Options for the quadlet file. Provide missing in usual network args options as a list of lines to add.

    +
    + +

    recreate

    boolean

    @@ -137,7 +158,7 @@ see @@ -155,7 +177,8 @@ see

    Examples

    diff --git a/ansible_collections/containers/podman/plugins/module_utils/podman/podman_container_lib.py b/ansible_collections/containers/podman/plugins/module_utils/podman/podman_container_lib.py index ff4c18629..bf42ffdee 100644 --- a/ansible_collections/containers/podman/plugins/module_utils/podman/podman_container_lib.py +++ b/ansible_collections/containers/podman/plugins/module_utils/podman/podman_container_lib.py @@ -10,6 +10,9 @@ from ansible_collections.containers.podman.plugins.module_utils.podman.common im from ansible_collections.containers.podman.plugins.module_utils.podman.common import delete_systemd from ansible_collections.containers.podman.plugins.module_utils.podman.common import normalize_signal from ansible_collections.containers.podman.plugins.module_utils.podman.common import ARGUMENTS_OPTS_DICT +from ansible_collections.containers.podman.plugins.module_utils.podman.quadlet import create_quadlet_state +from ansible_collections.containers.podman.plugins.module_utils.podman.quadlet import ContainerQuadlet + __metaclass__ = type @@ -17,7 +20,7 @@ ARGUMENTS_SPEC_CONTAINER = dict( name=dict(required=True, type='str'), executable=dict(default='podman', type='str'), state=dict(type='str', default='started', choices=[ - 'absent', 'present', 'stopped', 'started', 'created']), + 'absent', 'present', 'stopped', 'started', 'created', 'quadlet']), image=dict(type='str'), annotation=dict(type='dict'), attach=dict(type='list', elements='str', choices=['stdout', 'stderr', 'stdin']), @@ -116,6 +119,9 @@ ARGUMENTS_SPEC_CONTAINER = dict( publish=dict(type='list', elements='str', aliases=[ 'ports', 'published', 'published_ports']), publish_all=dict(type='bool'), + quadlet_dir=dict(type='path'), + quadlet_filename=dict(type='str'), + quadlet_options=dict(type='list', elements='str'), read_only=dict(type='bool'), read_only_tmpfs=dict(type='bool'), recreate=dict(type='bool', default=False), @@ -743,6 +749,8 @@ class PodmanDefaults: self.defaults['ipc'] = "private" self.defaults['uts'] = "private" self.defaults['pid'] = "private" + if (LooseVersion(self.version) >= LooseVersion('5.0.0')): + self.defaults['network'] = ["pasta"] if (LooseVersion(self.version) >= LooseVersion('3.0.0')): self.defaults['log_level'] = "warning" if (LooseVersion(self.version) >= LooseVersion('4.1.0')): @@ -1180,21 +1188,29 @@ class PodmanContainerDiff: for cr_net_opt in cr_net: if 'slirp4netns:' in cr_net_opt: before = [cr_net_opt] + if net_mode_before == 'pasta': + cr_net = [i.lower() for i in self._createcommand('--network')] + for cr_net_opt in cr_net: + if 'pasta:' in cr_net_opt: + before = [cr_net_opt] after = self.params['network'] or [] + after = [i.lower() for i in after] # If container is in pod and no networks are provided if not self.module_params['network'] and self.params['pod']: after = before return self._diff_update_and_compare('network', before, after) # Check special network modes - if after in [['bridge'], ['host'], ['slirp4netns'], ['none']]: + if after in [['bridge'], ['host'], ['slirp4netns'], ['none'], ['pasta']]: net_mode_after = after[0] # If changes are only for network mode and container has no networks if net_mode_after and not before: # Remove differences between v1 and v2 net_mode_after = net_mode_after.replace('bridge', 'default') net_mode_after = net_mode_after.replace('slirp4netns', 'default') + net_mode_after = net_mode_after.replace('pasta', 'default') net_mode_before = net_mode_before.replace('bridge', 'default') net_mode_before = net_mode_before.replace('slirp4netns', 'default') + net_mode_before = net_mode_before.replace('pasta', 'default') return self._diff_update_and_compare('network', net_mode_before, net_mode_after) # If container is attached to network of a different container if "container" in net_mode_before: @@ -1236,6 +1252,8 @@ class PodmanContainerDiff: s = ":".join( [str(h["hostport"]), p.replace('/tcp', '')] ).strip(":") + if h['hostip'] == '0.0.0.0' and LooseVersion(self.version) >= LooseVersion('5.0.0'): + return s if h['hostip']: return ":".join([h['hostip'], s]) return s @@ -1669,6 +1687,9 @@ class PodmanManager: else: self.results['diff']['before'] += sysd['diff']['before'] self.results['diff']['after'] += sysd['diff']['after'] + quadlet = ContainerQuadlet(self.module_params) + quadlet_content = quadlet.create_quadlet_content() + self.results.update({'podman_quadlet': quadlet_content}) def make_started(self): """Run actions if desired state is 'started'.""" @@ -1800,6 +1821,10 @@ class PodmanManager: self.results.update({'container': {}, 'podman_actions': self.container.actions}) + def make_quadlet(self): + results_update = create_quadlet_state(self.module, "container") + self.results.update(results_update) + def execute(self): """Execute the desired action according to map of actions & states.""" states_map = { @@ -1808,6 +1833,7 @@ class PodmanManager: 'absent': self.make_absent, 'stopped': self.make_stopped, 'created': self.make_created, + 'quadlet': self.make_quadlet, } process_action = states_map[self.state] process_action() diff --git a/ansible_collections/containers/podman/plugins/module_utils/podman/podman_pod_lib.py b/ansible_collections/containers/podman/plugins/module_utils/podman/podman_pod_lib.py index 4106136e2..e0031351f 100644 --- a/ansible_collections/containers/podman/plugins/module_utils/podman/podman_pod_lib.py +++ b/ansible_collections/containers/podman/plugins/module_utils/podman/podman_pod_lib.py @@ -1,11 +1,12 @@ from __future__ import (absolute_import, division, print_function) -import json +import json # noqa: F402 from ansible.module_utils._text import to_bytes, to_native from ansible_collections.containers.podman.plugins.module_utils.podman.common import LooseVersion from ansible_collections.containers.podman.plugins.module_utils.podman.common import lower_keys from ansible_collections.containers.podman.plugins.module_utils.podman.common import generate_systemd from ansible_collections.containers.podman.plugins.module_utils.podman.common import delete_systemd +from ansible_collections.containers.podman.plugins.module_utils.podman.quadlet import create_quadlet_state, PodQuadlet __metaclass__ = type @@ -23,6 +24,7 @@ ARGUMENTS_SPEC_POD = dict( 'stopped', 'paused', 'unpaused', + 'quadlet' ]), recreate=dict(type='bool', default=False), add_host=dict(type='list', required=False, elements='str'), @@ -62,6 +64,9 @@ ARGUMENTS_SPEC_POD = dict( pod_id_file=dict(type='str', required=False), publish=dict(type='list', required=False, elements='str', aliases=['ports']), + quadlet_dir=dict(type='path'), + quadlet_filename=dict(type='str'), + quadlet_options=dict(type='list', elements='str'), share=dict(type='str', required=False), subgidname=dict(type='str', required=False), subuidname=dict(type='str', required=False), @@ -267,7 +272,7 @@ class PodmanPodModuleParams: return c def addparam_no_hosts(self, c): - return c + ["=".join('--no-hosts', self.params['no_hosts'])] + return c + ["=".join(['--no-hosts', self.params['no_hosts']])] def addparam_pid(self, c): return c + ['--pid', self.params['pid']] @@ -465,6 +470,7 @@ class PodmanPodDiff: if before == ['podman']: before = [] after = self.params['network'] or [] + after = [i.lower() for i in after] # Special case for options for slirp4netns rootless networking from v2 if net_mode_before == 'slirp4netns' and 'createcommand' in self.info: cr_com = self.info['createcommand'] @@ -472,16 +478,24 @@ class PodmanPodDiff: cr_net = cr_com[cr_com.index('--network') + 1].lower() if 'slirp4netns:' in cr_net: before = [cr_net] + if net_mode_before == 'pasta' and 'createcommand' in self.info: + cr_com = self.info['createcommand'] + if '--network' in cr_com: + cr_net = cr_com[cr_com.index('--network') + 1].lower() + if 'pasta:' in cr_net: + before = [cr_net] # Currently supported only 'host' and 'none' network modes idempotency - if after in [['bridge'], ['host'], ['slirp4netns']]: + if after in [['bridge'], ['host'], ['slirp4netns'], ['pasta']]: net_mode_after = after[0] if net_mode_after and not before: # Remove differences between v1 and v2 net_mode_after = net_mode_after.replace('bridge', 'default') net_mode_after = net_mode_after.replace('slirp4netns', 'default') + net_mode_after = net_mode_after.replace('pasta', 'default') net_mode_before = net_mode_before.replace('bridge', 'default') net_mode_before = net_mode_before.replace('slirp4netns', 'default') + net_mode_before = net_mode_before.replace('pasta', 'default') return self._diff_update_and_compare('network', net_mode_before, net_mode_after) # For 4.4.0+ podman versions with no network specified if not net_mode_after and net_mode_before == 'slirp4netns' and not after: @@ -492,6 +506,11 @@ class PodmanPodDiff: net_mode_after = 'bridge' if before == ['bridge']: after = ['bridge'] + # For pasta networking for Podman v5 + if not net_mode_after and net_mode_before == 'pasta' and not after: + net_mode_after = 'pasta' + if before == ['pasta']: + after = ['pasta'] before, after = sorted(list(set(before))), sorted(list(set(after))) return self._diff_update_and_compare('network', before, after) @@ -507,6 +526,8 @@ class PodmanPodDiff: s = ":".join( [str(h["hostport"]), p.replace('/tcp', '')] ).strip(":") + if h['hostip'] == '0.0.0.0' and LooseVersion(self.version) >= LooseVersion('5.0.0'): + return s if h['hostip']: return ":".join([h['hostip'], s]) return s @@ -658,7 +679,16 @@ class PodmanPod: # pylint: disable=unused-variable rc, out, err = self.module.run_command( [self.module_params['executable'], b'pod', b'inspect', self.name]) - return json.loads(out) if rc == 0 else {} + if rc == 0: + info = json.loads(out) + # from podman 5 onwards, this is a list of dicts, + # before it was just a single dict when querying + # a single pod + if isinstance(info, list): + return info[0] + else: + return info + return {} def get_ps(self): """Inspect pod process and gather info about it.""" @@ -791,6 +821,8 @@ class PodmanPodManager: (default: {True}) """ facts = self.pod.get_info() if changed else self.pod.info + if isinstance(facts, list): + facts = facts[0] out, err = self.pod.stdout, self.pod.stderr self.results.update({'changed': changed, 'pod': facts, 'podman_actions': self.pod.actions}, @@ -812,6 +844,9 @@ class PodmanPodManager: else: self.results['diff']['before'] += sysd['diff']['before'] self.results['diff']['after'] += sysd['diff']['after'] + quadlet = PodQuadlet(self.module_params) + quadlet_content = quadlet.create_quadlet_content() + self.results.update({'podman_quadlet': quadlet_content}) def execute(self): """Execute the desired action according to map of actions & states.""" @@ -824,7 +859,7 @@ class PodmanPodManager: 'killed': self.make_killed, 'paused': self.make_paused, 'unpaused': self.make_unpaused, - + 'quadlet': self.make_quadlet, } process_action = states_map[self.state] process_action() @@ -926,3 +961,7 @@ class PodmanPodManager: self.results.update({'changed': True}) self.results.update({'pod': {}, 'podman_actions': self.pod.actions}) + + def make_quadlet(self): + results_update = create_quadlet_state(self.module, "pod") + self.results.update(results_update) diff --git a/ansible_collections/containers/podman/plugins/module_utils/podman/quadlet.py b/ansible_collections/containers/podman/plugins/module_utils/podman/quadlet.py new file mode 100644 index 000000000..17764b60d --- /dev/null +++ b/ansible_collections/containers/podman/plugins/module_utils/podman/quadlet.py @@ -0,0 +1,636 @@ +# Copyright (c) 2024 Sagi Shnaidman (@sshnaidm) +# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) + +from __future__ import absolute_import, division, print_function +__metaclass__ = type + +import os + +from ansible_collections.containers.podman.plugins.module_utils.podman.common import compare_systemd_file_content + +QUADLET_ROOT_PATH = "/etc/containers/systemd/" +QUADLET_NON_ROOT_PATH = "~/.config/containers/systemd/" + + +class Quadlet: + param_map = {} + + def __init__(self, section: str, params: dict): + self.section = section + self.custom_params = self.custom_prepare_params(params) + self.dict_params = self.prepare_params() + + def custom_prepare_params(self, params: dict) -> dict: + """ + Custom parameter processing for specific Quadlet types. + """ + # This should be implemented in child classes if needed. + return params + + def prepare_params(self) -> dict: + """ + Convert parameter values as per param_map. + """ + processed_params = [] + for param_key, quadlet_key in self.param_map.items(): + value = self.custom_params.get(param_key) + if value is not None: + if isinstance(value, list): + # Add an entry for each item in the list + for item in value: + processed_params.append([quadlet_key, item]) + else: + if isinstance(value, bool): + value = str(value).lower() + # Add a single entry for the key + processed_params.append([quadlet_key, value]) + return processed_params + + def create_quadlet_content(self) -> str: + """ + Construct the quadlet content as a string. + """ + custom_user_options = self.custom_params.get("quadlet_options") + custom_text = "\n" + "\n".join(custom_user_options) if custom_user_options else "" + return f"[{self.section}]\n" + "\n".join( + f"{key}={value}" for key, value in self.dict_params + ) + custom_text + "\n" + + def write_to_file(self, path: str): + """ + Write the quadlet content to a file at the specified path. + """ + content = self.create_quadlet_content() + with open(path, 'w') as file: + file.write(content) + + +class ContainerQuadlet(Quadlet): + param_map = { + 'cap_add': 'AddCapability', + 'device': 'AddDevice', + 'annotation': 'Annotation', + 'name': 'ContainerName', + # the following are not implemented yet in Podman module + 'AutoUpdate': 'AutoUpdate', + 'ContainersConfModule': 'ContainersConfModule', + # end of not implemented yet + 'dns': 'DNS', + 'dns_option': 'DNSOption', + 'dns_search': 'DNSSearch', + 'cap_drop': 'DropCapability', + 'entrypoint': 'Entrypoint', + 'env': 'Environment', + 'env_file': 'EnvironmentFile', + 'env_host': 'EnvironmentHost', + 'command': 'Exec', + 'expose': 'ExposeHostPort', + 'gidmap': 'GIDMap', + 'global_args': 'GlobalArgs', + 'group': 'Group', # Does not exist in module parameters + 'healthcheck': 'HealthCheckCmd', + 'healthcheck_interval': 'HealthInterval', + 'healthcheck_failure_action': 'HealthOnFailure', + 'healthcheck_retries': 'HealthRetries', + 'healthcheck_start_period': 'HealthStartPeriod', + 'healthcheck_timeout': 'HealthTimeout', + # the following are not implemented yet in Podman module + 'HealthStartupCmd': 'HealthStartupCmd', + 'HealthStartupInterval': 'HealthStartupInterval', + 'HealthStartupRetries': 'HealthStartupRetries', + 'HealthStartupSuccess': 'HealthStartupSuccess', + 'HealthStartupTimeout': 'HealthStartupTimeout', + # end of not implemented yet + 'hostname': 'HostName', + 'image': 'Image', + 'ip': 'IP', + # the following are not implemented yet in Podman module + 'IP6': 'IP6', + # end of not implemented yet + 'label': 'Label', + 'log_driver': 'LogDriver', + "Mask": "Mask", # add it in security_opt + 'mount': 'Mount', + 'network': 'Network', + 'no_new_privileges': 'NoNewPrivileges', + 'sdnotify': 'Notify', + 'pids_limit': 'PidsLimit', + 'pod': 'Pod', + 'publish': 'PublishPort', + # the following are not implemented yet in Podman module + "Pull": "Pull", + # end of not implemented yet + 'read_only': 'ReadOnly', + 'read_only_tmpfs': 'ReadOnlyTmpfs', + 'rootfs': 'Rootfs', + 'init': 'RunInit', + 'SeccompProfile': 'SeccompProfile', + 'secrets': 'Secret', + # All these are in security_opt + 'SecurityLabelDisable': 'SecurityLabelDisable', + 'SecurityLabelFileType': 'SecurityLabelFileType', + 'SecurityLabelLevel': 'SecurityLabelLevel', + 'SecurityLabelNested': 'SecurityLabelNested', + 'SecurityLabelType': 'SecurityLabelType', + 'shm_size': 'ShmSize', + 'stop_timeout': 'StopTimeout', + 'subgidname': 'SubGIDMap', + 'subuidname': 'SubUIDMap', + 'sysctl': 'Sysctl', + 'timezone': 'Timezone', + 'tmpfs': 'Tmpfs', + 'uidmap': 'UIDMap', + 'ulimit': 'Ulimit', + 'Unmask': 'Unmask', # --security-opt unmask=ALL + 'user': 'User', + 'userns': 'UserNS', + 'volume': 'Volume', + 'workdir': 'WorkingDir', + 'podman_args': 'PodmanArgs', + } + + def __init__(self, params: dict): + super().__init__("Container", params) + + def custom_prepare_params(self, params: dict) -> dict: + """ + Custom parameter processing for container-specific parameters. + """ + # Work on params in params_map and convert them to a right form + if params["annotation"]: + params['annotation'] = ["%s=%s" % + (k, v) for k, v in params['annotation'].items()] + if params["cap_add"]: + params["cap_add"] = " ".join(params["cap_add"]) + if params["cap_drop"]: + params["cap_drop"] = " ".join(params["cap_drop"]) + if params["command"]: + params["command"] = (" ".join(params["command"]) + if isinstance(params["command"], list) + else params["command"]) + if params["label"]: + params["label"] = ["%s=%s" % (k, v) for k, v in params["label"].items()] + if params["env"]: + params["env"] = ["%s=%s" % (k, v) for k, v in params["env"].items()] + if params["sysctl"]: + params["sysctl"] = ["%s=%s" % (k, v) for k, v in params["sysctl"].items()] + if params["tmpfs"]: + params["tmpfs"] = ["%s:%s" % (k, v) if v else k for k, v in params["tmpfs"].items()] + + # Work on params which are not in the param_map but can be calculated + params["global_args"] = [] + if params["user"] and len(str(params["user"]).split(":")) > 1: + user, group = params["user"].split(":") + params["user"] = user + params["group"] = group + if params["security_opt"]: + if "no-new-privileges" in params["security_opt"]: + params["no_new_privileges"] = True + params["security_opt"].remove("no-new-privileges") + if params["log_level"]: + params["global_args"].append(f"--log-level {params['log_level']}") + if params["debug"]: + params["global_args"].append("--log-level debug") + + # Work on params which are not in the param_map and add them to PodmanArgs + params["podman_args"] = [] + if params["authfile"]: + params["podman_args"].append(f"--authfile {params['authfile']}") + if params["attach"]: + for attach in params["attach"]: + params["podman_args"].append(f"--attach {attach}") + if params["blkio_weight"]: + params["podman_args"].append(f"--blkio-weight {params['blkio_weight']}") + if params["blkio_weight_device"]: + params["podman_args"].append(" ".join([ + f"--blkio-weight-device {':'.join(blkio)}" for blkio in params["blkio_weight_device"].items()])) + if params["cgroupns"]: + params["podman_args"].append(f"--cgroupns {params['cgroupns']}") + if params["cgroup_parent"]: + params["podman_args"].append(f"--cgroup-parent {params['cgroup_parent']}") + if params["cidfile"]: + params["podman_args"].append(f"--cidfile {params['cidfile']}") + if params["conmon_pidfile"]: + params["podman_args"].append(f"--conmon-pidfile {params['conmon_pidfile']}") + if params["cpuset_cpus"]: + params["podman_args"].append(f"--cpuset-cpus {params['cpuset_cpus']}") + if params["cpuset_mems"]: + params["podman_args"].append(f"--cpuset-mems {params['cpuset_mems']}") + if params["cpu_period"]: + params["podman_args"].append(f"--cpu-period {params['cpu_period']}") + if params["cpu_quota"]: + params["podman_args"].append(f"--cpu-quota {params['cpu_quota']}") + if params["cpu_rt_period"]: + params["podman_args"].append(f"--cpu-rt-period {params['cpu_rt_period']}") + if params["cpu_rt_runtime"]: + params["podman_args"].append(f"--cpu-rt-runtime {params['cpu_rt_runtime']}") + if params["cpu_shares"]: + params["podman_args"].append(f"--cpu-shares {params['cpu_shares']}") + if params["device_read_bps"]: + for i in params["device_read_bps"]: + params["podman_args"].append(f"--device-read-bps {i}") + if params["device_read_iops"]: + for i in params["device_read_iops"]: + params["podman_args"].append(f"--device-read-iops {i}") + if params["device_write_bps"]: + for i in params["device_write_bps"]: + params["podman_args"].append(f"--device-write-bps {i}") + if params["device_write_iops"]: + for i in params["device_write_iops"]: + params["podman_args"].append(f"--device-write-iops {i}") + if params["etc_hosts"]: + for host_ip in params['etc_hosts'].items(): + params["podman_args"].append(f"--add-host {':'.join(host_ip)}") + if params["hooks_dir"]: + for hook in params["hooks_dir"]: + params["podman_args"].append(f"--hooks-dir {hook}") + if params["http_proxy"]: + params["podman_args"].append(f"--http-proxy {params['http_proxy']}") + if params["image_volume"]: + params["podman_args"].append(f"--image-volume {params['image_volume']}") + if params["init_path"]: + params["podman_args"].append(f"--init-path {params['init_path']}") + if params["interactive"]: + params["podman_args"].append("--interactive") + if params["ipc"]: + params["podman_args"].append(f"--ipc {params['ipc']}") + if params["kernel_memory"]: + params["podman_args"].append(f"--kernel-memory {params['kernel_memory']}") + if params["label_file"]: + params["podman_args"].append(f"--label-file {params['label_file']}") + if params["log_opt"]: + for k, v in params['log_opt'].items(): + params["podman_args"].append(f"--log-opt {k.replace('max_size', 'max-size')}={v}") + if params["mac_address"]: + params["podman_args"].append(f"--mac-address {params['mac_address']}") + if params["memory"]: + params["podman_args"].append(f"--memory {params['memory']}") + if params["memory_reservation"]: + params["podman_args"].append(f"--memory-reservation {params['memory_reservation']}") + if params["memory_swap"]: + params["podman_args"].append(f"--memory-swap {params['memory_swap']}") + if params["memory_swappiness"]: + params["podman_args"].append(f"--memory-swappiness {params['memory_swappiness']}") + if params["network_aliases"]: + for alias in params["network_aliases"]: + params["podman_args"].append(f"--network-alias {alias}") + if params["no_hosts"] is not None: + params["podman_args"].append(f"--no-hosts={params['no_hosts']}") + if params["oom_kill_disable"]: + params["podman_args"].append(f"--oom-kill-disable={params['oom_kill_disable']}") + if params["oom_score_adj"]: + params["podman_args"].append(f"--oom-score-adj {params['oom_score_adj']}") + if params["pid"]: + params["podman_args"].append(f"--pid {params['pid']}") + if params["privileged"]: + params["podman_args"].append("--privileged") + if params["publish_all"]: + params["podman_args"].append("--publish-all") + if params["requires"]: + params["podman_args"].append(f"--requires {','.join(params['requires'])}") + if params["restart_policy"]: + params["podman_args"].append(f"--restart-policy {params['restart_policy']}") + if params["rm"]: + params["podman_args"].append("--rm") + if params["security_opt"]: + for security_opt in params["security_opt"]: + params["podman_args"].append(f"--security-opt {security_opt}") + if params["sig_proxy"]: + params["podman_args"].append(f"--sig-proxy {params['sig_proxy']}") + if params["stop_signal"]: + params["podman_args"].append(f"--stop-signal {params['stop_signal']}") + if params["systemd"]: + params["podman_args"].append(f"--systemd={str(params['systemd']).lower()}") + if params["tty"]: + params["podman_args"].append("--tty") + if params["uts"]: + params["podman_args"].append(f"--uts {params['uts']}") + if params["volumes_from"]: + for volume in params["volumes_from"]: + params["podman_args"].append(f"--volumes-from {volume}") + if params["cmd_args"]: + params["podman_args"].append(params["cmd_args"]) + + # Return params with custom processing applied + return params + + +class NetworkQuadlet(Quadlet): + param_map = { + 'name': 'NetworkName', + 'internal': 'Internal', + 'driver': 'Driver', + 'gateway': 'Gateway', + 'disable_dns': 'DisableDNS', + 'subnet': 'Subnet', + 'ip_range': 'IPRange', + 'ipv6': 'IPv6', + "opt": "Options", + # Add more parameter mappings specific to networks + 'ContainersConfModule': 'ContainersConfModule', + "DNS": "DNS", + "IPAMDriver": "IPAMDriver", + "Label": "Label", + "global_args": "GlobalArgs", + "podman_args": "PodmanArgs", + } + + def __init__(self, params: dict): + super().__init__("Network", params) + + def custom_prepare_params(self, params: dict) -> dict: + """ + Custom parameter processing for network-specific parameters. + """ + # Work on params in params_map and convert them to a right form + if params["debug"]: + params["global_args"].append("--log-level debug") + if params["opt"]: + new_opt = [] + for k, v in params["opt"].items(): + if v is not None: + new_opt.append(f"{k}={v}") + params["opt"] = new_opt + return params + + +# This is a inherited class that represents a Quadlet file for the Podman pod +class PodQuadlet(Quadlet): + param_map = { + 'name': 'PodName', + "network": "Network", + "publish": "PublishPort", + "volume": "Volume", + 'ContainersConfModule': 'ContainersConfModule', + "global_args": "GlobalArgs", + "podman_args": "PodmanArgs", + } + + def __init__(self, params: dict): + super().__init__("Pod", params) + + def custom_prepare_params(self, params: dict) -> dict: + """ + Custom parameter processing for pod-specific parameters. + """ + # Work on params in params_map and convert them to a right form + params["global_args"] = [] + params["podman_args"] = [] + + if params["add_host"]: + for host in params['add_host']: + params["podman_args"].append(f"--add-host {host}") + if params["cgroup_parent"]: + params["podman_args"].append(f"--cgroup-parent {params['cgroup_parent']}") + if params["blkio_weight"]: + params["podman_args"].append(f"--blkio-weight {params['blkio_weight']}") + if params["blkio_weight_device"]: + params["podman_args"].append(" ".join([ + f"--blkio-weight-device {':'.join(blkio)}" for blkio in params["blkio_weight_device"].items()])) + if params["cpuset_cpus"]: + params["podman_args"].append(f"--cpuset-cpus {params['cpuset_cpus']}") + if params["cpuset_mems"]: + params["podman_args"].append(f"--cpuset-mems {params['cpuset_mems']}") + if params["cpu_shares"]: + params["podman_args"].append(f"--cpu-shares {params['cpu_shares']}") + if params["cpus"]: + params["podman_args"].append(f"--cpus {params['cpus']}") + if params["device"]: + for device in params["device"]: + params["podman_args"].append(f"--device {device}") + if params["device_read_bps"]: + for i in params["device_read_bps"]: + params["podman_args"].append(f"--device-read-bps {i}") + if params["device_write_bps"]: + for i in params["device_write_bps"]: + params["podman_args"].append(f"--device-write-bps {i}") + if params["dns"]: + for dns in params["dns"]: + params["podman_args"].append(f"--dns {dns}") + if params["dns_opt"]: + for dns_option in params["dns_opt"]: + params["podman_args"].append(f"--dns-option {dns_option}") + if params["dns_search"]: + for dns_search in params["dns_search"]: + params["podman_args"].append(f"--dns-search {dns_search}") + if params["gidmap"]: + for gidmap in params["gidmap"]: + params["podman_args"].append(f"--gidmap {gidmap}") + if params["hostname"]: + params["podman_args"].append(f"--hostname {params['hostname']}") + if params["infra"]: + params["podman_args"].append(f"--infra {params['infra']}") + if params["infra_command"]: + params["podman_args"].append(f"--infra-command {params['infra_command']}") + if params["infra_conmon_pidfile"]: + params["podman_args"].append(f"--infra-conmon-pidfile {params['infra_conmon_pidfile']}") + if params["infra_image"]: + params["podman_args"].append(f"--infra-image {params['infra_image']}") + if params["infra_name"]: + params["podman_args"].append(f"--infra-name {params['infra_name']}") + if params["ip"]: + params["podman_args"].append(f"--ip {params['ip']}") + if params["label"]: + for label, label_v in params["label"].items(): + params["podman_args"].append(f"--label {label}={label_v}") + if params["label_file"]: + params["podman_args"].append(f"--label-file {params['label_file']}") + if params["mac_address"]: + params["podman_args"].append(f"--mac-address {params['mac_address']}") + if params["memory"]: + params["podman_args"].append(f"--memory {params['memory']}") + if params["memory_swap"]: + params["podman_args"].append(f"--memory-swap {params['memory_swap']}") + if params["no_hosts"]: + params["podman_args"].append(f"--no-hosts {params['no_hosts']}") + if params["pid"]: + params["podman_args"].append(f"--pid {params['pid']}") + if params["pod_id_file"]: + params["podman_args"].append(f"--pod-id-file {params['pod_id_file']}") + if params["share"]: + params["podman_args"].append(f"--share {params['share']}") + if params["subgidname"]: + params["podman_args"].append(f"--subgidname {params['subgidname']}") + if params["subuidname"]: + params["podman_args"].append(f"--subuidname {params['subuidname']}") + if params["uidmap"]: + for uidmap in params["uidmap"]: + params["podman_args"].append(f"--uidmap {uidmap}") + if params["userns"]: + params["podman_args"].append(f"--userns {params['userns']}") + if params["debug"]: + params["global_args"].append("--log-level debug") + + return params + + +# This is a inherited class that represents a Quadlet file for the Podman volume +class VolumeQuadlet(Quadlet): + param_map = { + 'name': 'VolumeName', + 'driver': 'Driver', + 'label': 'Label', + # 'opt': 'Options', + 'ContainersConfModule': 'ContainersConfModule', + 'global_args': 'GlobalArgs', + 'podman_args': 'PodmanArgs', + } + + def __init__(self, params: dict): + super().__init__("Volume", params) + + def custom_prepare_params(self, params: dict) -> dict: + """ + Custom parameter processing for volume-specific parameters. + """ + # Work on params in params_map and convert them to a right form + params["global_args"] = [] + params["podman_args"] = [] + + if params["debug"]: + params["global_args"].append("--log-level debug") + if params["label"]: + params["label"] = ["%s=%s" % (k, v) for k, v in params["label"].items()] + if params["options"]: + for opt in params["options"]: + params["podman_args"].append(f"--opt {opt}") + + return params + + +# This is a inherited class that represents a Quadlet file for the Podman kube +class KubeQuadlet(Quadlet): + param_map = { + 'configmap': 'ConfigMap', + 'log_driver': 'LogDriver', + 'network': 'Network', + 'kube_file': 'Yaml', + 'userns': 'UserNS', + 'AutoUpdate': 'AutoUpdate', + 'ExitCodePropagation': 'ExitCodePropagation', + 'KubeDownForce': 'KubeDownForce', + 'PublishPort': 'PublishPort', + 'SetWorkingDirectory': 'SetWorkingDirectory', + 'ContainersConfModule': 'ContainersConfModule', + 'global_args': 'GlobalArgs', + 'podman_args': 'PodmanArgs', + } + + def __init__(self, params: dict): + super().__init__("Kube", params) + + def custom_prepare_params(self, params: dict) -> dict: + """ + Custom parameter processing for kube-specific parameters. + """ + # Work on params in params_map and convert them to a right form + params["global_args"] = [] + params["podman_args"] = [] + + if params["debug"]: + params["global_args"].append("--log-level debug") + + return params + + +# This is a inherited class that represents a Quadlet file for the Podman image +class ImageQuadlet(Quadlet): + param_map = { + 'AllTags': 'AllTags', + 'arch': 'Arch', + 'authfile': 'AuthFile', + 'ca_cert_dir': 'CertDir', + 'creds': 'Creds', + 'DecryptionKey': 'DecryptionKey', + 'name': 'Image', + 'ImageTag': 'ImageTag', + 'OS': 'OS', + 'validate_certs': 'TLSVerify', + 'Variant': 'Variant', + 'ContainersConfModule': 'ContainersConfModule', + 'global_args': 'GlobalArgs', + 'podman_args': 'PodmanArgs', + } + + def __init__(self, params: dict): + super().__init__("Image", params) + + def custom_prepare_params(self, params: dict) -> dict: + """ + Custom parameter processing for image-specific parameters. + """ + # Work on params in params_map and convert them to a right form + params["global_args"] = [] + params["podman_args"] = [] + + if params["username"] and params["password"]: + params["creds"] = f"{params['username']}:{params['password']}" + # if params['validate_certs'] is not None: + # params['validate_certs'] = str(params['validate_certs']).lower() + + return params + + +def check_quadlet_directory(module, quadlet_dir): + '''Check if the directory exists and is writable. If not, fail the module.''' + if not os.path.exists(quadlet_dir): + try: + os.makedirs(quadlet_dir) + except Exception as e: + module.fail_json( + msg="Directory for quadlet_file can't be created: %s" % e) + if not os.access(quadlet_dir, os.W_OK): + module.fail_json( + msg="Directory for quadlet_file is not writable: %s" % quadlet_dir) + + +def create_quadlet_state(module, issuer): + '''Create a quadlet file for the specified issuer.''' + class_map = { + "container": ContainerQuadlet, + "network": NetworkQuadlet, + "pod": PodQuadlet, + "volume": VolumeQuadlet, + "kube": KubeQuadlet, + "image": ImageQuadlet, + } + # Let's detect which user is running + user = "root" if os.geteuid() == 0 else "user" + quadlet_dir = module.params.get('quadlet_dir') + if not quadlet_dir: + if user == "root": + quadlet_dir = QUADLET_ROOT_PATH + else: + quadlet_dir = os.path.expanduser(QUADLET_NON_ROOT_PATH) + # Create a filename based on the issuer + if not module.params.get('name') and not module.params.get('quadlet_filename'): + module.fail_json(msg=f"Filename for {issuer} is required for creating a quadlet file.") + if issuer == "image": + name = module.params['name'].split("/")[-1].split(":")[0] + else: + name = module.params.get('name') + quad_file_name = module.params['quadlet_filename'] + if quad_file_name and not quad_file_name.endswith(f".{issuer}"): + quad_file_name = f"{quad_file_name}.{issuer}" + filename = quad_file_name or f"{name}.{issuer}" + quadlet_file_path = os.path.join(quadlet_dir, filename) + # Check if the directory exists and is writable + check_quadlet_directory(module, quadlet_dir) + # Check if file already exists and if it's different + quadlet = class_map[issuer](module.params) + quadlet_content = quadlet.create_quadlet_content() + file_diff = compare_systemd_file_content(quadlet_file_path, quadlet_content) + if bool(file_diff): + quadlet.write_to_file(quadlet_file_path) + results_update = { + 'changed': True, + "diff": { + "before": "\n".join(file_diff[0]) if isinstance(file_diff[0], list) else file_diff[0] + "\n", + "after": "\n".join(file_diff[1]) if isinstance(file_diff[1], list) else file_diff[1] + "\n", + }} + else: + results_update = {} + return results_update + +# Check with following command: +# QUADLET_UNIT_DIRS= /usr/lib/systemd/system-generators/podman-system-generator {--user} --dryrun diff --git a/ansible_collections/containers/podman/plugins/modules/podman_container.py b/ansible_collections/containers/podman/plugins/modules/podman_container.py index 51cb57a53..75349f14e 100644 --- a/ansible_collections/containers/podman/plugins/modules/podman_container.py +++ b/ansible_collections/containers/podman/plugins/modules/podman_container.py @@ -55,6 +55,8 @@ options: If container doesn't exist, the module creates it and leaves it in 'created' state. If configuration doesn't match or 'recreate' option is set, the container will be recreated + - I(quadlet) - Write a quadlet file with the specified configuration. + Requires the C(quadlet_dir) option to be set. type: str default: started choices: @@ -63,6 +65,7 @@ options: - stopped - started - created + - quadlet image: description: - Repository path (or image name) and tag used to create the container. @@ -721,6 +724,22 @@ options: - Publish all exposed ports to random ports on the host interfaces. The default is false. type: bool + quadlet_dir: + description: + - Path to the directory to write quadlet file in. + By default, it will be set as C(/etc/containers/systemd/) for root user, + C(~/.config/containers/systemd/) for non-root users. + type: path + quadlet_filename: + description: + - Name of quadlet file to write. By default it takes C(name) value. + type: str + quadlet_options: + description: + - Options for the quadlet file. Provide missing in usual container args + options as a list of lines to add. + type: list + elements: str read_only: description: - Mount the container's root filesystem as read only. Default is false @@ -994,6 +1013,23 @@ EXAMPLES = r""" - --deploy-hook - "echo 1 > /var/lib/letsencrypt/complete" +- name: Create a Quadlet file + containers.podman.podman_container: + name: quadlet-container + image: nginx + state: quadlet + quadlet_filename: custome-container + device: "/dev/sda:/dev/xvda:rwm" + ports: + - "8080:80" + volumes: + - "/var/www:/usr/share/nginx/html" + quadlet_options: + - "AutoUpdate=registry" + - "Pull=true" + - | + [Install] + WantedBy=default.target """ RETURN = r""" diff --git a/ansible_collections/containers/podman/plugins/modules/podman_container_exec.py b/ansible_collections/containers/podman/plugins/modules/podman_container_exec.py index d30e85cdb..1827b0ce7 100644 --- a/ansible_collections/containers/podman/plugins/modules/podman_container_exec.py +++ b/ansible_collections/containers/podman/plugins/modules/podman_container_exec.py @@ -40,6 +40,11 @@ options: description: - Set environment variables. type: dict + executable: + description: + - The path to the podman executable. + type: str + default: podman privileged: description: - Give extended privileges to the container. @@ -141,6 +146,7 @@ def run_container_exec(module: AnsibleModule) -> dict: tty = module.params['tty'] user = module.params['user'] workdir = module.params['workdir'] + executable = module.params['executable'] if command is not None: argv = shlex.split(command) @@ -156,7 +162,7 @@ def run_container_exec(module: AnsibleModule) -> dict: to_text(value, errors='surrogate_or_strict') exec_options += ['--env', - '%s="%s"' % (key, value)] + '%s=%s' % (key, value)] if privileged: exec_options.append('--privileged') @@ -178,7 +184,7 @@ def run_container_exec(module: AnsibleModule) -> dict: exec_with_args.extend(exec_options) rc, stdout, stderr = run_podman_command( - module=module, executable='podman', args=exec_with_args) + module=module, executable=executable, args=exec_with_args, ignore_errors=True) result = { 'changed': changed, @@ -211,6 +217,10 @@ def main(): 'type': 'bool', 'default': False, }, + 'executable': { + 'type': 'str', + 'default': 'podman', + }, 'env': { 'type': 'dict', }, diff --git a/ansible_collections/containers/podman/plugins/modules/podman_generate_systemd.py b/ansible_collections/containers/podman/plugins/modules/podman_generate_systemd.py index 486a18a86..b27c16c6e 100644 --- a/ansible_collections/containers/podman/plugins/modules/podman_generate_systemd.py +++ b/ansible_collections/containers/podman/plugins/modules/podman_generate_systemd.py @@ -183,6 +183,7 @@ EXAMPLES = ''' - name: Postgres container must be started and enabled on systemd ansible.builtin.systemd: name: container-postgres_local + scope: user daemon_reload: true state: started enabled: true diff --git a/ansible_collections/containers/podman/plugins/modules/podman_image.py b/ansible_collections/containers/podman/plugins/modules/podman_image.py index 6305a5d5b..7fcb0041a 100644 --- a/ansible_collections/containers/podman/plugins/modules/podman_image.py +++ b/ansible_collections/containers/podman/plugins/modules/podman_image.py @@ -64,6 +64,7 @@ DOCUMENTATION = r''' - present - absent - build + - quadlet validate_certs: description: - Require HTTPS and validate certificates when pulling or pushing. Also used during build if a pull or push is necessary. @@ -175,6 +176,24 @@ DOCUMENTATION = r''' - docker-daemon - oci-archive - ostree + quadlet_dir: + description: + - Path to the directory to write quadlet file in. + By default, it will be set as C(/etc/containers/systemd/) for root user, + C(~/.config/containers/systemd/) for non-root users. + type: path + required: false + quadlet_filename: + description: + - Name of quadlet file to write. By default it takes image name without prefixes and tags. + type: str + quadlet_options: + description: + - Options for the quadlet file. Provide missing in usual network args + options as a list of lines to add. + type: list + elements: str + required: false ''' EXAMPLES = r""" @@ -280,6 +299,18 @@ EXAMPLES = r""" containers.podman.podman_image: name: nginx arch: amd64 + +- name: Create a quadlet file for an image + containers.podman.podman_image: + name: docker.io/library/alpine:latest + state: quadlet + quadlet_dir: /etc/containers/systemd + quadlet_filename: alpine-latest + quadlet_options: + - Variant=arm/v7 + - | + [Install] + WantedBy=default.target """ RETURN = r""" @@ -410,6 +441,7 @@ import shlex from ansible.module_utils._text import to_native from ansible.module_utils.basic import AnsibleModule from ansible_collections.containers.podman.plugins.module_utils.podman.common import run_podman_command +from ansible_collections.containers.podman.plugins.module_utils.podman.quadlet import create_quadlet_state class PodmanImageManager(object): @@ -451,6 +483,9 @@ class PodmanImageManager(object): if self.state in ['absent']: self.absent() + if self.state == 'quadlet': + self.make_quadlet() + def _run(self, args, expected_rc=0, ignore_errors=False): cmd = " ".join([self.executable] + [to_native(i) for i in args]) @@ -537,6 +572,11 @@ class PodmanImageManager(object): if not self.module.check_mode: self.remove_image_id() + def make_quadlet(self): + results_update = create_quadlet_state(self.module, "image") + self.results.update(results_update) + self.module.exit_json(**self.results) + def find_image(self, image_name=None): if image_name is None: image_name = self.image_name @@ -810,13 +850,16 @@ def main(): push=dict(type='bool', default=False), path=dict(type='str'), force=dict(type='bool', default=False), - state=dict(type='str', default='present', choices=['absent', 'present', 'build']), + state=dict(type='str', default='present', choices=['absent', 'present', 'build', 'quadlet']), validate_certs=dict(type='bool', aliases=['tlsverify', 'tls_verify']), executable=dict(type='str', default='podman'), auth_file=dict(type='path', aliases=['authfile']), username=dict(type='str'), password=dict(type='str', no_log=True), ca_cert_dir=dict(type='path'), + quadlet_dir=dict(type='path', required=False), + quadlet_filename=dict(type='str'), + quadlet_options=dict(type='list', elements='str', required=False), build=dict( type='dict', aliases=['build_args', 'buildargs'], diff --git a/ansible_collections/containers/podman/plugins/modules/podman_image_info.py b/ansible_collections/containers/podman/plugins/modules/podman_image_info.py index d8af08814..02b0f9ed1 100644 --- a/ansible_collections/containers/podman/plugins/modules/podman_image_info.py +++ b/ansible_collections/containers/podman/plugins/modules/podman_image_info.py @@ -48,7 +48,7 @@ RETURN = r""" images: description: info from all or specified images returned: always - type: dict + type: list sample: [ { "Annotations": {}, diff --git a/ansible_collections/containers/podman/plugins/modules/podman_login.py b/ansible_collections/containers/podman/plugins/modules/podman_login.py index 8ae8418a9..25bdb8d99 100644 --- a/ansible_collections/containers/podman/plugins/modules/podman_login.py +++ b/ansible_collections/containers/podman/plugins/modules/podman_login.py @@ -154,10 +154,7 @@ def main(): supports_check_mode=True, required_together=( ['username', 'password'], - ), - mutually_exclusive=( - ['certdir', 'tlsverify'], - ), + ) ) registry = module.params['registry'] diff --git a/ansible_collections/containers/podman/plugins/modules/podman_network.py b/ansible_collections/containers/podman/plugins/modules/podman_network.py index 3f52af4ce..37bfefede 100644 --- a/ansible_collections/containers/podman/plugins/modules/podman_network.py +++ b/ansible_collections/containers/podman/plugins/modules/podman_network.py @@ -127,11 +127,30 @@ options: choices: - present - absent + - quadlet recreate: description: - Recreate network even if exists. type: bool default: false + quadlet_dir: + description: + - Path to the directory to write quadlet file in. + By default, it will be set as C(/etc/containers/systemd/) for root user, + C(~/.config/containers/systemd/) for non-root users. + type: path + required: false + quadlet_filename: + description: + - Name of quadlet file to write. By default it takes I(name) value. + type: str + quadlet_options: + description: + - Options for the quadlet file. Provide missing in usual network args + options as a list of lines to add. + type: list + elements: str + required: false """ EXAMPLES = r""" @@ -148,6 +167,14 @@ EXAMPLES = r""" subnet: 192.168.22.0/24 gateway: 192.168.22.1 become: true + +- name: Create Quadlet file for podman network + containers.podman.podman_network: + name: podman_network + state: quadlet + quadlet_options: + - IPv6=true + - Label="ipv6 network" """ RETURN = r""" @@ -197,7 +224,7 @@ network: ] """ -import json # noqa: F402 +import json try: import ipaddress HAS_IP_ADDRESS_MODULE = True @@ -208,6 +235,7 @@ from ansible.module_utils.basic import AnsibleModule # noqa: F402 from ansible.module_utils._text import to_bytes, to_native # noqa: F402 from ansible_collections.containers.podman.plugins.module_utils.podman.common import LooseVersion from ansible_collections.containers.podman.plugins.module_utils.podman.common import lower_keys +from ansible_collections.containers.podman.plugins.module_utils.podman.quadlet import create_quadlet_state class PodmanNetworkModuleParams: @@ -620,6 +648,7 @@ class PodmanNetworkManager: states_map = { 'present': self.make_present, 'absent': self.make_absent, + 'quadlet': self.make_quadlet, } process_action = states_map[self.state] process_action() @@ -652,12 +681,17 @@ class PodmanNetworkManager: 'podman_actions': self.network.actions}) self.module.exit_json(**self.results) + def make_quadlet(self): + results_update = create_quadlet_state(self.module, "network") + self.results.update(results_update) + self.module.exit_json(**self.results) + def main(): module = AnsibleModule( argument_spec=dict( state=dict(type='str', default="present", - choices=['present', 'absent']), + choices=['present', 'absent', 'quadlet']), name=dict(type='str', required=True), disable_dns=dict(type='bool', required=False), driver=dict(type='str', required=False), @@ -681,6 +715,9 @@ def main(): executable=dict(type='str', required=False, default='podman'), debug=dict(type='bool', default=False), recreate=dict(type='bool', default=False), + quadlet_dir=dict(type='path', required=False), + quadlet_filename=dict(type='str', required=False), + quadlet_options=dict(type='list', elements='str', required=False), ), required_by=dict( # for IP range and GW to set 'subnet' is required ip_range=('subnet'), diff --git a/ansible_collections/containers/podman/plugins/modules/podman_play.py b/ansible_collections/containers/podman/plugins/modules/podman_play.py index 10a9a06fa..66138efc0 100644 --- a/ansible_collections/containers/podman/plugins/modules/podman_play.py +++ b/ansible_collections/containers/podman/plugins/modules/podman_play.py @@ -103,7 +103,8 @@ options: required: false tag: description: - - specify a custom log tag for the container. This option is currently supported only by the journald log driver in Podman. + - Specify a custom log tag for the container. + This option is currently supported only by the journald log driver in Podman. type: str required: false log_level: @@ -131,6 +132,7 @@ options: - created - started - absent + - quadlet required: True tls_verify: description: @@ -158,6 +160,24 @@ options: An empty value ("") means user namespaces are disabled. required: false type: str + quadlet_dir: + description: + - Path to the directory to write quadlet file in. + By default, it will be set as C(/etc/containers/systemd/) for root user, + C(~/.config/containers/systemd/) for non-root users. + type: path + required: false + quadlet_filename: + description: + - Name of quadlet file to write. Must be specified if state is quadlet. + type: str + quadlet_options: + description: + - Options for the quadlet file. Provide missing in usual network args + options as a list of lines to add. + type: list + elements: str + required: false ''' EXAMPLES = ''' @@ -178,6 +198,19 @@ EXAMPLES = ''' log_opt: path: /tmp/my-container.log max_size: 10mb + +- name: Create a Quadlet file + containers.podman.podman_play: + kube_file: ~/kube.yaml + state: quadlet + annotations: + greeting: hello + greet_to: world + userns: host + quadlet_filename: kube-pod + quadlet_options: + - "SetWorkingDirectory=yaml" + - "ExitCodePropagation=any" ''' import re # noqa: F402 try: @@ -187,6 +220,8 @@ except ImportError: HAS_YAML = False from ansible.module_utils.basic import AnsibleModule # noqa: F402 +from ansible_collections.containers.podman.plugins.module_utils.podman.common import LooseVersion, get_podman_version +from ansible_collections.containers.podman.plugins.module_utils.podman.quadlet import create_quadlet_state # noqa: F402 class PodmanKubeManagement: @@ -196,11 +231,12 @@ class PodmanKubeManagement: self.actions = [] self.executable = executable self.command = [self.executable, 'play', 'kube'] + self.version = get_podman_version(module) creds = [] # pod_name = extract_pod_name(module.params['kube_file']) if self.module.params['annotation']: for k, v in self.module.params['annotation'].items(): - self.command.extend(['--annotation', '"{k}={v}"'.format(k=k, v=v)]) + self.command.extend(['--annotation', '{k}={v}'.format(k=k, v=v)]) if self.module.params['username']: creds += [self.module.params['username']] if self.module.params['password']: @@ -244,17 +280,31 @@ class PodmanKubeManagement: self.module.log('PODMAN-PLAY-KUBE rc: %s' % rc) return rc, out, err + def tear_down_pods(self): + ''' + Tear down the pod and contaiers by using --down option in kube play + which is supported since Podman 3.4.0 + ''' + changed = False + kube_file = self.module.params['kube_file'] + + rc, out, err = self._command_run([self.executable, "kube", "play", "--down", kube_file]) + if rc != 0: + self.module.fail_json(msg="Failed to delete Pod with %s" % (kube_file)) + else: + changed = True + + return changed, out, err + def discover_pods(self): pod_name = '' if self.module.params['kube_file']: if HAS_YAML: with open(self.module.params['kube_file']) as f: - pod = yaml.safe_load(f) - if 'metadata' in pod: - pod_name = pod['metadata'].get('name') - else: - self.module.fail_json( - "No metadata in Kube file!\n%s" % pod) + pods = list(yaml.safe_load_all(f)) + for pod in pods: + if 'metadata' in pod and pod['kind'] in ['Deployment', 'Pod']: + pod_name = pod['metadata'].get('name') else: with open(self.module.params['kube_file']) as text: # the following formats are matched for a kube name: @@ -266,7 +316,7 @@ class PodmanKubeManagement: if re_pod: pod_name = re_pod.group(1) if not pod_name: - self.module.fail_json("Deployment doesn't have a name!") + self.module.fail_json("This Kube file doesn't have Pod or Deployment!") # Find all pods all_pods = '' # In case of one pod or replicasets @@ -294,8 +344,12 @@ class PodmanKubeManagement: return changed, out_all, err_all def pod_recreate(self): - pods = self.discover_pods() - self.remove_associated_pods(pods) + if self.version is not None and LooseVersion(self.version) >= LooseVersion('3.4.0'): + self.tear_down_pods() + else: + pods = self.discover_pods() + self.remove_associated_pods(pods) + # Create a pod rc, out, err = self._command_run(self.command) if rc != 0: @@ -318,6 +372,12 @@ class PodmanKubeManagement: changed = True return changed, out, err + def make_quadlet(self): + results = {"changed": False} + results_update = create_quadlet_state(self.module, "kube") + results.update(results_update) + self.module.exit_json(**results) + def main(): module = AnsibleModule( @@ -341,7 +401,7 @@ def main(): network=dict(type='list', elements='str'), state=dict( type='str', - choices=['started', 'created', 'absent'], + choices=['started', 'created', 'absent', 'quadlet'], required=True), tls_verify=dict(type='bool'), debug=dict(type='bool'), @@ -351,16 +411,28 @@ def main(): log_level=dict( type='str', choices=["debug", "info", "warn", "error", "fatal", "panic"]), + quadlet_dir=dict(type='path', required=False), + quadlet_filename=dict(type='str', required=False), + quadlet_options=dict(type='list', elements='str', required=False), ), supports_check_mode=True, + required_if=[ + ('state', 'quadlet', ['quadlet_filename']), + ], ) executable = module.get_bin_path( module.params['executable'], required=True) manage = PodmanKubeManagement(module, executable) if module.params['state'] == 'absent': - pods = manage.discover_pods() - changed, out, err = manage.remove_associated_pods(pods) + if manage.version is not None and LooseVersion(manage.version) > LooseVersion('3.4.0'): + manage.module.log(msg="version: %s, kube file %s" % (manage.version, manage.module.params['kube_file'])) + changed, out, err = manage.tear_down_pods() + else: + pods = manage.discover_pods() + changed, out, err = manage.remove_associated_pods(pods) + elif module.params['state'] == 'quadlet': + manage.make_quadlet() else: changed, out, err = manage.play() results = { diff --git a/ansible_collections/containers/podman/plugins/modules/podman_pod.py b/ansible_collections/containers/podman/plugins/modules/podman_pod.py index 7b57fd302..a975921ea 100644 --- a/ansible_collections/containers/podman/plugins/modules/podman_pod.py +++ b/ansible_collections/containers/podman/plugins/modules/podman_pod.py @@ -30,6 +30,7 @@ options: - stopped - paused - unpaused + - quadlet recreate: description: - Use with present and started states to force the re-creation of an @@ -340,6 +341,22 @@ options: required: false aliases: - ports + quadlet_dir: + description: + - Path to the directory to write quadlet file in. + By default, it will be set as C(/etc/containers/systemd/) for root user, + C(~/.config/containers/systemd/) for non-root users. + type: path + quadlet_filename: + description: + - Name of quadlet file to write. By default it takes I(name) value. + type: str + quadlet_options: + description: + - Options for the quadlet file. Provide missing in usual container args + options as a list of lines to add. + type: list + elements: str share: description: - A comma delimited list of kernel namespaces to share. If none or "" is specified, @@ -435,7 +452,7 @@ pod: EXAMPLES = ''' # What modules does for example -- podman_pod: +- containers.podman.podman_pod: name: pod1 state: started ports: @@ -447,6 +464,16 @@ EXAMPLES = ''' name: pod2 state: started publish: "127.0.0.1::80" + +# Create a Quadlet file for a pod +- containers.podman.podman_pod: + name: qpod + state: quadlet + ports: + - "4444:5555" + volume: + - /var/run/docker.sock:/var/run/docker.sock + quadlet_dir: /custom/dir ''' from ansible.module_utils.basic import AnsibleModule # noqa: F402 from ..module_utils.podman.podman_pod_lib import PodmanPodManager # noqa: F402 @@ -454,9 +481,7 @@ from ..module_utils.podman.podman_pod_lib import ARGUMENTS_SPEC_POD # noqa: F40 def main(): - module = AnsibleModule( - argument_spec=ARGUMENTS_SPEC_POD - ) + module = AnsibleModule(argument_spec=ARGUMENTS_SPEC_POD) results = PodmanPodManager(module, module.params).execute() module.exit_json(**results) diff --git a/ansible_collections/containers/podman/plugins/modules/podman_pod_info.py b/ansible_collections/containers/podman/plugins/modules/podman_pod_info.py index 8b2a4bf06..8597ae98d 100644 --- a/ansible_collections/containers/podman/plugins/modules/podman_pod_info.py +++ b/ansible_collections/containers/podman/plugins/modules/podman_pod_info.py @@ -109,9 +109,12 @@ def get_pod_info(module, executable, name): rc, out, err = module.run_command(command + [pod]) errs.append(err.strip()) rcs += [rc] - if not out or json.loads(out) is None or not json.loads(out): + data = json.loads(out) if out else None + if isinstance(data, list) and data: + data = data[0] + if not out or data is None or not data: continue - result.append(json.loads(out)) + result.append(data) return result, errs, rcs diff --git a/ansible_collections/containers/podman/plugins/modules/podman_volume.py b/ansible_collections/containers/podman/plugins/modules/podman_volume.py index b4d5062fa..0b990354a 100644 --- a/ansible_collections/containers/podman/plugins/modules/podman_volume.py +++ b/ansible_collections/containers/podman/plugins/modules/podman_volume.py @@ -24,6 +24,7 @@ options: choices: - present - absent + - quadlet recreate: description: - Recreate volume even if exists. @@ -62,6 +63,24 @@ options: - Return additional information which can be helpful for investigations. type: bool default: False + quadlet_dir: + description: + - Path to the directory to write quadlet file in. + By default, it will be set as C(/etc/containers/systemd/) for root user, + C(~/.config/containers/systemd/) for non-root users. + type: path + required: false + quadlet_filename: + description: + - Name of quadlet file to write. By default it takes I(name) value. + type: str + quadlet_options: + description: + - Options for the quadlet file. Provide missing in usual network args + options as a list of lines to add. + type: list + elements: str + required: false requirements: - "podman" @@ -88,7 +107,8 @@ volume: EXAMPLES = ''' # What modules does for example -- podman_volume: +- name: Create a volume + containers.podman.podman_volume: state: present name: volume1 label: @@ -97,6 +117,17 @@ EXAMPLES = ''' options: - "device=/dev/loop1" - "type=ext4" + +- name: Create a Quadlet file for a volume + containers.podman.podman_volume: + state: quadlet + name: quadlet_volume + quadlet_filename: custom-name + quadlet_options: + - Group=192 + - Copy=true + - Image=quay.io/centos/centos:latest + ''' # noqa: F402 import json # noqa: F402 @@ -105,6 +136,7 @@ from ansible.module_utils.basic import AnsibleModule # noqa: F402 from ansible.module_utils._text import to_bytes, to_native # noqa: F402 from ansible_collections.containers.podman.plugins.module_utils.podman.common import LooseVersion from ansible_collections.containers.podman.plugins.module_utils.podman.common import lower_keys +from ansible_collections.containers.podman.plugins.module_utils.podman.quadlet import create_quadlet_state class PodmanVolumeModuleParams: @@ -436,6 +468,7 @@ class PodmanVolumeManager: states_map = { 'present': self.make_present, 'absent': self.make_absent, + 'quadlet': self.make_quadlet, } process_action = states_map[self.state] process_action() @@ -468,12 +501,17 @@ class PodmanVolumeManager: 'podman_actions': self.volume.actions}) self.module.exit_json(**self.results) + def make_quadlet(self): + results_update = create_quadlet_state(self.module, "volume") + self.results.update(results_update) + self.module.exit_json(**self.results) + def main(): module = AnsibleModule( argument_spec=dict( state=dict(type='str', default="present", - choices=['present', 'absent']), + choices=['present', 'absent', 'quadlet']), name=dict(type='str', required=True), label=dict(type='dict', required=False), driver=dict(type='str', required=False), @@ -481,6 +519,9 @@ def main(): recreate=dict(type='bool', default=False), executable=dict(type='str', required=False, default='podman'), debug=dict(type='bool', default=False), + quadlet_dir=dict(type='path', required=False), + quadlet_filename=dict(type='str', required=False), + quadlet_options=dict(type='list', elements='str', required=False), )) PodmanVolumeManager(module).execute() diff --git a/ansible_collections/containers/podman/tests/integration/targets/podman_container/tasks/main.yml b/ansible_collections/containers/podman/tests/integration/targets/podman_container/tasks/main.yml index a6fd44083..02d664afa 100644 --- a/ansible_collections/containers/podman/tests/integration/targets/podman_container/tasks/main.yml +++ b/ansible_collections/containers/podman/tests/integration/targets/podman_container/tasks/main.yml @@ -15,6 +15,11 @@ podman_version: 4 when: podman_v.stdout is version('4.0.0', '>=') + - name: Set podman version to 5 + set_fact: + podman_version: 5 + when: podman_v.stdout is version('5.0.0', '>=') + - name: Delete all container leftovers from tests containers.podman.podman_container: executable: "{{ test_executable | default('podman') }}" @@ -702,7 +707,7 @@ path: /tmp/containzzzzcontainer1.service register: service_file - - name: Check that container has correct systemd output v4 + - name: Check that container has correct systemd output v4 and quadlet assert: that: - system14.podman_systemd.keys() | list | first == 'containzzzzcontainer1' @@ -712,6 +717,11 @@ - "'autogenerated by Podman' not in system14.podman_systemd.values() | list | first" - "'RestartSec=10' in system14.podman_systemd.values() | list | first" - "'TimeoutStartSec=20' in system14.podman_systemd.values() | list | first" + - system14.podman_quadlet | length > 0 + - system14.podman_quadlet | length > 0 + - "'ContainerName=container1' in system14.podman_quadlet" + - "'Image=alpine' in system14.podman_quadlet" + when: podman_version == 4 - name: Check that container has correct systemd output v3 @@ -855,9 +865,14 @@ dest: "{{ container_tempdir.path }}/latest-releases.yaml" register: alpine_releases_file + - name: Get content of alpine releases file + ansible.builtin.slurp: + src: "{{ container_tempdir.path }}/latest-releases.yaml" + register: latest_releases_file + - name: Download alpine latest rootfs vars: - latest_releases: "{{ lookup('file', alpine_releases_file.dest) }}" + latest_releases: "{{ latest_releases_file.content | b64decode }}" latest_version: "{{ (latest_releases | from_yaml)[0].version }}" latest_branch: "{{ (latest_releases | from_yaml)[0].branch }}" ansible.builtin.unarchive: @@ -1075,6 +1090,264 @@ - attach3 is failed - "'No such file or directory' in attach3.stderr" + - name: Create a Quadlet for container with filename + containers.podman.podman_container: + executable: "{{ test_executable | default('podman') }}" + name: container-quadlet + image: alpine + state: quadlet + quadlet_dir: /tmp + quadlet_filename: customfile + + - name: Check if files exists + stat: + path: /tmp/customfile.container + register: quadlet_file_custom + + - name: Fail if no file is present + assert: + that: + - quadlet_file_custom.stat.exists + + - name: Create a Quadlet for container with filename w/o dir + containers.podman.podman_container: + executable: "{{ test_executable | default('podman') }}" + name: container-quadlet + image: alpine + state: quadlet + quadlet_filename: container11.container + + - name: Check if files exists + stat: + path: ~/.config/containers/systemd/container11.container + register: quadlet_file_custom2 + + - name: Fail if no file is present + assert: + that: + - quadlet_file_custom2.stat.exists + + - name: Create a Quadlet for container with filename w/o dir + containers.podman.podman_container: + executable: "{{ test_executable | default('podman') }}" + name: container-quadlet + image: alpine + state: quadlet + + - name: Check if files exists + stat: + path: ~/.config/containers/systemd/container-quadlet.container + register: quadlet_file_custom3 + + - name: Fail if no file is present + assert: + that: + - quadlet_file_custom3.stat.exists + + - name: Create a Quadlet for container + containers.podman.podman_container: + executable: "{{ test_executable | default('podman') }}" + name: container-quadlet + image: alpine:3.12 + state: quadlet + quadlet_dir: /tmp + command: sleep 1d + recreate: true + etc_hosts: + host1: 127.0.0.1 + host2: 127.0.0.1 + annotation: + this: "annotation_value" + dns: + - 1.1.1.1 + - 8.8.4.4 + dns_search: example.com + cap_add: + - SYS_TIME + - NET_ADMIN + publish: + - "9000:80" + - "9001:8000" + workdir: "/bin" + env: + FOO: bar=1 + BAR: foo + TEST: 1 + BOOL: false + label: + somelabel: labelvalue + otheralbe: othervalue + volumes: + - /tmp:/data + mounts: + - type=devpts,destination=/dev/pts + quadlet_options: + - AutoUpdate=registry + - Unmask=ALL + - SecurityLabelFileType=usr_t + - Annotation=key1=annotation_value1 + - Annotation=key2=annotation_value2 + - | + [Install] + WantedBy=default.target + + - name: Check if files exists + stat: + path: /tmp/container-quadlet.container + register: quadlet_file + + - name: Check output is correct for Quadlet container in /tmp/container-quadlet.container file + assert: + that: + - quadlet_file.stat.exists + + - name: Check for the existence of lines in /tmp/container-quadlet.container + lineinfile: + path: /tmp/container-quadlet.container + line: "{{ item }}" + state: present + check_mode: yes + register: line_check + loop: + - "[Container]" + - "Annotation=this=annotation_value" + - "Annotation=key1=annotation_value1" + - "Annotation=key2=annotation_value2" + - "ContainerName=container-quadlet" + - "Image=alpine:3.12" + - "Exec=sleep 1d" + - "Volume=/tmp:/data" + - "Mount=type=devpts,destination=/dev/pts" + - "WorkingDir=/bin" + - "Unmask=ALL" + - "SecurityLabelFileType=usr_t" + - "Environment=BOOL=False" + - "PublishPort=9001:8000" + - "PodmanArgs=--add-host host2:127.0.0.1" + - "Label=somelabel=labelvalue" + - "WantedBy=default.target" + loop_control: + label: "{{ item }}" + + - name: Fail the task if any line is not present + fail: + msg: "The following line is not present in /tmp/container-quadlet.container: {{ item.item }}" + when: item.changed + loop: "{{ line_check.results }}" + loop_control: + label: "{{ item.item }}" + + - name: Create a Quadlet for container - same + containers.podman.podman_container: + executable: "{{ test_executable | default('podman') }}" + name: container-quadlet + image: alpine:3.12 + state: quadlet + quadlet_dir: /tmp + command: sleep 1d + recreate: true + etc_hosts: + host1: 127.0.0.1 + host2: 127.0.0.1 + annotation: + this: "annotation_value" + dns: + - 1.1.1.1 + - 8.8.4.4 + dns_search: example.com + cap_add: + - SYS_TIME + - NET_ADMIN + publish: + - "9000:80" + - "9001:8000" + workdir: "/bin" + env: + FOO: bar=1 + BAR: foo + TEST: 1 + BOOL: false + label: + somelabel: labelvalue + otheralbe: othervalue + volumes: + - /tmp:/data + mounts: + - type=devpts,destination=/dev/pts + quadlet_options: + - AutoUpdate=registry + - Unmask=ALL + - SecurityLabelFileType=usr_t + - Annotation=key1=annotation_value1 + - Annotation=key2=annotation_value2 + - | + [Install] + WantedBy=default.target + register: quad2 + + - name: Check if quadlet changed + assert: + that: + - quad2 is not changed + + - name: Create a Quadlet for container - different + containers.podman.podman_container: + executable: "{{ test_executable | default('podman') }}" + name: container-quadlet + image: alpine:3.12 + state: quadlet + quadlet_dir: /tmp + command: sleep 1d + recreate: true + etc_hosts: + host1: 127.0.0.45 + host2: 127.0.0.1 + annotation: + this: "annotation_value" + dns: + - 1.1.1.1 + - 8.8.4.4 + dns_search: example.com + cap_add: + - SYS_TIME + - NET_ADMIN + publish: + - "9000:80" + - "9001:8000" + workdir: "/bin" + env: + FOO: bar=1 + BAR: foo + TEST: 1 + BOOL: false + label: + somelabel: labelvalue + otheralbe: othervalue + volumes: + - /tmp:/data + mounts: + - type=devpts,destination=/dev/pts + quadlet_options: + - AutoUpdate=registry + - Unmask=ALL + - SecurityLabelFileType=usr_t + - Annotation=key1=annotation_value1 + - Annotation=key2=annotation_value2 + - | + [Install] + WantedBy=default.target + register: quad3 + + - name: Print diff + debug: + var: quad3.diff + + - name: Check if changed and diff + assert: + that: + - quad3 is changed + - "'127.0.0.45' in quad3.diff.after" + always: - name: Remove container diff --git a/ansible_collections/containers/podman/tests/integration/targets/podman_container_exec/tasks/main.yml b/ansible_collections/containers/podman/tests/integration/targets/podman_container_exec/tasks/main.yml index 2d2874325..623965c10 100644 --- a/ansible_collections/containers/podman/tests/integration/targets/podman_container_exec/tasks/main.yml +++ b/ansible_collections/containers/podman/tests/integration/targets/podman_container_exec/tasks/main.yml @@ -12,6 +12,7 @@ - name: Test exec when the container doesn't exist containers.podman.podman_container_exec: + executable: "{{ test_executable | default('podman') }}" name: "{{ container_name }}" command: "cat /etc/redhat-release" ignore_errors: true @@ -19,6 +20,7 @@ - name: Create and start a container for testing containers.podman.podman_container: + executable: "{{ test_executable | default('podman') }}" name: "{{ container_name }}" image: registry.access.redhat.com/ubi8 command: sleep 1d @@ -26,6 +28,7 @@ - name: Test exec with command and workdir options containers.podman.podman_container_exec: + executable: "{{ test_executable | default('podman') }}" name: "{{ container_name }}" command: "cat redhat-release" workdir: /etc @@ -33,6 +36,7 @@ - name: Test exec with argv and env options containers.podman.podman_container_exec: + executable: "{{ test_executable | default('podman') }}" name: "{{ container_name }}" argv: - /bin/sh @@ -45,6 +49,7 @@ - name: Test exec with detach option containers.podman.podman_container_exec: + executable: "{{ test_executable | default('podman') }}" name: "{{ container_name }}" command: "cat redhat-release" detach: true @@ -59,6 +64,21 @@ - "'goodbye world' in exec2.stdout" - exec3.exec_id is defined + - name: Test exec with failing command + containers.podman.podman_container_exec: + executable: "{{ test_executable | default('podman') }}" + name: "{{ container_name }}" + command: "ls /nonexistent" + register: exec4 + ignore_errors: true + + - name: Check if the result is as expected in case of a failing command + assert: + that: + - exec4 is failed + - "'No such file or directory' in exec4.stderr" + - exec4.rc != 0 + always: - name: Cleanup containers.podman.podman_container: diff --git a/ansible_collections/containers/podman/tests/integration/targets/podman_container_idempotency/tasks/main.yml b/ansible_collections/containers/podman/tests/integration/targets/podman_container_idempotency/tasks/main.yml index 3d3654aea..02b66d250 100644 --- a/ansible_collections/containers/podman/tests/integration/targets/podman_container_idempotency/tasks/main.yml +++ b/ansible_collections/containers/podman/tests/integration/targets/podman_container_idempotency/tasks/main.yml @@ -1,4 +1,24 @@ --- + +- name: Discover podman version + shell: podman version | grep "^Version:" | awk {'print $2'} + register: podman_v + +- name: Set podman version to 3 + set_fact: + podman_version: 3 + when: podman_v.stdout is version('4.0.0', 'lt') + +- name: Set podman version to 4 + set_fact: + podman_version: 4 + when: podman_v.stdout is version('4.0.0', '>=') + +- name: Set podman version to 5 + set_fact: + podman_version: 5 + when: podman_v.stdout is version('5.0.0', '>=') + - name: Prepare a container include_tasks: build_test_container.yml diff --git a/ansible_collections/containers/podman/tests/integration/targets/podman_container_idempotency/tasks/rootless-podman-network.yml b/ansible_collections/containers/podman/tests/integration/targets/podman_container_idempotency/tasks/rootless-podman-network.yml index 62dd3a5a0..3c16efac2 100644 --- a/ansible_collections/containers/podman/tests/integration/targets/podman_container_idempotency/tasks/rootless-podman-network.yml +++ b/ansible_collections/containers/podman/tests/integration/targets/podman_container_idempotency/tasks/rootless-podman-network.yml @@ -109,53 +109,108 @@ that: - info5 is changed - - name: Run container with slirp4netns options - containers.podman.podman_container: - executable: "{{ test_executable | default('podman') }}" - name: rootlessnet - image: "{{ idem_image }}" - command: 1h - state: present - network: - - slirp4netns:allow_host_loopback=true,cidr=10.0.3.0/24 - register: info6 + - when: podman_version < 5 + name: Run container tasks with slirp4netns options before v5 + block: + - name: Run container with slirp4netns options + containers.podman.podman_container: + executable: "{{ test_executable | default('podman') }}" + name: rootlessnet + image: "{{ idem_image }}" + command: 1h + state: present + network: + - slirp4netns:allow_host_loopback=true,cidr=10.0.3.0/24 + register: info6 - - name: Check info with slirp4netns options - assert: - that: - - info6 is changed + - name: Check info with slirp4netns options + assert: + that: + - info6 is changed - - name: Run container with slirp4netns options - again - containers.podman.podman_container: - executable: "{{ test_executable | default('podman') }}" - name: rootlessnet - image: "{{ idem_image }}" - command: 1h - state: present - network: - - slirp4netns:allow_host_loopback=true,cidr=10.0.3.0/24 - register: info7 + - name: Run container with slirp4netns options - again + containers.podman.podman_container: + executable: "{{ test_executable | default('podman') }}" + name: rootlessnet + image: "{{ idem_image }}" + command: 1h + state: present + network: + - slirp4netns:allow_host_loopback=true,cidr=10.0.3.0/24 + register: info7 - - name: Check info with slirp4netns options - again - assert: - that: - - info7 is not changed + - name: Check info with slirp4netns options - again + assert: + that: + - info7 is not changed - - name: Run container with different slirp4netns options - containers.podman.podman_container: - executable: "{{ test_executable | default('podman') }}" - name: rootlessnet - image: "{{ idem_image }}" - command: 1h - state: present - network: - - slirp4netns:allow_host_loopback=true,cidr=10.0.4.0/24 - register: info8 + - name: Run container with different slirp4netns options + containers.podman.podman_container: + executable: "{{ test_executable | default('podman') }}" + name: rootlessnet + image: "{{ idem_image }}" + command: 1h + state: present + network: + - slirp4netns:allow_host_loopback=true,cidr=10.0.4.0/24 + register: info8 - - name: Check info with different slirp4netns options - assert: - that: - - info8 is changed + - name: Check info with different slirp4netns options + assert: + that: + - info8 is changed + + + - when: podman_version >= 5 + name: Run container tasks with pasta options for v5 and later + block: + - name: Run container with pasta options + containers.podman.podman_container: + executable: "{{ test_executable | default('podman') }}" + name: rootlessnet + image: "{{ idem_image }}" + command: 1h + state: present + network: + - "pasta:-4,-t,8007,-u,4443,-T,3000" + register: info6 + + - name: Check info with pasta options + assert: + that: + - info6 is changed + + - name: Run container with pasta options - again + containers.podman.podman_container: + executable: "{{ test_executable | default('podman') }}" + name: rootlessnet + image: "{{ idem_image }}" + command: 1h + state: present + network: + - "pasta:-4,-t,8007,-u,4443,-T,3000" + register: info7 + + - name: Check info with pasta options - again + assert: + that: + - info7 is not changed + + - name: Run container with different pasta options + containers.podman.podman_container: + executable: "{{ test_executable | default('podman') }}" + name: rootlessnet + image: "{{ idem_image }}" + command: 1h + state: present + network: + - "pasta:-4,-t,8008,-u,4443,-T,3000" + register: info8 + + - name: Check info with different pasta options + assert: + that: + - info8 is changed - name: Run container without options containers.podman.podman_container: diff --git a/ansible_collections/containers/podman/tests/integration/targets/podman_generate_systemd/tasks/main.yml b/ansible_collections/containers/podman/tests/integration/targets/podman_generate_systemd/tasks/main.yml index 1e48a11dc..6b0c335cd 100644 --- a/ansible_collections/containers/podman/tests/integration/targets/podman_generate_systemd/tasks/main.yml +++ b/ansible_collections/containers/podman/tests/integration/targets/podman_generate_systemd/tasks/main.yml @@ -1,11 +1,14 @@ - name: A postgres container must exist, stopped containers.podman.podman_container: + executable: "{{ test_executable | default('podman') }}" name: postgres_local image: docker.io/library/postgres:latest + # image: quay.io/enterprisedb/postgresql - use if docker is rate limited state: stopped - name: Generate the systemd units as Ansible variables containers.podman.podman_generate_systemd: + executable: "{{ test_executable | default('podman') }}" name: postgres_local register: postgres_local_systemd_unit ignore_errors: true @@ -29,6 +32,7 @@ - name: Regenerate the systemd units and write them containers.podman.podman_generate_systemd: + executable: "{{ test_executable | default('podman') }}" name: postgres_local dest: /tmp/podman_generate_systemd register: postgres_local_systemd_unit @@ -41,6 +45,7 @@ - name: Try to create a systemd unit file on the same path containers.podman.podman_generate_systemd: + executable: "{{ test_executable | default('podman') }}" name: postgres_local dest: /tmp/podman_generate_systemd register: generate1 @@ -58,6 +63,7 @@ - name: Force to create a systemd unit file on the same path containers.podman.podman_generate_systemd: + executable: "{{ test_executable | default('podman') }}" name: postgres_local dest: /tmp/podman_generate_systemd force: true @@ -83,6 +89,7 @@ - name: Regenerate the systemd units with all the options containers.podman.podman_generate_systemd: + executable: "{{ test_executable | default('podman') }}" name: postgres_local new: true restart_policy: on-abnormal @@ -100,7 +107,6 @@ after: drink.service wants: water.service requires: ice.service - executable: /usr/bin/podman register: postgres_local_systemd_unit ignore_errors: true @@ -123,13 +129,14 @@ - postgres_local_systemd_unit.podman_command is search("--after=drink.service") - postgres_local_systemd_unit.podman_command is search("--wants=water.service") - postgres_local_systemd_unit.podman_command is search("--requires=ice.service") - - postgres_local_systemd_unit.podman_command is search("/usr/bin/podman") + - postgres_local_systemd_unit.podman_command is search("podman") - name: Remove container containers.podman.podman_container: executable: "{{ test_executable | default('podman') }}" name: postgres_local state: absent + - name: Remove the systemd unit files directory ansible.builtin.file: path: /tmp/podman_generate_systemd diff --git a/ansible_collections/containers/podman/tests/integration/targets/podman_image/tasks/main.yml b/ansible_collections/containers/podman/tests/integration/targets/podman_image/tasks/main.yml index 0db4c050c..96133b9da 100644 --- a/ansible_collections/containers/podman/tests/integration/targets/podman_image/tasks/main.yml +++ b/ansible_collections/containers/podman/tests/integration/targets/podman_image/tasks/main.yml @@ -329,6 +329,134 @@ - item.Architecture == "arm" loop: "{{ imageinfo_arch.images }}" + - name: Create a Quadlet for image with filename + containers.podman.podman_image: + executable: "{{ test_executable | default('podman') }}" + name: quay.io/coreos/coreos-installer:latest + state: quadlet + arch: x86_64 + quadlet_dir: /tmp + quadlet_filename: customfile + + - name: Check if files exists + stat: + path: /tmp/customfile.image + register: quadlet_file_custom + + - name: Fail if no file is present + assert: + that: + - quadlet_file_custom.stat.exists + + - name: Create quadlet image file + containers.podman.podman_image: + executable: "{{ test_executable | default('podman') }}" + name: quay.io/coreos/coreos-installer:latest + state: quadlet + arch: x86_64 + ca_cert_dir: /etc/docker/certs.d + username: user + password: pass + validate_certs: false + quadlet_dir: /tmp/ + quadlet_options: + - "ImageTag=quay.io/coreos/coreos-installer:12345" + - "AllTags=true" + - |- + [Install] + WantedBy=default.target + + - name: Check if files exists + stat: + path: /tmp/coreos-installer.image + register: quadlet_file + + - name: Check output is correct for Quadlet image in /tmp/coreos-installer.image file + assert: + that: + - quadlet_file.stat.exists + + - name: Check for the existence of lines in /tmp/coreos-installer.image + lineinfile: + path: /tmp/coreos-installer.image + line: "{{ item }}" + state: present + check_mode: yes + register: line_check + loop: + - "[Image]" + - "Image=quay.io/coreos/coreos-installer:latest" + - "ImageTag=quay.io/coreos/coreos-installer:12345" + - "AllTags=true" + - "WantedBy=default.target" + - "Arch=x86_64" + - "CertDir=/etc/docker/certs.d" + - "Creds=user:pass" + - "TLSVerify=false" + loop_control: + label: "{{ item }}" + + - name: Fail the task if any line is not present + fail: + msg: "The following line is not present in /tmp/coreos-installer.image: {{ item.item }}" + when: item.changed + loop: "{{ line_check.results }}" + loop_control: + label: "{{ item.item }}" + + - name: Create quadlet image file - same + containers.podman.podman_image: + executable: "{{ test_executable | default('podman') }}" + name: quay.io/coreos/coreos-installer:latest + state: quadlet + arch: x86_64 + ca_cert_dir: /etc/docker/certs.d + username: user + password: pass + validate_certs: false + quadlet_dir: /tmp + quadlet_options: + - "ImageTag=quay.io/coreos/coreos-installer:12345" + - "AllTags=true" + - |- + [Install] + WantedBy=default.target + register: quad2 + + - name: Check if quadlet changed + assert: + that: + - quad2 is not changed + + - name: Create quadlet image file - different + containers.podman.podman_image: + executable: "{{ test_executable | default('podman') }}" + name: quay.io/coreos/coreos-installer:latest + state: quadlet + arch: arm64 + ca_cert_dir: /etc/docker/certs.d + username: user + password: pass + validate_certs: false + quadlet_dir: /tmp/ + quadlet_options: + - "ImageTag=quay.io/coreos/coreos-installer:12345" + - "AllTags=true" + - |- + [Install] + WantedBy=default.target + register: quad3 + + - name: Print diff + debug: + var: quad3.diff + + - name: Check if changed and diff + assert: + that: + - quad3 is changed + - "'arm64' in quad3.diff.after" + always: - name: Cleanup images containers.podman.podman_image: diff --git a/ansible_collections/containers/podman/tests/integration/targets/podman_network/tasks/main.yml b/ansible_collections/containers/podman/tests/integration/targets/podman_network/tasks/main.yml index d207e4cef..272ac6b43 100644 --- a/ansible_collections/containers/podman/tests/integration/targets/podman_network/tasks/main.yml +++ b/ansible_collections/containers/podman/tests/integration/targets/podman_network/tasks/main.yml @@ -350,6 +350,131 @@ that: - info17 is not changed + - name: Create a Quadlet for network with filename + containers.podman.podman_network: + executable: "{{ test_executable | default('podman') }}" + name: testnet + state: quadlet + quadlet_dir: /tmp + quadlet_filename: customfile + + - name: Check if files exists + stat: + path: /tmp/customfile.network + register: quadlet_file_custom + + - name: Fail if no file is present + assert: + that: + - quadlet_file_custom.stat.exists + + - name: Create quadlet network file + containers.podman.podman_network: + executable: "{{ test_executable | default('podman') }}" + name: testnet + state: quadlet + disable_dns: true + subnet: "10.123.12.0" + internal: false + opt: + isolate: true + mtu: 1511 + vlan: 111 + quadlet_dir: /tmp + quadlet_options: + - "Label=Test=network" + - "Label=foo=bar" + + - name: Check if files exists + stat: + path: /tmp/testnet.network + register: quadlet_file + + - name: Check output is correct for Quadlet network in /tmp/testnet.network file + assert: + that: + - quadlet_file.stat.exists + + - name: Check for the existence of lines in /tmp/testnet.network + lineinfile: + path: /tmp/testnet.network + line: "{{ item }}" + state: present + check_mode: yes + register: line_check + loop: + - "[Network]" + - "NetworkName=testnet" + - "Subnet=10.123.12.0" + - "DisableDNS=true" + - "Internal=false" + - "Options=isolate=True" + - "Options=mtu=1511" + - "Options=vlan=111" + - "Label=Test=network" + - "Label=foo=bar" + loop_control: + label: "{{ item }}" + + - name: Fail the task if any line is not present + fail: + msg: "The following line is not present in /tmp/testnet.network: {{ item.item }}" + when: item.changed + loop: "{{ line_check.results }}" + loop_control: + label: "{{ item.item }}" + + - name: Create quadlet network file - same + containers.podman.podman_network: + executable: "{{ test_executable | default('podman') }}" + name: testnet + state: quadlet + disable_dns: true + subnet: "10.123.12.0" + internal: false + opt: + isolate: true + mtu: 1511 + vlan: 111 + quadlet_dir: /tmp + quadlet_options: + - "Label=Test=network" + - "Label=foo=bar" + register: quad2 + + - name: Check if quadlet changed + assert: + that: + - quad2 is not changed + + - name: Create quadlet network file - different + containers.podman.podman_network: + executable: "{{ test_executable | default('podman') }}" + name: testnet + state: quadlet + disable_dns: true + subnet: "10.123.15.0" + internal: false + opt: + isolate: true + mtu: 1511 + vlan: 111 + quadlet_dir: /tmp + quadlet_options: + - "Label=Test=network" + - "Label=foo=bar" + register: quad3 + + - name: Print diff + debug: + var: quad3.diff + + - name: Check if changed and diff + assert: + that: + - quad3 is changed + - "'10.123.15.0' in quad3.diff.after" + always: - name: Cleanup diff --git a/ansible_collections/containers/podman/tests/integration/targets/podman_play/tasks/files/multi-yaml.yml b/ansible_collections/containers/podman/tests/integration/targets/podman_play/tasks/files/multi-yaml.yml new file mode 100644 index 000000000..2a969556b --- /dev/null +++ b/ansible_collections/containers/podman/tests/integration/targets/podman_play/tasks/files/multi-yaml.yml @@ -0,0 +1,27 @@ +kind: ConfigMap +metadata: + name: foo +data: + FOO: bar +--- +apiVersion: v1 +kind: Pod +metadata: + name: foobar +spec: + containers: + - command: + - top + name: container-1 + image: alpine + envFrom: + - configMapRef: + name: foo + optional: false +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: foo2 +data: + FOO2: bar2 \ No newline at end of file diff --git a/ansible_collections/containers/podman/tests/integration/targets/podman_play/tasks/main.yml b/ansible_collections/containers/podman/tests/integration/targets/podman_play/tasks/main.yml index ae9d8572b..d22615e45 100644 --- a/ansible_collections/containers/podman/tests/integration/targets/podman_play/tasks/main.yml +++ b/ansible_collections/containers/podman/tests/integration/targets/podman_play/tasks/main.yml @@ -107,6 +107,180 @@ that: - info1['pods'][0]['State'] == 'Running' + - name: Remove pods created by kube play + containers.podman.podman_play: + executable: "{{ test_executable | default('podman') }}" + kube_file: /tmp/play3.yaml + state: absent + register: remove_pod + + - name: Check if the pod was removed as expected + assert: + that: + - remove_pod is changed + + - name: Get deleted pod info + containers.podman.podman_pod_info: + executable: "{{ test_executable | default('podman') }}" + name: web-deploy-pod + register: nonexist + + - name: Check if the result is as expected + assert: + that: + - nonexist.pods == [] + + + - name: Create a Quadlet for kube with filename + containers.podman.podman_play: + executable: "{{ test_executable | default('podman') }}" + kube_file: /home/kubeuser/tmp/multipod.yaml + state: quadlet + quadlet_dir: /tmp + quadlet_filename: customfile + + - name: Check if files exists + stat: + path: /tmp/customfile.kube + register: quadlet_file_custom + + - name: Fail if no file is present + assert: + that: + - quadlet_file_custom.stat.exists + + - name: Create a kube quadlet without filename + containers.podman.podman_play: + executable: "{{ test_executable | default('podman') }}" + kube_file: /home/kubeuser/tmp/multipod.yaml + state: quadlet + quadlet_dir: /tmp + register: quadlet_file_no_name + ignore_errors: true + + - name: Check that task failed + assert: + that: + - quadlet_file_no_name is failed + + - name: Create a kube quadlet + containers.podman.podman_play: + executable: "{{ test_executable | default('podman') }}" + kube_file: /home/kubeuser/tmp/multipod.yaml + state: quadlet + userns: keep-id:uid=200,gid=210 + log_driver: journald + network: host + configmap: + - /tmp/configmap1 + - /tmp/configmap2 + debug: true + quadlet_dir: /tmp + quadlet_filename: quadlet + quadlet_options: + - "PodmanArgs=--annotation=key1=value1" + - "PodmanArgs=--context-dir /my/path" + - | + [Install] + WantedBy=default.target + + - name: Check if files exists + stat: + path: /tmp/quadlet.kube + register: quadlet_file + + - name: Check output is correct for Quadlet container in /tmp/quadlet.kube file + assert: + that: + - quadlet_file.stat.exists + + - name: Check for the existence of lines in /tmp/quadlet.kube + lineinfile: + path: /tmp/quadlet.kube + line: "{{ item }}" + state: present + check_mode: yes + register: line_check + loop: + - "[Kube]" + - "ConfigMap=/tmp/configmap1" + - "ConfigMap=/tmp/configmap2" + - "LogDriver=journald" + - "Network=host" + - "Yaml=/home/kubeuser/tmp/multipod.yaml" + - "UserNS=keep-id:uid=200,gid=210" + - "GlobalArgs=--log-level debug" + - "WantedBy=default.target" + loop_control: + label: "{{ item }}" + + - name: Fail the task if any line is not present + fail: + msg: "The following line is not present in /tmp/quadlet.kube: {{ item.item }}" + when: item.changed + loop: "{{ line_check.results }}" + loop_control: + label: "{{ item.item }}" + + - name: Create a kube quadlet - same + containers.podman.podman_play: + executable: "{{ test_executable | default('podman') }}" + kube_file: /home/kubeuser/tmp/multipod.yaml + state: quadlet + userns: keep-id:uid=200,gid=210 + log_driver: journald + network: host + configmap: + - /tmp/configmap1 + - /tmp/configmap2 + debug: true + quadlet_dir: /tmp + quadlet_filename: quadlet.kube + quadlet_options: + - "PodmanArgs=--annotation=key1=value1" + - "PodmanArgs=--context-dir /my/path" + - | + [Install] + WantedBy=default.target + register: quad2 + + - name: Check if quadlet changed + assert: + that: + - quad2 is not changed + + - name: Create a kube quadlet - different + containers.podman.podman_play: + executable: "{{ test_executable | default('podman') }}" + kube_file: /home/kubeuser/tmp/multipod.yaml + state: quadlet + userns: keep-id:uid=200,gid=210 + log_driver: journald + network: host + configmap: + - /tmp/configmap55 + - /tmp/configmap2 + debug: true + quadlet_dir: /tmp + quadlet_filename: quadlet.kube + quadlet_options: + - "PodmanArgs=--annotation=key1=value1" + - "PodmanArgs=--context-dir /my/path" + - | + [Install] + WantedBy=default.target + register: quad3 + + - name: Print diff + debug: + var: quad3.diff + + - name: Check if changed and diff + assert: + that: + - quad3 is changed + - "'configmap55' in quad3.diff.after" + always: - name: Delete all pods leftovers from tests @@ -145,4 +319,12 @@ size: 10mb userns: host kube_dir: /tmp - kube_file: play-pod.yaml \ No newline at end of file + kube_file: play-pod.yaml + +- name: Test play kube with multi doc yaml + include_tasks: play-multi-yaml.yml + vars: + ansible_python_interpreter: "/usr/bin/python" + kube_dir: /tmp + kube_file: multi-yaml.yml + target_container: foobar-container-1 diff --git a/ansible_collections/containers/podman/tests/integration/targets/podman_play/tasks/play-multi-yaml.yml b/ansible_collections/containers/podman/tests/integration/targets/podman_play/tasks/play-multi-yaml.yml new file mode 100644 index 000000000..5eae4f5e5 --- /dev/null +++ b/ansible_collections/containers/podman/tests/integration/targets/podman_play/tasks/play-multi-yaml.yml @@ -0,0 +1,40 @@ +--- +- name: Test kube play wih multi doc yaml + block: + - name: Copy kube file + copy: + src: "{{ kube_file }}" + dest: "{{ kube_dir }}/{{ kube_file }}" + remote_src: false + + - name: Create Pod with multi doc yaml + containers.podman.podman_play: + executable: "{{ test_executable | default('podman') }}" + kube_file: "{{ kube_dir }}/{{ kube_file }}" + state: started + recreate: true + register: play_pod + + - name: Get pod info + containers.podman.podman_container_info: + executable: "{{ test_executable | default('podman') }}" + name: "{{ target_container }}" + register: info + + - name: Check if an expected container is running + assert: + that: + - info.containers.0.State.Running == true + - '"FOO=bar" in info.containers.0.Config.Env' + + - name: Cleanup pod + containers.podman.podman_play: + executable: "{{ test_executable | default('podman') }}" + kube_file: "{{ kube_dir }}/{{ kube_file }}" + state: absent + register: remove_pod + + - name: Check if the pod was removed as expected + assert: + that: + - remove_pod is changed diff --git a/ansible_collections/containers/podman/tests/integration/targets/podman_play/tasks/play-with-build.yml b/ansible_collections/containers/podman/tests/integration/targets/podman_play/tasks/play-with-build.yml index e7601f531..32fde5d6a 100644 --- a/ansible_collections/containers/podman/tests/integration/targets/podman_play/tasks/play-with-build.yml +++ b/ansible_collections/containers/podman/tests/integration/targets/podman_play/tasks/play-with-build.yml @@ -9,6 +9,7 @@ - name: Make sure that {{ image_name }} image is absent containers.podman.podman_image: + executable: "{{ test_executable | default('podman') }}" name: "{{ image_name }}" state: absent @@ -31,6 +32,7 @@ - name: Play kube file with image build containers.podman.podman_play: + executable: "{{ test_executable | default('podman') }}" kube_file: "{{ kube_dir }}/kube-buil-test.yaml" build: true context_dir: "{{ build_context_dir }}" @@ -47,5 +49,6 @@ - name: Cleanup pods containers.podman.podman_play: + executable: "{{ test_executable | default('podman') }}" kube_file: "{{ kube_dir }}/kube-buil-test.yaml" state: absent diff --git a/ansible_collections/containers/podman/tests/integration/targets/podman_play/tasks/play-with-options.yml b/ansible_collections/containers/podman/tests/integration/targets/podman_play/tasks/play-with-options.yml index aeb79a5bc..40167368b 100644 --- a/ansible_collections/containers/podman/tests/integration/targets/podman_play/tasks/play-with-options.yml +++ b/ansible_collections/containers/podman/tests/integration/targets/podman_play/tasks/play-with-options.yml @@ -9,6 +9,7 @@ - name: Create Pod with many options containers.podman.podman_play: + executable: "{{ test_executable | default('podman') }}" kube_file: "{{ kube_dir }}/{{ kube_file }}" state: started recreate: true @@ -23,6 +24,7 @@ - name: Get pod info containers.podman.podman_pod_info: + executable: "{{ test_executable | default('podman') }}" name: "{{ target_pod }}" register: play_pod_info @@ -33,6 +35,7 @@ - name: Get container info containers.podman.podman_container_info: + executable: "{{ test_executable | default('podman') }}" name: "{{ target_container }}" register: play_container_info @@ -48,5 +51,6 @@ - name: Cleanup pods containers.podman.podman_play: + executable: "{{ test_executable | default('podman') }}" kube_file: "{{ kube_dir }}/{{ kube_file }}" state: absent diff --git a/ansible_collections/containers/podman/tests/integration/targets/podman_pod/tasks/main.yml b/ansible_collections/containers/podman/tests/integration/targets/podman_pod/tasks/main.yml index abee17596..cb455aa23 100644 --- a/ansible_collections/containers/podman/tests/integration/targets/podman_pod/tasks/main.yml +++ b/ansible_collections/containers/podman/tests/integration/targets/podman_pod/tasks/main.yml @@ -15,6 +15,21 @@ podman_version: 2 when: podman_v.stdout is version('2.0.0', '>=') + - name: Set podman version to 3 + set_fact: + podman_version: 3 + when: podman_v.stdout is version('3.0.0', '>=') + + - name: Set podman version to 4 + set_fact: + podman_version: 4 + when: podman_v.stdout is version('4.0.0', '>=') + + - name: Set podman version to 5 + set_fact: + podman_version: 5 + when: podman_v.stdout is version('5.0.0', '>=') + - name: Discover cgroups version shell: podman info | grep cgroupVersion | awk {'print $2'} register: cgroups @@ -153,6 +168,7 @@ pod6_info.pod['State']['status'] == 'Exited') or (pod6_info.pod['State']['status'] is not defined and pod6_info.pod['State'] == 'Exited') + when: podman_version < 5 - name: Start pod containers.podman.podman_pod: @@ -826,69 +842,289 @@ that: - not podsys2_stat.stat.exists|bool - - name: Run pod2 with network slirp4netns + - name: Run slirp4netns tests for podman < 5 + when: podman_version < 5 + block: + + - name: Run pod2 with network slirp4netns + containers.podman.podman_pod: + executable: "{{ test_executable | default('podman') }}" + name: pod2 + state: started + network: slirp4netns:outbound_addr=10.10.10.46 + + - name: Run container1 in pod + containers.podman.podman_container: + executable: "{{ test_executable | default('podman') }}" + name: container1 + image: alpine + command: top + pod: pod2 + state: started + + - name: Run pod2 with network slirp4netns - again + containers.podman.podman_pod: + executable: "{{ test_executable | default('podman') }}" + name: pod2 + state: started + network: slirp4netns:outbound_addr=10.10.10.46 + register: slip4net_pod + + - name: Run container1 in pod slirp4netns + containers.podman.podman_container: + executable: "{{ test_executable | default('podman') }}" + name: container1 + image: alpine + command: top + pod: pod2 + state: started + register: slip4net_cont + + - name: Check that slirp4netns is idempotent + assert: + that: + - slip4net_pod is not changed + - slip4net_cont is not changed + + - name: Run pod2 with different network slirp4netns + containers.podman.podman_pod: + executable: "{{ test_executable | default('podman') }}" + name: pod2 + state: started + network: slirp4netns:outbound_addr=10.10.10.47 + register: slip4net_pod2 + + - name: Run container1 in different pod slirp4netns + containers.podman.podman_container: + executable: "{{ test_executable | default('podman') }}" + name: container1 + image: alpine + command: top + pod: pod2 + state: started + register: slip4net_cont2 + + - name: Check that slirp4netns is idempotent and changed + assert: + that: + - slip4net_pod2 is changed + - slip4net_cont2 is changed + + - name: Run pasta tests for podman >= 5 + when: podman_version >= 5 + block: + + - name: Run pod2 with network pasta + containers.podman.podman_pod: + executable: "{{ test_executable | default('podman') }}" + name: pod2 + state: started + network: + - "pasta:-4,-t,8007,-u,4443,-T,3000" + + - name: Run container1 in pod + containers.podman.podman_container: + executable: "{{ test_executable | default('podman') }}" + name: container1 + image: alpine + command: top + pod: pod2 + state: started + + - name: Run pod2 with network pasta - again + containers.podman.podman_pod: + executable: "{{ test_executable | default('podman') }}" + name: pod2 + state: started + network: + - "pasta:-4,-t,8007,-u,4443,-T,3000" + register: pasta_pod + + - name: Run container1 in pod pasta + containers.podman.podman_container: + executable: "{{ test_executable | default('podman') }}" + name: container1 + image: alpine + command: top + pod: pod2 + state: started + register: pasta_cont + + - name: Check that pasta is idempotent + assert: + that: + - pasta_pod is not changed + - pasta_cont is not changed + + - name: Run pod2 with different network pasta + containers.podman.podman_pod: + executable: "{{ test_executable | default('podman') }}" + name: pod2 + state: started + network: + - "pasta:-4,-t,8008,-u,4443,-T,3000" + register: pasta_pod2 + + - name: Run container1 in different pod slirp4netns + containers.podman.podman_container: + executable: "{{ test_executable | default('podman') }}" + name: container1 + image: alpine + command: top + pod: pod2 + state: started + register: pasta_cont2 + + - name: Check that slirp4netns is idempotent and changed + assert: + that: + - pasta_pod2 is changed + - pasta_cont2 is changed + + - name: Create a Quadlet for pod with filename containers.podman.podman_pod: executable: "{{ test_executable | default('podman') }}" - name: pod2 - state: started - network: slirp4netns:outbound_addr=10.10.10.46 + name: podq + state: quadlet + network: examplenet + quadlet_dir: /tmp + quadlet_filename: customfile - - name: Run container1 in pod - containers.podman.podman_container: - executable: "{{ test_executable | default('podman') }}" - name: container1 - image: alpine - command: top - pod: pod2 - state: started + - name: Check if files exists + stat: + path: /tmp/customfile.pod + register: quadlet_file_custom - - name: Run pod2 with network slirp4netns - again - containers.podman.podman_pod: - executable: "{{ test_executable | default('podman') }}" - name: pod2 - state: started - network: slirp4netns:outbound_addr=10.10.10.46 - register: slip4net_pod + - name: Fail if no file is present + assert: + that: + - quadlet_file_custom.stat.exists - - name: Run container1 in pod slirp4netns - containers.podman.podman_container: + - name: Create a Quadlet pod file + containers.podman.podman_pod: executable: "{{ test_executable | default('podman') }}" - name: container1 - image: alpine - command: top - pod: pod2 - state: started - register: slip4net_cont + name: podq + state: quadlet + network: examplenet + share: net + subuidname: username1 + userns: auto + publish: 8000:8001 + add_host: + - host1 + volume: + - /tmp:/data + - /whocares:/data2:ro + quadlet_dir: /tmp + quadlet_options: + - "Label=somelabel=labelvalue" + - | + [Install] + WantedBy=default.target + register: quadlet_pod + + - name: Check if files exists + stat: + path: /tmp/podq.pod + register: quadlet_file - - name: Check that slirp4netns is idempotent + - name: Check output is correct for Quadlet container in /tmp/podq.pod file assert: that: - - slip4net_pod is not changed - - slip4net_cont is not changed - - - name: Run pod2 with different network slirp4netns + - quadlet_file.stat.exists + + - name: Check for the existence of lines in /tmp/podq.pod + lineinfile: + path: /tmp/podq.pod + line: "{{ item }}" + state: present + check_mode: yes + register: line_check + loop: + - "[Pod]" + - "Network=examplenet" + - "PodName=podq" + - "PublishPort=8000:8001" + - "Volume=/tmp:/data" + - "Volume=/whocares:/data2:ro" + - "PodmanArgs=--add-host host1" + - "PodmanArgs=--share net" + - "PodmanArgs=--subuidname username1" + - "PodmanArgs=--userns auto" + - "PodmanArgs=--add-host host1" + - "Label=somelabel=labelvalue" + - "WantedBy=default.target" + loop_control: + label: "{{ item }}" + + - name: Fail the task if any line is not present + fail: + msg: "The following line is not present in /tmp/podq.pod: {{ item.item }}" + when: item.changed + loop: "{{ line_check.results }}" + loop_control: + label: "{{ item.item }}" + + - name: Create a Quadlet pod file - same containers.podman.podman_pod: executable: "{{ test_executable | default('podman') }}" - name: pod2 - state: started - network: slirp4netns:outbound_addr=10.10.10.47 - register: slip4net_pod2 + name: podq + state: quadlet + network: examplenet + share: net + subuidname: username1 + userns: auto + publish: 8000:8001 + add_host: + - host1 + volume: + - /tmp:/data + - /whocares:/data2:ro + quadlet_dir: /tmp + quadlet_options: + - "Label=somelabel=labelvalue" + - | + [Install] + WantedBy=default.target + register: quad2 + + - name: Check if quadlet changed + assert: + that: + - quad2 is not changed - - name: Run container1 in different pod slirp4netns - containers.podman.podman_container: + - name: Create a Quadlet pod file - different + containers.podman.podman_pod: executable: "{{ test_executable | default('podman') }}" - name: container1 - image: alpine - command: top - pod: pod2 - state: started - register: slip4net_cont2 - - - name: Check that slirp4netns is idempotent and changed + name: podq + state: quadlet + network: examplenet + share: net + subuidname: username1 + userns: auto + publish: 8000:8001 + add_host: + - host1 + volume: + - /tmp:/newdata + - /whocares:/data2:ro + quadlet_dir: /tmp + quadlet_options: + - "Label=somelabel=labelvalue" + - | + [Install] + WantedBy=default.target + register: quad3 + + - name: Print diff + debug: + var: quad3.diff + + - name: Check if changed and diff assert: that: - - slip4net_pod2 is changed - - slip4net_cont2 is changed + - quad3 is changed + - "'newdata' in quad3.diff.after" always: diff --git a/ansible_collections/containers/podman/tests/integration/targets/podman_pod/tasks/resource-limit.yml b/ansible_collections/containers/podman/tests/integration/targets/podman_pod/tasks/resource-limit.yml index 94017d9f9..8727d6e50 100644 --- a/ansible_collections/containers/podman/tests/integration/targets/podman_pod/tasks/resource-limit.yml +++ b/ansible_collections/containers/podman/tests/integration/targets/podman_pod/tasks/resource-limit.yml @@ -11,6 +11,7 @@ - name: Create pod for limiting resources containers.podman.podman_pod: + executable: "{{ test_executable | default('podman') }}" name: limited-pod state: created blkio_weight: "{{ limit.blkio_weight }}" @@ -20,6 +21,7 @@ - name: Get information on pod for limiting resources containers.podman.podman_pod_info: + executable: "{{ test_executable | default('podman') }}" name: limited-pod register: pod_info @@ -34,5 +36,6 @@ always: - name: Cleanup containers.podman.podman_pod: + executable: "{{ test_executable | default('podman') }}" name: limited-pod state: absent diff --git a/ansible_collections/containers/podman/tests/integration/targets/podman_prune/tasks/main.yml b/ansible_collections/containers/podman/tests/integration/targets/podman_prune/tasks/main.yml index 804543fe5..6e1a328af 100644 --- a/ansible_collections/containers/podman/tests/integration/targets/podman_prune/tasks/main.yml +++ b/ansible_collections/containers/podman/tests/integration/targets/podman_prune/tasks/main.yml @@ -9,6 +9,7 @@ # Create objects to be pruned - name: Create container containers.podman.podman_container: + executable: "{{ test_executable | default('podman') }}" name: "{{ cname }}" image: quay.io/podman/hello:latest state: present @@ -16,12 +17,14 @@ - name: Create network containers.podman.podman_network: + executable: "{{ test_executable | default('podman') }}" name: "{{ nname }}" state: present register: network - name: Create volume containers.podman.podman_volume: + executable: "{{ test_executable | default('podman') }}" name: "{{ vname }}" state: present register: volume @@ -29,12 +32,14 @@ # Prune objects - name: Prune objects containers.podman.podman_prune: + executable: "{{ test_executable | default('podman') }}" container: true network: true volume: true - name: Check if container exists containers.podman.podman_container_info: + executable: "{{ test_executable | default('podman') }}" register: container_exists - name: Check if podman network exists @@ -43,6 +48,7 @@ - name: Check if podman volume exists containers.podman.podman_volume_info: + executable: "{{ test_executable | default('podman') }}" register: volume_exists - name: Verify assertions for network, container and volume @@ -58,6 +64,7 @@ # Test with filters - name: Prune objects with filters containers.podman.podman_prune: + executable: "{{ test_executable | default('podman') }}" image: true image_filters: dangling_only: false @@ -65,6 +72,7 @@ - name: Check if image exists containers.podman.podman_image_info: + executable: "{{ test_executable | default('podman') }}" register: image_exists - name: Verify assertions for image (with filters) @@ -74,6 +82,7 @@ - name: Create container containers.podman.podman_container: + executable: "{{ test_executable | default('podman') }}" name: "{{ cname }}" image: quay.io/podman/hello:latest state: present @@ -81,36 +90,43 @@ - name: Create network containers.podman.podman_network: + executable: "{{ test_executable | default('podman') }}" name: "{{ nname }}" state: present register: network_system - name: Create volume containers.podman.podman_volume: + executable: "{{ test_executable | default('podman') }}" name: "{{ vname }}" state: present register: volume_system - name: System prune containers.podman.podman_prune: + executable: "{{ test_executable | default('podman') }}" system: true system_all: true system_volumes: true - name: Check if container exists containers.podman.podman_container_info: + executable: "{{ test_executable | default('podman') }}" register: container_system_exists - name: Check if podman network exists containers.podman.podman_network_info: + executable: "{{ test_executable | default('podman') }}" register: network_system_exists - name: Check if podman volume exists containers.podman.podman_volume_info: + executable: "{{ test_executable | default('podman') }}" register: volume_system_exists - name: Check if image exists containers.podman.podman_image_info: + executable: "{{ test_executable | default('podman') }}" register: image_system_exists - name: Verify assertions for system diff --git a/ansible_collections/containers/podman/tests/integration/targets/podman_volume/tasks/main.yml b/ansible_collections/containers/podman/tests/integration/targets/podman_volume/tasks/main.yml index 144a39f63..9d43f3f1c 100644 --- a/ansible_collections/containers/podman/tests/integration/targets/podman_volume/tasks/main.yml +++ b/ansible_collections/containers/podman/tests/integration/targets/podman_volume/tasks/main.yml @@ -161,6 +161,134 @@ - info10 is failed - delete.volume == {} + - name: Create a Quadlet for volume with filename + containers.podman.podman_volume: + executable: "{{ test_executable | default('podman') }}" + name: testvol + state: quadlet + quadlet_dir: /tmp + quadlet_filename: customfile + + - name: Check if files exists + stat: + path: /tmp/customfile.volume + register: quadlet_file_custom + + - name: Fail if no file is present + assert: + that: + - quadlet_file_custom.stat.exists + + - name: Create quadlet volume file + containers.podman.podman_volume: + executable: "{{ test_executable | default('podman') }}" + name: testvol + state: quadlet + driver: local + label: + namelabel: value + foo: bar + debug: true + options: + - "device=/dev/loop1" + - "type=ext4" + quadlet_dir: /tmp + quadlet_options: + - "Label=Test=volume" + - "Label=test1=value1" + + - name: Check if files exists + stat: + path: /tmp/testvol.volume + register: quadlet_file + + - name: Check output is correct for Quadlet volume in /tmp/testvol.volume file + assert: + that: + - quadlet_file.stat.exists + + - name: Check for the existence of lines in /tmp/testvol.volume + lineinfile: + path: /tmp/testvol.volume + line: "{{ item }}" + state: present + check_mode: yes + register: line_check + loop: + - "[Volume]" + - "VolumeName=testvol" + - "Driver=local" + - "Label=namelabel=value" + - "Label=foo=bar" + - "Label=Test=volume" + - "Label=test1=value1" + - "PodmanArgs=--opt device=/dev/loop1" + - "PodmanArgs=--opt type=ext4" + - "GlobalArgs=--log-level debug" + loop_control: + label: "{{ item }}" + + - name: Fail the task if any line is not present + fail: + msg: "The following line is not present in /tmp/testvol.volume: {{ item.item }}" + when: item.changed + loop: "{{ line_check.results }}" + loop_control: + label: "{{ item.item }}" + + - name: Create quadlet volume file - same + containers.podman.podman_volume: + executable: "{{ test_executable | default('podman') }}" + name: testvol + state: quadlet + driver: local + label: + namelabel: value + foo: bar + debug: true + options: + - "device=/dev/loop1" + - "type=ext4" + quadlet_dir: /tmp + quadlet_options: + - "Label=Test=volume" + - "Label=test1=value1" + register: quad2 + + - name: Check if quadlet changed + assert: + that: + - quad2 is not changed + + - name: Create quadlet volume file - different + containers.podman.podman_volume: + executable: "{{ test_executable | default('podman') }}" + name: testvol + state: quadlet + driver: local + label: + namelabel: value + foo: bar + debug: true + options: + - "device=/dev/loop5" + - "type=ext4" + quadlet_dir: /tmp + quadlet_options: + - "Label=Test=volume" + - "Label=test1=value1" + register: quad3 + + - name: Print diff + debug: + var: quad3.diff + + - name: Check if changed and diff + assert: + that: + - quad3 is changed + - "'loop5' in quad3.diff.after" + always: - name: Make sure volume doesn't exist diff --git a/ansible_collections/containers/podman/tests/sanity/ignore-2.10.txt b/ansible_collections/containers/podman/tests/sanity/ignore-2.10.txt index f2f4ca9ca..8b2980323 100644 --- a/ansible_collections/containers/podman/tests/sanity/ignore-2.10.txt +++ b/ansible_collections/containers/podman/tests/sanity/ignore-2.10.txt @@ -1,2 +1,3 @@ tests/integration/targets/connection_buildah/runme.sh shellcheck:SC2086 tests/integration/targets/connection_podman/runme.sh shellcheck:SC2086 +tests/integration/targets/podman_play/tasks/files/multi-yaml.yml yamllint!skip diff --git a/ansible_collections/containers/podman/tests/sanity/ignore-2.11.txt b/ansible_collections/containers/podman/tests/sanity/ignore-2.11.txt index f2f4ca9ca..8b2980323 100644 --- a/ansible_collections/containers/podman/tests/sanity/ignore-2.11.txt +++ b/ansible_collections/containers/podman/tests/sanity/ignore-2.11.txt @@ -1,2 +1,3 @@ tests/integration/targets/connection_buildah/runme.sh shellcheck:SC2086 tests/integration/targets/connection_podman/runme.sh shellcheck:SC2086 +tests/integration/targets/podman_play/tasks/files/multi-yaml.yml yamllint!skip diff --git a/ansible_collections/containers/podman/tests/sanity/ignore-2.12.txt b/ansible_collections/containers/podman/tests/sanity/ignore-2.12.txt index f2f4ca9ca..8b2980323 100644 --- a/ansible_collections/containers/podman/tests/sanity/ignore-2.12.txt +++ b/ansible_collections/containers/podman/tests/sanity/ignore-2.12.txt @@ -1,2 +1,3 @@ tests/integration/targets/connection_buildah/runme.sh shellcheck:SC2086 tests/integration/targets/connection_podman/runme.sh shellcheck:SC2086 +tests/integration/targets/podman_play/tasks/files/multi-yaml.yml yamllint!skip diff --git a/ansible_collections/containers/podman/tests/sanity/ignore-2.13.txt b/ansible_collections/containers/podman/tests/sanity/ignore-2.13.txt index f2f4ca9ca..8b2980323 100644 --- a/ansible_collections/containers/podman/tests/sanity/ignore-2.13.txt +++ b/ansible_collections/containers/podman/tests/sanity/ignore-2.13.txt @@ -1,2 +1,3 @@ tests/integration/targets/connection_buildah/runme.sh shellcheck:SC2086 tests/integration/targets/connection_podman/runme.sh shellcheck:SC2086 +tests/integration/targets/podman_play/tasks/files/multi-yaml.yml yamllint!skip diff --git a/ansible_collections/containers/podman/tests/sanity/ignore-2.14.txt b/ansible_collections/containers/podman/tests/sanity/ignore-2.14.txt index f2f4ca9ca..8b2980323 100644 --- a/ansible_collections/containers/podman/tests/sanity/ignore-2.14.txt +++ b/ansible_collections/containers/podman/tests/sanity/ignore-2.14.txt @@ -1,2 +1,3 @@ tests/integration/targets/connection_buildah/runme.sh shellcheck:SC2086 tests/integration/targets/connection_podman/runme.sh shellcheck:SC2086 +tests/integration/targets/podman_play/tasks/files/multi-yaml.yml yamllint!skip diff --git a/ansible_collections/containers/podman/tests/sanity/ignore-2.15.txt b/ansible_collections/containers/podman/tests/sanity/ignore-2.15.txt index f2f4ca9ca..8b2980323 100644 --- a/ansible_collections/containers/podman/tests/sanity/ignore-2.15.txt +++ b/ansible_collections/containers/podman/tests/sanity/ignore-2.15.txt @@ -1,2 +1,3 @@ tests/integration/targets/connection_buildah/runme.sh shellcheck:SC2086 tests/integration/targets/connection_podman/runme.sh shellcheck:SC2086 +tests/integration/targets/podman_play/tasks/files/multi-yaml.yml yamllint!skip diff --git a/ansible_collections/containers/podman/tests/sanity/ignore-2.16.txt b/ansible_collections/containers/podman/tests/sanity/ignore-2.16.txt index f2f4ca9ca..8b2980323 100644 --- a/ansible_collections/containers/podman/tests/sanity/ignore-2.16.txt +++ b/ansible_collections/containers/podman/tests/sanity/ignore-2.16.txt @@ -1,2 +1,3 @@ tests/integration/targets/connection_buildah/runme.sh shellcheck:SC2086 tests/integration/targets/connection_podman/runme.sh shellcheck:SC2086 +tests/integration/targets/podman_play/tasks/files/multi-yaml.yml yamllint!skip diff --git a/ansible_collections/containers/podman/tests/sanity/ignore-2.17.txt b/ansible_collections/containers/podman/tests/sanity/ignore-2.17.txt index f2f4ca9ca..8b2980323 100644 --- a/ansible_collections/containers/podman/tests/sanity/ignore-2.17.txt +++ b/ansible_collections/containers/podman/tests/sanity/ignore-2.17.txt @@ -1,2 +1,3 @@ tests/integration/targets/connection_buildah/runme.sh shellcheck:SC2086 tests/integration/targets/connection_podman/runme.sh shellcheck:SC2086 +tests/integration/targets/podman_play/tasks/files/multi-yaml.yml yamllint!skip diff --git a/ansible_collections/containers/podman/tests/sanity/ignore-2.18.txt b/ansible_collections/containers/podman/tests/sanity/ignore-2.18.txt index f2f4ca9ca..8b2980323 100644 --- a/ansible_collections/containers/podman/tests/sanity/ignore-2.18.txt +++ b/ansible_collections/containers/podman/tests/sanity/ignore-2.18.txt @@ -1,2 +1,3 @@ tests/integration/targets/connection_buildah/runme.sh shellcheck:SC2086 tests/integration/targets/connection_podman/runme.sh shellcheck:SC2086 +tests/integration/targets/podman_play/tasks/files/multi-yaml.yml yamllint!skip diff --git a/ansible_collections/containers/podman/tests/sanity/ignore-2.9.txt b/ansible_collections/containers/podman/tests/sanity/ignore-2.9.txt index f2f4ca9ca..8b2980323 100644 --- a/ansible_collections/containers/podman/tests/sanity/ignore-2.9.txt +++ b/ansible_collections/containers/podman/tests/sanity/ignore-2.9.txt @@ -1,2 +1,3 @@ tests/integration/targets/connection_buildah/runme.sh shellcheck:SC2086 tests/integration/targets/connection_podman/runme.sh shellcheck:SC2086 +tests/integration/targets/podman_play/tasks/files/multi-yaml.yml yamllint!skip -- cgit v1.2.3