From 359d67a68773747a269c407d9e62bee7f36d1d15 Mon Sep 17 00:00:00 2001 From: Sujil02 Date: Wed, 27 May 2020 12:58:52 -0400 Subject: Adds docker py regression test. Adds test to validate podman image endpoints. Adds readme on how to run python tests Adds contants file. Signed-off-by: Sujil02 --- test/dockerpy/README.md | 35 +++++++++++++ test/dockerpy/common.py | 6 +++ test/dockerpy/constant.py | 11 ++++ test/dockerpy/images.py | 131 ++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 183 insertions(+) create mode 100644 test/dockerpy/README.md create mode 100644 test/dockerpy/common.py create mode 100644 test/dockerpy/constant.py create mode 100644 test/dockerpy/images.py diff --git a/test/dockerpy/README.md b/test/dockerpy/README.md new file mode 100644 index 000000000..2894fc8ab --- /dev/null +++ b/test/dockerpy/README.md @@ -0,0 +1,35 @@ +# Dockerpy regression test + +Python test suite to validate Podman endpoints using dockerpy library + +Running tests +============= +To run the tests locally in your sandbox: + +#### Make sure that the Podman system service is running to do so + +``` +sudo podman --log-level=debug system service -t0 unix:/run/podman/podman.sock +``` +#### Run the entire test + +``` +sudo PYTHONPATH=/usr/bin/python python -m dockerpy.images +``` + +Passing the -v option to your test script will instruct unittest.main() to enable a higher level of verbosity, and produce detailed output: + +``` +sudo PYTHONPATH=/usr/bin/python python -m unittest -v dockerpy.images +``` +#### Run a specific test class + +``` +sudo PYTHONPATH=/usr/bin/python python -m unittest -v dockerpy.images.TestImages +``` + +#### Run a specific test within the test class + +``` +sudo PYTHONPATH=/usr/bin/python python -m unittest -v dockerpy.images.TestImages.test_list_images +``` diff --git a/test/dockerpy/common.py b/test/dockerpy/common.py new file mode 100644 index 000000000..767a94ec0 --- /dev/null +++ b/test/dockerpy/common.py @@ -0,0 +1,6 @@ +import docker +from docker import Client + + +def get_client(): + return docker.Client(base_url="unix:/run/podman/podman.sock") diff --git a/test/dockerpy/constant.py b/test/dockerpy/constant.py new file mode 100644 index 000000000..e00457442 --- /dev/null +++ b/test/dockerpy/constant.py @@ -0,0 +1,11 @@ +BB = "docker.io/library/busybox:latest" +NGINX = "docker.io/library/nginx:latest" +ALPINE = "docker.io/library/alpine:latest" +ALPINE_SHORTNAME = "alpine" +ALPINELISTTAG = "docker.io/library/alpine:3.10.2" +ALPINELISTDIGEST = "docker.io/library/alpine@sha256:72c42ed48c3a2db31b7dafe17d275b634664a708d901ec9fd57b1529280f01fb" +ALPINEAMD64DIGEST = "docker.io/library/alpine@sha256:acd3ca9941a85e8ed16515bfc5328e4e2f8c128caa72959a58a127b7801ee01f" +ALPINEAMD64ID = "961769676411f082461f9ef46626dd7a2d1e2b2a38e6a44364bcbecf51e66dd4" +ALPINEARM64DIGEST = "docker.io/library/alpine@sha256:db7f3dcef3d586f7dd123f107c93d7911515a5991c4b9e51fa2a43e46335a43e" +ALPINEARM64ID = "915beeae46751fc564998c79e73a1026542e945ca4f73dc841d09ccc6c2c0672" +infra = "k8s.gcr.io/pause:3.2" diff --git a/test/dockerpy/images.py b/test/dockerpy/images.py new file mode 100644 index 000000000..07ea6c0f8 --- /dev/null +++ b/test/dockerpy/images.py @@ -0,0 +1,131 @@ + +import unittest +import docker +import requests +import os +from docker import Client +from . import constant +from . import common + +client = common.get_client() + +class TestImages(unittest.TestCase): + + def setUp(self): + super().setUp() + client.pull(constant.ALPINE) + + def tearDown(self): + allImages = client.images() + for image in allImages: + client.remove_image(image,force=True) + return super().tearDown() + +# Inspect Image + + + def test_inspect_image(self): + # Check for error with wrong image name + with self.assertRaises(requests.HTTPError): + client.inspect_image("dummy") + alpine_image = client.inspect_image(constant.ALPINE) + self.assertIn(constant.ALPINE, alpine_image["RepoTags"]) + +# Tag Image + + # Validates if invalid image name is given a bad response is encountered. + def test_tag_invalid_image(self): + with self.assertRaises(requests.HTTPError): + client.tag("dummy","demo") + + + + # Validates if the image is tagged successfully. + def test_tag_valid_image(self): + client.tag(constant.ALPINE,"demo",constant.ALPINE_SHORTNAME) + alpine_image = client.inspect_image(constant.ALPINE) + for x in alpine_image["RepoTags"]: + if("demo:alpine" in x): + self.assertTrue + self.assertFalse + + # Validates if name updates when the image is retagged. + @unittest.skip("dosent work now") + def test_retag_valid_image(self): + client.tag(constant.ALPINE_SHORTNAME, "demo","rename") + alpine_image = client.inspect_image(constant.ALPINE) + self.assertNotIn("demo:test", alpine_image["RepoTags"]) + +# List Image + # List All Images + def test_list_images(self): + allImages = client.images() + self.assertEqual(len(allImages), 1) + # Add more images + client.pull(constant.BB) + client.pull(constant.NGINX) + allImages = client.images() + self.assertEqual(len(allImages) , 3) + + + # List images with filter + filters = {'reference':'alpine'} + allImages = client.images(filters = filters) + self.assertEqual(len(allImages) , 1) + +# Search Image + def test_search_image(self): + response = client.search("alpine") + for i in response: + # Alpine found + if "docker.io/library/alpine" in i["Name"]: + self.assertTrue(True, msg="Image found") + self.assertFalse(False,msg="Image not found") + +# Image Exist (No docker-py support yet) + +# Remove Image + def test_remove_image(self): + # Check for error with wrong image name + with self.assertRaises(requests.HTTPError): + client.remove_image("dummy") + allImages = client.images() + self.assertEqual(len(allImages) , 1) + alpine_image = client.inspect_image(constant.ALPINE) + client.remove_image(alpine_image) + allImages = client.images() + self.assertEqual(len(allImages) , 0) + +# Image History + def test_image_history(self): + # Check for error with wrong image name + with self.assertRaises(requests.HTTPError): + client.remove_image("dummy") + imageHistory = client.history(constant.ALPINE) + alpine_image = client.inspect_image(constant.ALPINE) + for h in imageHistory: + if h["Id"] in alpine_image["Id"]: + self.assertTrue(True,msg="Image History validated") + self.assertFalse(False,msg="Unable to get image history") + +# Prune Image (No docker-py support yet) + +# Export Image + + def test_export_image(self): + file = "/tmp/alpine-latest.tar" + # Check for error with wrong image name + with self.assertRaises(requests.HTTPError): + client.get_image("dummy") + response = client.get_image(constant.ALPINE) + image_tar = open(file,mode="wb") + image_tar.write(response.data) + image_tar.close() + os.stat(file) + +# Import|Load Image + + +if __name__ == '__main__': + # Setup temporary space + unittest.main() -- cgit v1.2.3-54-g00ecf