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