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()