github.com/AbhinandanKurakure/podman/v3@v3.4.10/test/apiv2/python/rest_api/test_v2_0_0_container.py (about)

     1  import random
     2  import unittest
     3  import json
     4  
     5  import requests
     6  from dateutil.parser import parse
     7  
     8  from .fixtures import APITestCase
     9  
    10  
    11  class ContainerTestCase(APITestCase):
    12      def test_list(self):
    13          r = requests.get(self.uri("/containers/json"), timeout=5)
    14          self.assertEqual(r.status_code, 200, r.text)
    15          obj = r.json()
    16          self.assertEqual(len(obj), 1)
    17  
    18      def test_list_filters(self):
    19          r = requests.get(self.podman_url + "/v1.40/containers/json?filters%3D%7B%22status%22%3A%5B%22running%22%5D%7D")
    20          self.assertEqual(r.status_code, 200, r.text)
    21          payload = r.json()
    22          containerAmnt = len(payload)
    23          self.assertGreater(containerAmnt, 0)
    24  
    25      def test_list_all(self):
    26          r = requests.get(self.uri("/containers/json?all=true"))
    27          self.assertEqual(r.status_code, 200, r.text)
    28          self.assertId(r.content)
    29  
    30      def test_inspect(self):
    31          r = requests.get(self.uri(self.resolve_container("/containers/{}/json")))
    32          self.assertEqual(r.status_code, 200, r.text)
    33          self.assertId(r.content)
    34          _ = parse(r.json()["Created"])
    35  
    36  
    37          r = requests.post(
    38              self.podman_url + "/v1.40/containers/create?name=topcontainer",
    39              json={"Cmd": ["top"],
    40                    "Image": "alpine:latest",
    41                    "Healthcheck": {
    42                        "Test": ["CMD", "pidof", "top"],
    43                        "Interval": 5000000000,
    44                        "Timeout": 2000000000,
    45                        "Retries": 3,
    46                        "StartPeriod": 5000000000
    47                    }
    48              },
    49          )
    50          self.assertEqual(r.status_code, 201, r.text)
    51          payload = r.json()
    52          container_id = payload["Id"]
    53          self.assertIsNotNone(container_id)
    54  
    55          r = requests.get(self.podman_url + f"/v1.40/containers/{container_id}/json")
    56          self.assertEqual(r.status_code, 200, r.text)
    57          self.assertId(r.content)
    58          out = r.json()
    59          self.assertIsNone(out["State"].get("Health"))
    60          self.assertListEqual(["CMD", "pidof", "top"], out["Config"]["Healthcheck"]["Test"])
    61          self.assertEqual(5000000000, out["Config"]["Healthcheck"]["Interval"])
    62          self.assertEqual(2000000000, out["Config"]["Healthcheck"]["Timeout"])
    63          self.assertEqual(3, out["Config"]["Healthcheck"]["Retries"])
    64          self.assertEqual(5000000000, out["Config"]["Healthcheck"]["StartPeriod"])
    65  
    66          r = requests.get(self.uri(f"/containers/{container_id}/json"))
    67          self.assertEqual(r.status_code, 200, r.text)
    68          self.assertId(r.content)
    69          out = r.json()
    70          hc  = out["Config"]["Healthcheck"]["Test"]
    71          self.assertListEqual(["CMD", "pidof", "top"], hc)
    72  
    73          r = requests.post(self.podman_url + f"/v1.40/containers/{container_id}/start")
    74          self.assertEqual(r.status_code, 204, r.text)
    75  
    76          r = requests.get(self.podman_url + f"/v1.40/containers/{container_id}/json")
    77          self.assertEqual(r.status_code, 200, r.text)
    78          out = r.json()
    79          state = out["State"]["Health"]
    80          self.assertIsInstance(state, dict)
    81  
    82      def test_stats(self):
    83          r = requests.get(self.uri(self.resolve_container("/containers/{}/stats?stream=false")))
    84          self.assertIn(r.status_code, (200, 409), r.text)
    85          if r.status_code == 200:
    86              self.assertId(r.content)
    87          r = requests.get(self.uri(self.resolve_container("/containers/{}/stats?stream=false&one-shot=true")))
    88          self.assertIn(r.status_code, (200, 409), r.text)
    89          if r.status_code == 200:
    90              self.assertId(r.content)
    91  
    92      def test_delete(self):
    93          r = requests.delete(self.uri(self.resolve_container("/containers/{}?force=true")))
    94          self.assertEqual(r.status_code, 204, r.text)
    95  
    96      def test_stop(self):
    97          r = requests.post(self.uri(self.resolve_container("/containers/{}/start")))
    98          self.assertIn(r.status_code, (204, 304), r.text)
    99  
   100          r = requests.post(self.uri(self.resolve_container("/containers/{}/stop")))
   101          self.assertIn(r.status_code, (204, 304), r.text)
   102  
   103      def test_start(self):
   104          r = requests.post(self.uri(self.resolve_container("/containers/{}/stop")))
   105          self.assertIn(r.status_code, (204, 304), r.text)
   106  
   107          r = requests.post(self.uri(self.resolve_container("/containers/{}/start")))
   108          self.assertIn(r.status_code, (204, 304), r.text)
   109  
   110      def test_restart(self):
   111          r = requests.post(self.uri(self.resolve_container("/containers/{}/start")))
   112          self.assertIn(r.status_code, (204, 304), r.text)
   113  
   114          r = requests.post(self.uri(self.resolve_container("/containers/{}/restart")), timeout=5)
   115          self.assertEqual(r.status_code, 204, r.text)
   116  
   117      def test_resize(self):
   118          r = requests.post(self.uri(self.resolve_container("/containers/{}/resize?h=43&w=80")))
   119          self.assertIn(r.status_code, (200, 409), r.text)
   120          if r.status_code == 200:
   121              self.assertEqual(r.text, "", r.text)
   122  
   123      def test_attach(self):
   124          self.skipTest("FIXME: Test timeouts")
   125          r = requests.post(self.uri(self.resolve_container("/containers/{}/attach")), timeout=5)
   126          self.assertIn(r.status_code, (101, 500), r.text)
   127  
   128      def test_logs(self):
   129          r = requests.get(self.uri(self.resolve_container("/containers/{}/logs?stdout=true")))
   130          self.assertEqual(r.status_code, 200, r.text)
   131          r = requests.post(
   132              self.podman_url + "/v1.40/containers/create?name=topcontainer",
   133              json={"Cmd": ["top", "ls"], "Image": "alpine:latest"},
   134          )
   135          self.assertEqual(r.status_code, 201, r.text)
   136          payload = r.json()
   137          container_id = payload["Id"]
   138          self.assertIsNotNone(container_id)
   139          r = requests.get(self.podman_url + f"/v1.40/containers/{payload['Id']}/logs?follow=false&stdout=true&until=0")
   140          self.assertEqual(r.status_code, 200, r.text)
   141          r = requests.get(self.podman_url + f"/v1.40/containers/{payload['Id']}/logs?follow=false&stdout=true&until=1")
   142          self.assertEqual(r.status_code, 200, r.text)
   143  
   144      def test_commit(self):
   145          r = requests.post(self.uri(self.resolve_container("/commit?container={}")))
   146          self.assertEqual(r.status_code, 200, r.text)
   147          self.assertId(r.content)
   148  
   149          obj = r.json()
   150          self.assertIsInstance(obj, dict)
   151  
   152      def test_prune(self):
   153          name = f"Container_{random.getrandbits(160):x}"
   154  
   155          r = requests.post(
   156              self.podman_url + f"/v1.40/containers/create?name={name}",
   157              json={
   158                  "Cmd": ["cp", "/etc/motd", "/motd.size_test"],
   159                  "Image": "alpine:latest",
   160                  "NetworkDisabled": True,
   161              },
   162          )
   163          self.assertEqual(r.status_code, 201, r.text)
   164          create = r.json()
   165  
   166          r = requests.post(self.podman_url + f"/v1.40/containers/{create['Id']}/start")
   167          self.assertEqual(r.status_code, 204, r.text)
   168  
   169          r = requests.post(self.podman_url + f"/v1.40/containers/{create['Id']}/wait")
   170          self.assertEqual(r.status_code, 200, r.text)
   171          wait = r.json()
   172          self.assertEqual(wait["StatusCode"], 0, wait["Error"])
   173  
   174          prune = requests.post(self.podman_url + "/v1.40/containers/prune")
   175          self.assertEqual(prune.status_code, 200, prune.status_code)
   176          prune_payload = prune.json()
   177          self.assertGreater(prune_payload["SpaceReclaimed"], 0)
   178          self.assertIn(create["Id"], prune_payload["ContainersDeleted"])
   179  
   180          # Delete any orphaned containers
   181          r = requests.get(self.podman_url + "/v1.40/containers/json?all=true")
   182          self.assertEqual(r.status_code, 200, r.text)
   183          for self.resolve_container in r.json():
   184              requests.delete(
   185                  self.podman_url + f"/v1.40/containers/{self.resolve_container['Id']}?force=true"
   186              )
   187  
   188          # Image prune here tied to containers freeing up
   189          prune = requests.post(self.podman_url + "/v1.40/images/prune")
   190          self.assertEqual(prune.status_code, 200, prune.text)
   191          prune_payload = prune.json()
   192          self.assertGreater(prune_payload["SpaceReclaimed"], 0)
   193  
   194          # FIXME need method to determine which image is going to be "pruned" to fix test
   195          # TODO should handler be recursive when deleting images?
   196          # self.assertIn(img["Id"], prune_payload["ImagesDeleted"][1]["Deleted"])
   197  
   198          # FIXME (@vrothberg): I commented this line out during the `libimage` migration.
   199          # It doesn't make sense to report anything to be deleted if the reclaimed space
   200          # is zero.  I think the test needs some rewrite.
   201          # self.assertIsNotNone(prune_payload["ImagesDeleted"][1]["Deleted"])
   202  
   203      def test_status(self):
   204          r = requests.post(
   205              self.podman_url + "/v1.40/containers/create?name=topcontainer",
   206              json={"Cmd": ["top"], "Image": "alpine:latest"},
   207          )
   208          self.assertEqual(r.status_code, 201, r.text)
   209          payload = r.json()
   210          container_id = payload["Id"]
   211          self.assertIsNotNone(container_id)
   212  
   213          r = requests.get(
   214              self.podman_url + "/v1.40/containers/json",
   215              params={"all": "true", "filters": f'{{"id":["{container_id}"]}}'},
   216          )
   217          self.assertEqual(r.status_code, 200, r.text)
   218          payload = r.json()
   219          self.assertEqual(payload[0]["Status"], "Created")
   220  
   221          r = requests.post(self.podman_url + f"/v1.40/containers/{container_id}/start")
   222          self.assertEqual(r.status_code, 204, r.text)
   223  
   224          r = requests.get(
   225              self.podman_url + "/v1.40/containers/json",
   226              params={"all": "true", "filters": f'{{"id":["{container_id}"]}}'},
   227          )
   228          self.assertEqual(r.status_code, 200, r.text)
   229          payload = r.json()
   230          self.assertTrue(str(payload[0]["Status"]).startswith("Up"))
   231  
   232          r = requests.post(self.podman_url + f"/v1.40/containers/{container_id}/pause")
   233          self.assertEqual(r.status_code, 204, r.text)
   234  
   235          r = requests.get(
   236              self.podman_url + "/v1.40/containers/json",
   237              params={"all": "true", "filters": f'{{"id":["{container_id}"]}}'},
   238          )
   239          self.assertEqual(r.status_code, 200, r.text)
   240          payload = r.json()
   241          self.assertTrue(str(payload[0]["Status"]).startswith("Up"))
   242          self.assertTrue(str(payload[0]["Status"]).endswith("(Paused)"))
   243  
   244          r = requests.post(self.podman_url + f"/v1.40/containers/{container_id}/unpause")
   245          self.assertEqual(r.status_code, 204, r.text)
   246          r = requests.post(self.podman_url + f"/v1.40/containers/{container_id}/stop")
   247          self.assertEqual(r.status_code, 204, r.text)
   248  
   249          r = requests.get(
   250              self.podman_url + "/v1.40/containers/json",
   251              params={"all": "true", "filters": f'{{"id":["{container_id}"]}}'},
   252          )
   253          self.assertEqual(r.status_code, 200, r.text)
   254          payload = r.json()
   255          self.assertTrue(str(payload[0]["Status"]).startswith("Exited"))
   256  
   257          r = requests.delete(self.podman_url + f"/v1.40/containers/{container_id}")
   258          self.assertEqual(r.status_code, 204, r.text)
   259  
   260  
   261  if __name__ == "__main__":
   262      unittest.main()