Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package python-podman for openSUSE:Factory checked in at 2022-11-01 13:42:14 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-podman (Old) and /work/SRC/openSUSE:Factory/.python-podman.new.2275 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-podman" Tue Nov 1 13:42:14 2022 rev:7 rq:1032499 version:4.3.0 Changes: -------- --- /work/SRC/openSUSE:Factory/python-podman/python-podman.changes 2022-08-16 17:07:52.755902422 +0200 +++ /work/SRC/openSUSE:Factory/.python-podman.new.2275/python-podman.changes 2022-11-01 13:42:24.779846534 +0100 @@ -1,0 +2,12 @@ +Fri Oct 28 19:54:33 UTC 2022 - Yogalakshmi Arunachalam <yarunacha...@suse.com> + +- Update to 4.3.0 + * Add pass-through layers, output and outputformat to building images + * Support passing of interval and condition in podman wait calls + * Implement podman image scp + * Update supported python versions + * Add support of passing empty strings in second + * Add support for on failure actions in healthchecks + * Bug fixes + +------------------------------------------------------------------- Old: ---- podman-4.2.0.tar.gz New: ---- podman-4.3.0.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-podman.spec ++++++ --- /var/tmp/diff_new_pack.Zc9KGL/_old 2022-11-01 13:42:27.523861132 +0100 +++ /var/tmp/diff_new_pack.Zc9KGL/_new 2022-11-01 13:42:27.531861175 +0100 @@ -27,7 +27,7 @@ %bcond_with test %endif Name: python-podman%{psuffix} -Version: 4.2.0 +Version: 4.3.0 Release: 0 Summary: A library to interact with a Podman server License: Apache-2.0 ++++++ podman-4.2.0.tar.gz -> podman-4.3.0.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/podman-py-4.2.0/Makefile new/podman-py-4.3.0/Makefile --- old/podman-py-4.2.0/Makefile 2022-08-10 15:03:52.000000000 +0200 +++ new/podman-py-4.3.0/Makefile 2022-10-19 23:32:04.000000000 +0200 @@ -8,7 +8,7 @@ EPOCH_TEST_COMMIT ?= $(shell git merge-base $${DEST_BRANCH:-main} HEAD) HEAD ?= HEAD -export PODMAN_VERSION ?= "4.2.0" +export PODMAN_VERSION ?= "4.3.0" .PHONY: podman podman: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/podman-py-4.2.0/podman/api/http_utils.py new/podman-py-4.3.0/podman/api/http_utils.py --- old/podman-py-4.2.0/podman/api/http_utils.py 2022-08-10 15:03:52.000000000 +0200 +++ new/podman-py-4.3.0/podman/api/http_utils.py 2022-10-19 23:32:04.000000000 +0200 @@ -66,26 +66,33 @@ return json.dumps(body, sort_keys=True) -def _filter_values(mapping: Mapping[str, Any]) -> Dict[str, Any]: +def _filter_values(mapping: Mapping[str, Any], recursion=False) -> Dict[str, Any]: """Returns a canonical dictionary with values == None or empty Iterables removed. Dictionary is walked using recursion. """ canonical = {} + for key, value in mapping.items(): # quick filter if possible... - if value is None or (isinstance(value, collections.abc.Sized) and len(value) <= 0): + if ( + value is None + or (isinstance(value, collections.abc.Sized) and len(value) <= 0) + and not recursion + ): continue # depending on type we need details... if isinstance(value, collections.abc.Mapping): - proposal = _filter_values(value) + proposal = _filter_values(value, recursion=True) elif isinstance(value, collections.abc.Iterable) and not isinstance(value, str): proposal = [i for i in value if i is not None] else: proposal = value - if proposal not in (None, str(), [], {}): + if not recursion and proposal not in (None, str(), [], {}): + canonical[key] = proposal + elif recursion and proposal not in (None, [], {}): canonical[key] = proposal return canonical diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/podman-py-4.2.0/podman/domain/containers.py new/podman-py-4.3.0/podman/domain/containers.py --- old/podman-py-4.2.0/podman/domain/containers.py 2022-08-10 15:03:52.000000000 +0200 +++ new/podman-py-4.3.0/podman/domain/containers.py 2022-10-19 23:32:04.000000000 +0200 @@ -508,7 +508,7 @@ condition (Union[str, List[str]]): Container state on which to release. One or more of: "configured", "created", "running", "stopped", "paused", "exited", "removing", "stopping". - timeout (int): Ignored. + interval (int): Time interval to wait before polling for completion. Returns: "Error" key has a dictionary value with the key "Message". @@ -522,6 +522,13 @@ if isinstance(condition, str): condition = [condition] - response = self.client.post(f"/containers/{self.id}/wait", params={"condition": condition}) + interval = kwargs.get("interval") + + params = {} + if condition != []: + params["condition"] = condition + if interval != "": + params["interval"] = interval + response = self.client.post(f"/containers/{self.id}/wait", params=params) response.raise_for_status() return response.json() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/podman-py-4.2.0/podman/domain/containers_create.py new/podman-py-4.3.0/podman/domain/containers_create.py --- old/podman-py-4.2.0/podman/domain/containers_create.py 2022-08-10 15:03:52.000000000 +0200 +++ new/podman-py-4.3.0/podman/domain/containers_create.py 2022-10-19 23:32:04.000000000 +0200 @@ -74,6 +74,7 @@ process will run as. healthcheck (Dict[str,Any]): Specify a test to perform to check that the container is healthy. + health_check_on_failure_action (int): Specify an action if a healthcheck fails. hostname (str): Optional hostname for the container. init (bool): Run an init inside the container that forwards signals and reaps processes init_path (str): Path to the docker-init binary @@ -371,6 +372,7 @@ "expose": {}, "groups": pop("group_add"), "healthconfig": pop("healthcheck"), + "health_check_on_failure_action": pop("health_check_on_failure_action"), "hostadd": [], "hostname": pop("hostname"), "httpproxy": pop("use_config_proxy"), diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/podman-py-4.2.0/podman/domain/images_build.py new/podman-py-4.3.0/podman/domain/images_build.py --- old/podman-py-4.2.0/podman/domain/images_build.py 2022-08-10 15:03:52.000000000 +0200 +++ new/podman-py-4.3.0/podman/domain/images_build.py 2022-10-19 23:32:04.000000000 +0200 @@ -61,6 +61,9 @@ isolation (str) ??? Isolation technology used during build. (ignored) use_config_proxy (bool) ??? (ignored) http_proxy (bool) - Inject http proxy environment variables into container (Podman only) + layers (bool) - Cache intermediate layers during build. + output (str) - specifies if any custom build output is selected for following build. + outputformat (str) - The format of the output image's manifest and configuration data. Returns: first item is the podman.domain.images.Image built @@ -162,12 +165,15 @@ "squash": kwargs.get("squash"), "t": kwargs.get("tag"), "target": kwargs.get("target"), + "layers": kwargs.get("layers"), + "output": kwargs.get("output"), + "outputformat": kwargs.get("outputformat"), } if "buildargs" in kwargs: params["buildargs"] = json.dumps(kwargs.get("buildargs")) if "cache_from" in kwargs: - params["cacheform"] = json.dumps(kwargs.get("cache_from")) + params["cachefrom"] = json.dumps(kwargs.get("cache_from")) if "container_limits" in kwargs: params["cpuperiod"] = kwargs["container_limits"].get("cpuperiod") diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/podman-py-4.2.0/podman/domain/images_manager.py new/podman-py-4.3.0/podman/domain/images_manager.py --- old/podman-py-4.2.0/podman/domain/images_manager.py 2022-08-10 15:03:52.000000000 +0200 +++ new/podman-py-4.3.0/podman/domain/images_manager.py 2022-10-19 23:32:04.000000000 +0200 @@ -391,3 +391,31 @@ response = self.client.get("/images/search", params=params) response.raise_for_status(not_found=ImageNotFound) return response.json() + + def scp( + self, + source: str, + dest: Optional[str] = None, + quiet: Optional[bool] = False, + ) -> str: + """Securely copy images between hosts. + + Args: + source: source connection/image + dest: destination connection/image + quiet: do not print save/load output, only the image + + Returns: + A string containing the loaded image + + Raises: + APIError: when service returns an error + """ + params = {} + if dest is not None and quiet: + params = {"destination": dest, "quiet": quiet} + elif quiet: + params = {"quiet": quiet} + response = self.client.post(f"/images/scp/{source}", params=params) + response.raise_for_status() + return response.json() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/podman-py-4.2.0/podman/tests/__init__.py new/podman-py-4.3.0/podman/tests/__init__.py --- old/podman-py-4.2.0/podman/tests/__init__.py 2022-08-10 15:03:52.000000000 +0200 +++ new/podman-py-4.3.0/podman/tests/__init__.py 2022-10-19 23:32:04.000000000 +0200 @@ -3,5 +3,5 @@ # Do not auto-update these from version.py, # as test code should be changed to reflect changes in Podman API versions BASE_SOCK = "unix:///run/api.sock" -LIBPOD_URL = "http://%2Frun%2Fapi.sock/v4.2.0/libpod" +LIBPOD_URL = "http://%2Frun%2Fapi.sock/v4.3.0/libpod" COMPATIBLE_URL = "http://%2Frun%2Fapi.sock/v1.40" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/podman-py-4.2.0/podman/tests/integration/test_container_create.py new/podman-py-4.3.0/podman/tests/integration/test_container_create.py --- old/podman-py-4.2.0/podman/tests/integration/test_container_create.py 2022-08-10 15:03:52.000000000 +0200 +++ new/podman-py-4.3.0/podman/tests/integration/test_container_create.py 2022-10-19 23:32:04.000000000 +0200 @@ -145,6 +145,14 @@ ) ) + def test_container_healtchecks(self): + """Test passing various healthcheck options""" + parameters = {} + parameters['healthcheck'] = {'Test': ['CMD-SHELL curl http://localhost || exit']} + parameters['health_check_on_failure_action'] = 1 + container = self.client.containers.create(self.alpine_image, **parameters) + self.containers.append(container) + def test_container_mem_limit(self): """Test passing memory limit""" self._test_memory_limit('mem_limit', 'Memory') diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/podman-py-4.2.0/podman/tests/integration/test_images.py new/podman-py-4.3.0/podman/tests/integration/test_images.py --- old/podman-py-4.2.0/podman/tests/integration/test_images.py 2022-08-10 15:03:52.000000000 +0200 +++ new/podman-py-4.3.0/podman/tests/integration/test_images.py 2022-10-19 23:32:04.000000000 +0200 @@ -133,3 +133,15 @@ def test_pull_stream(self): generator = self.client.images.pull("ubi8", tag="latest", stream=True) self.assertIsInstance(generator, types.GeneratorType) + + def test_scp(self): + with self.assertRaises(APIError) as e: + next( + self.client.images.scp( + source="randu...@fake.ip.addr:22::quay.io/libpod/alpine", quiet=False + ) + ) + self.assertIn( + "failed to connect: dial tcp: lookup fake.ip.addr: no such host", + e.exception.explanation, + ) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/podman-py-4.2.0/podman/tests/unit/test_api_utils.py new/podman-py-4.3.0/podman/tests/unit/test_api_utils.py --- old/podman-py-4.2.0/podman/tests/unit/test_api_utils.py 2022-08-10 15:03:52.000000000 +0200 +++ new/podman-py-4.3.0/podman/tests/unit/test_api_utils.py 2022-10-19 23:32:04.000000000 +0200 @@ -154,6 +154,16 @@ self.assertDictEqual(actual_dict["Dictionary"], payload["Dictionary"]) self.assertEqual(set(actual_dict["Set1"]), {"item1", "item2"}) + def test_prepare_body_dict_empty_string(self): + payload = {"Dictionary": {"key1": "", "key2": {"key3": ""}, "key4": [], "key5": {}}} + + actual = api.prepare_body(payload) + actual_dict = json.loads(actual) + payload["Dictionary"].pop("key4") + payload["Dictionary"].pop("key5") + + self.assertDictEqual(payload, actual_dict) + if __name__ == '__main__': unittest.main() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/podman-py-4.2.0/podman/tests/unit/test_container.py new/podman-py-4.3.0/podman/tests/unit/test_container.py --- old/podman-py-4.2.0/podman/tests/unit/test_container.py 2022-08-10 15:03:52.000000000 +0200 +++ new/podman-py-4.3.0/podman/tests/unit/test_container.py 2022-10-19 23:32:04.000000000 +0200 @@ -212,6 +212,18 @@ self.assertTrue(adapter.called_once) @requests_mock.Mocker() + def test_wait_condition_interval(self, mock): + adapter = mock.post( + tests.LIBPOD_URL + + "/containers/87e1325c82424e49a00abdd4de08009eb76c7de8d228426a9b8af9318ced5ecd/wait", + status_code=200, + json={"StatusCode": 0}, + ) + container = Container(attrs=FIRST_CONTAINER, client=self.client.api) + container.wait(condition="exited", interval=1) + self.assertTrue(adapter.called_once) + + @requests_mock.Mocker() def test_diff(self, mock): payload = [ {"Path": "modified", "Kind": 0}, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/podman-py-4.2.0/podman/version.py new/podman-py-4.3.0/podman/version.py --- old/podman-py-4.2.0/podman/version.py 2022-08-10 15:03:52.000000000 +0200 +++ new/podman-py-4.3.0/podman/version.py 2022-10-19 23:32:04.000000000 +0200 @@ -1,4 +1,4 @@ """Version of PodmanPy.""" -__version__ = "4.2.0" +__version__ = "4.3.0" __compatible_version__ = "1.40" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/podman-py-4.2.0/setup.cfg new/podman-py-4.3.0/setup.cfg --- old/podman-py-4.2.0/setup.cfg 2022-08-10 15:03:52.000000000 +0200 +++ new/podman-py-4.3.0/setup.cfg 2022-10-19 23:32:04.000000000 +0200 @@ -14,7 +14,7 @@ Bug Tracker = https://github.com/containers/podman-py/issues Libpod API = https://docs.podman.io/en/latest/_static/api.html classifiers = - Development Status :: 3 - Alpha + Development Status :: 5 - Production/Stable Intended Audience :: Developers License :: OSI Approved :: Apache Software License Operating System :: OS Independent @@ -24,6 +24,7 @@ Programming Language :: Python :: 3.8 Programming Language :: Python :: 3.9 Programming Language :: Python :: 3.10 + Programming Language :: Python :: 3.11 Topic :: Software Development :: Libraries :: Python Modules keywords = podman, libpod