github.com/containers/podman/v5@v5.1.0-rc1/test/python/docker/compat/common.py (about) 1 """ 2 Fixtures and Helpers for unittests. 3 """ 4 import subprocess 5 import sys 6 import time 7 import unittest 8 9 # pylint: disable=no-name-in-module,import-error,wrong-import-order 10 from docker import DockerClient 11 12 from test.python.docker import PodmanAPI 13 from test.python.docker.compat import constant 14 15 16 def run_top_container(client: DockerClient): 17 """Run top command in an alpine container.""" 18 ctnr = client.containers.create( 19 constant.ALPINE, 20 command="top", 21 detach=True, 22 tty=True, 23 name="top", 24 ) 25 ctnr.start() 26 return ctnr.id 27 28 29 def remove_all_containers(client: DockerClient): 30 """Delete all containers from the Podman service.""" 31 for ctnr in client.containers.list(all=True): 32 ctnr.remove(force=True) 33 34 35 def remove_all_images(client: DockerClient): 36 """Delete all images from the Podman service.""" 37 for img in client.images.list(): 38 # FIXME should DELETE /images accept the sha256: prefix? 39 id_ = img.id.removeprefix("sha256:") 40 client.images.remove(id_, force=True) 41 42 43 class DockerTestCase(unittest.TestCase): 44 """Specialized TestCase class for testing against Podman service.""" 45 46 podman: PodmanAPI = None # initialized podman configuration for tests 47 service: subprocess.Popen = None # podman service instance 48 49 top_container_id: str = None 50 docker: DockerClient = None 51 52 @classmethod 53 def setUpClass(cls) -> None: 54 super().setUpClass() 55 56 cls.podman = PodmanAPI() 57 super().addClassCleanup(cls.podman.tear_down) 58 59 cls.service = cls.podman.open("system", "service", "tcp:127.0.0.1:8080", "--time=0") 60 # give the service some time to be ready... 61 time.sleep(2) 62 63 return_code = cls.service.poll() 64 if return_code is not None: 65 raise subprocess.CalledProcessError(return_code, "podman system service") 66 67 @classmethod 68 def tearDownClass(cls) -> None: 69 cls.service.terminate() 70 stdout, stderr = cls.service.communicate(timeout=0.5) 71 if stdout: 72 sys.stdout.write("\ndocker-py -- Service Stdout:\n" + stdout.decode("utf-8")) 73 if stderr: 74 sys.stderr.write("\ndocker-py -- Service Stderr:\n" + stderr.decode("utf-8")) 75 76 return super().tearDownClass() 77 78 def setUp(self) -> None: 79 super().setUp() 80 81 self.docker = DockerClient(base_url="tcp://127.0.0.1:8080", timeout=15) 82 self.addCleanup(self.docker.close) 83 84 self.podman.restore_image_from_cache(self.docker) 85 self.top_container_id = run_top_container(self.docker) 86 self.assertIsNotNone(self.top_container_id, "Failed to create 'top' container") 87 88 def tearDown(self) -> None: 89 remove_all_containers(self.docker) 90 remove_all_images(self.docker) 91 92 super().tearDown()