From 4a3f3b5c02e43d64c68425de4306e310b4ef9ed6 Mon Sep 17 00:00:00 2001 From: Sujil02 Date: Thu, 11 Jun 2020 09:18:52 -0400 Subject: Adds more docker py test Addes more docker py test Optimize test to import images from cache Rename test class and dir for python unittest framework Signed-off-by: Sujil02 --- test/dockerpy/README.md | 30 ----- test/dockerpy/__init__.py | 0 test/dockerpy/common.py | 68 ----------- test/dockerpy/constant.py | 13 --- test/dockerpy/containers.py | 46 -------- test/dockerpy/images.py | 151 ------------------------- test/test_dockerpy/README.md | 30 +++++ test/test_dockerpy/__init__.py | 0 test/test_dockerpy/common.py | 85 ++++++++++++++ test/test_dockerpy/constant.py | 13 +++ test/test_dockerpy/test_containers.py | 194 ++++++++++++++++++++++++++++++++ test/test_dockerpy/test_images.py | 150 ++++++++++++++++++++++++ test/test_dockerpy/test_info_version.py | 46 ++++++++ 13 files changed, 518 insertions(+), 308 deletions(-) delete mode 100644 test/dockerpy/README.md delete mode 100644 test/dockerpy/__init__.py delete mode 100644 test/dockerpy/common.py delete mode 100644 test/dockerpy/constant.py delete mode 100644 test/dockerpy/containers.py delete mode 100644 test/dockerpy/images.py create mode 100644 test/test_dockerpy/README.md create mode 100644 test/test_dockerpy/__init__.py create mode 100644 test/test_dockerpy/common.py create mode 100644 test/test_dockerpy/constant.py create mode 100644 test/test_dockerpy/test_containers.py create mode 100644 test/test_dockerpy/test_images.py create mode 100644 test/test_dockerpy/test_info_version.py (limited to 'test') diff --git a/test/dockerpy/README.md b/test/dockerpy/README.md deleted file mode 100644 index 32e426d58..000000000 --- a/test/dockerpy/README.md +++ /dev/null @@ -1,30 +0,0 @@ -# Dockerpy regression test - -Python test suite to validate Podman endpoints using dockerpy library - -Running tests -============= -To run the tests locally in your sandbox: - -#### 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/__init__.py b/test/dockerpy/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/test/dockerpy/common.py b/test/dockerpy/common.py deleted file mode 100644 index fdacb49be..000000000 --- a/test/dockerpy/common.py +++ /dev/null @@ -1,68 +0,0 @@ -import docker -import subprocess -import os -import sys -import time -from docker import Client -from . import constant - -alpineDict = { - "name": "docker.io/library/alpine:latest", - "shortName": "alpine", - "tarballName": "alpine.tar"} - -def get_client(): - client = docker.Client(base_url="http://localhost:8080",timeout=15) - return client - -client = get_client() - -def podman(): - binary = os.getenv("PODMAN_BINARY") - if binary is None: - binary = "bin/podman" - return binary - -def restore_image_from_cache(): - client.load_image(constant.ImageCacheDir+alpineDict["tarballName"]) - -def run_top_container(): - client.pull(constant.ALPINE) - c = client.create_container(constant.ALPINE,name=constant.TOP) - client.start(container=c.get("Id")) - -def enable_sock(TestClass): - TestClass.podman = subprocess.Popen( - [ - podman(), "system", "service", "tcp:localhost:8080", - "--log-level=debug", "--time=0" - ], - shell=False, - stdin=subprocess.DEVNULL, - stdout=subprocess.DEVNULL, - stderr=subprocess.DEVNULL, - ) - time.sleep(2) - -def terminate_connection(TestClass): - TestClass.podman.terminate() - stdout, stderr = TestClass.podman.communicate(timeout=0.5) - if stdout: - print("\nService Stdout:\n" + stdout.decode('utf-8')) - if stderr: - print("\nService Stderr:\n" + stderr.decode('utf-8')) - - if TestClass.podman.returncode > 0: - sys.stderr.write("podman exited with error code {}\n".format( - TestClass.podman.returncode)) - sys.exit(2) - -def remove_all_containers(): - containers = client.containers(quiet=True) - for c in containers: - client.remove_container(container=c.get("Id"), force=True) - -def remove_all_images(): - allImages = client.images() - for image in allImages: - client.remove_image(image,force=True) diff --git a/test/dockerpy/constant.py b/test/dockerpy/constant.py deleted file mode 100644 index 8a3f1d984..000000000 --- a/test/dockerpy/constant.py +++ /dev/null @@ -1,13 +0,0 @@ -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" -TOP = "top" -ImageCacheDir = "/tmp/podman/imagecachedir" diff --git a/test/dockerpy/containers.py b/test/dockerpy/containers.py deleted file mode 100644 index d70ec932c..000000000 --- a/test/dockerpy/containers.py +++ /dev/null @@ -1,46 +0,0 @@ - -import unittest -import docker -import requests -import os -from docker import Client -from . import constant -from . import common - -client = common.get_client() - -class TestContainers(unittest.TestCase): - - podman = None - - def setUp(self): - super().setUp() - common.run_top_container() - - def tearDown(self): - common.remove_all_containers() - common.remove_all_images() - return super().tearDown() - - @classmethod - def setUpClass(cls): - super().setUpClass() - common.enable_sock(cls) - - @classmethod - def tearDownClass(cls): - common.terminate_connection(cls) - return super().tearDownClass() - - def test_inspect_container(self): - # Inspect bogus container - with self.assertRaises(requests.HTTPError): - client.inspect_container("dummy") - # Inspect valid container - container = client.inspect_container(constant.TOP) - self.assertIn(constant.TOP , container["Name"]) - - -if __name__ == '__main__': - # Setup temporary space - unittest.main() diff --git a/test/dockerpy/images.py b/test/dockerpy/images.py deleted file mode 100644 index 1e07d25c7..000000000 --- a/test/dockerpy/images.py +++ /dev/null @@ -1,151 +0,0 @@ - -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): - - podman = None - def setUp(self): - super().setUp() - client.pull(constant.ALPINE) - - def tearDown(self): - common.remove_all_images() - return super().tearDown() - - @classmethod - def setUpClass(cls): - super().setUpClass() - common.enable_sock(cls) - - - @classmethod - def tearDownClass(cls): - common.terminate_connection(cls) - return super().tearDownClass() - - -# 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 - self.assertFalse - -# 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 - self.assertFalse - -# Prune Image (No docker-py support yet) - -# Export Image - - def test_export_image(self): - client.pull(constant.BB) - file = os.path.join(constant.ImageCacheDir , "busybox.tar") - if not os.path.exists(constant.ImageCacheDir): - os.makedirs(constant.ImageCacheDir) - # Check for error with wrong image name - with self.assertRaises(requests.HTTPError): - client.get_image("dummy") - response = client.get_image(constant.BB) - image_tar = open(file,mode="wb") - image_tar.write(response.data) - image_tar.close() - os.stat(file) - -# Import|Load Image - - def test_import_image(self): - allImages = client.images() - self.assertEqual(len(allImages), 1) - file = os.path.join(constant.ImageCacheDir , "busybox.tar") - client.import_image_from_file(filename=file) - allImages = client.images() - self.assertEqual(len(allImages), 2) - -if __name__ == '__main__': - # Setup temporary space - unittest.main() diff --git a/test/test_dockerpy/README.md b/test/test_dockerpy/README.md new file mode 100644 index 000000000..32e426d58 --- /dev/null +++ b/test/test_dockerpy/README.md @@ -0,0 +1,30 @@ +# Dockerpy regression test + +Python test suite to validate Podman endpoints using dockerpy library + +Running tests +============= +To run the tests locally in your sandbox: + +#### 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/test_dockerpy/__init__.py b/test/test_dockerpy/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/test/test_dockerpy/common.py b/test/test_dockerpy/common.py new file mode 100644 index 000000000..975b13dc6 --- /dev/null +++ b/test/test_dockerpy/common.py @@ -0,0 +1,85 @@ +import docker +import subprocess +import os +import sys +import time +from docker import Client +from . import constant + +alpineDict = { + "name": "docker.io/library/alpine:latest", + "shortName": "alpine", + "tarballName": "alpine.tar"} + +def get_client(): + client = docker.Client(base_url="http://localhost:8080",timeout=15) + return client + +client = get_client() + +def podman(): + binary = os.getenv("PODMAN_BINARY") + if binary is None: + binary = "bin/podman" + return binary + +def restore_image_from_cache(TestClass): + alpineImage = os.path.join(constant.ImageCacheDir , alpineDict["tarballName"]) + if not os.path.exists(alpineImage): + os.makedirs(constant.ImageCacheDir) + client.pull(constant.ALPINE) + response = client.get_image(constant.ALPINE) + image_tar = open(alpineImage,mode="wb") + image_tar.write(response.data) + image_tar.close() + else : + TestClass.podman = subprocess.run( + [ + podman(), "load", "-i", alpineImage + ], + shell=False, + stdin=subprocess.DEVNULL, + stdout=subprocess.DEVNULL, + stderr=subprocess.DEVNULL, + ) + +def run_top_container(): + c = client.create_container(image=constant.ALPINE,command='/bin/sleep 5',name=constant.TOP) + client.start(container=c.get("Id")) + return c.get("Id") + +def enable_sock(TestClass): + TestClass.podman = subprocess.Popen( + [ + podman(), "system", "service", "tcp:localhost:8080", + "--log-level=debug", "--time=0" + ], + shell=False, + stdin=subprocess.DEVNULL, + stdout=subprocess.DEVNULL, + stderr=subprocess.DEVNULL, + ) + time.sleep(2) + +def terminate_connection(TestClass): + TestClass.podman.terminate() + stdout, stderr = TestClass.podman.communicate(timeout=0.5) + if stdout: + print("\nService Stdout:\n" + stdout.decode('utf-8')) + if stderr: + print("\nService Stderr:\n" + stderr.decode('utf-8')) + + if TestClass.podman.returncode > 0: + sys.stderr.write("podman exited with error code {}\n".format( + TestClass.podman.returncode)) + sys.exit(2) + +def remove_all_containers(): + containers = client.containers(quiet=True) + for c in containers: + client.remove_container(container=c.get("Id"), force=True) + +def remove_all_images(): + allImages = client.images() + for image in allImages: + client.remove_image(image,force=True) diff --git a/test/test_dockerpy/constant.py b/test/test_dockerpy/constant.py new file mode 100644 index 000000000..8a3f1d984 --- /dev/null +++ b/test/test_dockerpy/constant.py @@ -0,0 +1,13 @@ +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" +TOP = "top" +ImageCacheDir = "/tmp/podman/imagecachedir" diff --git a/test/test_dockerpy/test_containers.py b/test/test_dockerpy/test_containers.py new file mode 100644 index 000000000..34fe82c18 --- /dev/null +++ b/test/test_dockerpy/test_containers.py @@ -0,0 +1,194 @@ + +import unittest +import docker +import requests +import os +from docker import Client +from . import constant +from . import common +import time + +client = common.get_client() + +class TestContainers(unittest.TestCase): + + podman = None + topContainerId = "" + + def setUp(self): + super().setUp() + common.restore_image_from_cache(self) + TestContainers.topContainerId = common.run_top_container() + + def tearDown(self): + common.remove_all_containers() + common.remove_all_images() + return super().tearDown() + + @classmethod + def setUpClass(cls): + super().setUpClass() + common.enable_sock(cls) + + @classmethod + def tearDownClass(cls): + common.terminate_connection(cls) + return super().tearDownClass() + + def test_inspect_container(self): + # Inspect bogus container + with self.assertRaises(requests.HTTPError) as error: + client.inspect_container("dummy") + self.assertEqual(error.exception.response.status_code, 404) + # Inspect valid container by name + container = client.inspect_container(constant.TOP) + self.assertIn(TestContainers.topContainerId , container["Id"]) + # Inspect valid container by Id + container = client.inspect_container(TestContainers.topContainerId) + self.assertIn(constant.TOP , container["Name"]) + + def test_create_container(self): + # Run a container with detach mode + container = client.create_container(image="alpine", detach=True) + self.assertEqual(len(container),2) + + + def test_start_container(self): + # Start bogus container + with self.assertRaises(requests.HTTPError) as error: + client.start("dummy") + self.assertEqual(error.exception.response.status_code, 404) + + # Podman docs says it should give a 304 but returns with no response + # # Start a already started container should return 304 + # response = client.start(container=TestContainers.topContainerId) + # self.assertEqual(error.exception.response.status_code, 304) + + # Create a new container and validate the count + client.create_container(image=constant.ALPINE,name="container2") + containers = client.containers(quiet=True,all=True) + self.assertEqual(len(containers),2) + + def test_stop_container(self): + # Stop bogus container + with self.assertRaises(requests.HTTPError) as error: + client.stop("dummy") + self.assertEqual(error.exception.response.status_code, 404) + + # Validate the container state + container = client.inspect_container(constant.TOP) + self.assertEqual(container["State"]["Status"], "running") + + # Stop a running container and validate the state + client.stop(TestContainers.topContainerId) + container = client.inspect_container(constant.TOP) + self.assertIn(container["State"]["Status"],"stopped exited",) + + def test_restart_container(self): + # Restart bogus container + with self.assertRaises(requests.HTTPError) as error: + client.restart("dummy") + self.assertEqual(error.exception.response.status_code, 404) + + # Validate the container state + client.stop(TestContainers.topContainerId) + container = client.inspect_container(constant.TOP) + self.assertEqual(container["State"]["Status"], "stopped") + + # restart a running container and validate the state + client.restart(TestContainers.topContainerId) + container = client.inspect_container(constant.TOP) + self.assertEqual(container["State"]["Status"], "running") + + def test_remove_container(self): + # Remove bogus container + with self.assertRaises(requests.HTTPError) as error: + client.remove_container("dummy") + self.assertEqual(error.exception.response.status_code, 404) + + # Remove container by ID with force + client.remove_container(TestContainers.topContainerId, force=True) + containers = client.containers() + self.assertEqual(len(containers),0) + + def test_remove_container_without_force(self): + # Validate current container count + containers = client.containers() + self.assertTrue(len(containers),1) + + # Remove running container should throw error + with self.assertRaises(requests.HTTPError) as error: + client.remove_container(TestContainers.topContainerId) + self.assertEqual(error.exception.response.status_code, 500) + + # Remove container by ID with force + client.stop(TestContainers.topContainerId) + client.remove_container(TestContainers.topContainerId) + containers = client.containers() + self.assertEqual(len(containers),0) + + def test_pause_container(self): + # Pause bogus container + with self.assertRaises(requests.HTTPError) as error: + client.pause("dummy") + self.assertEqual(error.exception.response.status_code, 404) + + # Validate the container state + container = client.inspect_container(constant.TOP) + self.assertEqual(container["State"]["Status"], "running") + + # Pause a running container and validate the state + client.pause(container) + container = client.inspect_container(constant.TOP) + self.assertEqual(container["State"]["Status"], "paused") + + def test_pause_stoped_container(self): + # Stop the container + client.stop(TestContainers.topContainerId) + + # Pause exited container should trow error + with self.assertRaises(requests.HTTPError) as error: + client.pause(TestContainers.topContainerId) + self.assertEqual(error.exception.response.status_code, 500) + + + def test_unpause_container(self): + # Unpause bogus container + with self.assertRaises(requests.HTTPError) as error: + client.unpause("dummy") + self.assertEqual(error.exception.response.status_code, 404) + + # Validate the container state + client.pause(TestContainers.topContainerId) + container = client.inspect_container(constant.TOP) + self.assertEqual(container["State"]["Status"], "paused") + + # Pause a running container and validate the state + client.unpause(TestContainers.topContainerId) + container = client.inspect_container(constant.TOP) + self.assertEqual(container["State"]["Status"], "running") + + def test_list_container(self): + + # Add container and validate the count + client.create_container(image="alpine", detach=True) + containers = client.containers(all=True) + self.assertEqual(len(containers),2) + + # Not working for now......checking + # # List container with filter by id + # filters = {'id':TestContainers.topContainerId} + # filteredContainers = client.containers(all=True,filters = filters) + # self.assertEqual(len(filteredContainers) , 1) + + # # List container with filter by name + # filters = {'name':constant.TOP} + # filteredContainers = client.containers(all=True,filters = filters) + # self.assertEqual(len(filteredContainers) , 1) + + @unittest.skip("Not Supported yet") + def test_rename_container(self): + # rename bogus container + with self.assertRaises(requests.HTTPError) as error: + client.rename(container="dummy", name="newname") + self.assertEqual(error.exception.response.status_code, 404) diff --git a/test/test_dockerpy/test_images.py b/test/test_dockerpy/test_images.py new file mode 100644 index 000000000..c88353b79 --- /dev/null +++ b/test/test_dockerpy/test_images.py @@ -0,0 +1,150 @@ + +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): + + podman = None + def setUp(self): + super().setUp() + common.restore_image_from_cache(self) + + def tearDown(self): + common.remove_all_images() + return super().tearDown() + + @classmethod + def setUpClass(cls): + super().setUpClass() + common.enable_sock(cls) + + + @classmethod + def tearDownClass(cls): + common.terminate_connection(cls) + return super().tearDownClass() + + +# 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) + allImages = client.images() + self.assertEqual(len(allImages) , 2) + + + # 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 + self.assertFalse + +# 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 + self.assertFalse + +# Prune Image (No docker-py support yet) + +# Export Image + + def test_export_image(self): + client.pull(constant.BB) + file = os.path.join(constant.ImageCacheDir , "busybox.tar") + if not os.path.exists(constant.ImageCacheDir): + os.makedirs(constant.ImageCacheDir) + # Check for error with wrong image name + with self.assertRaises(requests.HTTPError): + client.get_image("dummy") + response = client.get_image(constant.BB) + image_tar = open(file,mode="wb") + image_tar.write(response.data) + image_tar.close() + os.stat(file) + +# Import|Load Image + + def test_import_image(self): + allImages = client.images() + self.assertEqual(len(allImages), 1) + file = os.path.join(constant.ImageCacheDir , "busybox.tar") + client.import_image_from_file(filename=file) + allImages = client.images() + self.assertEqual(len(allImages), 2) + +if __name__ == '__main__': + # Setup temporary space + unittest.main() diff --git a/test/test_dockerpy/test_info_version.py b/test/test_dockerpy/test_info_version.py new file mode 100644 index 000000000..be1a2aab9 --- /dev/null +++ b/test/test_dockerpy/test_info_version.py @@ -0,0 +1,46 @@ +import unittest +import docker +from docker import Client +from . import constant +from . import common + +client = common.get_client() + +class TestInfo_Version(unittest.TestCase): + + podman = None + topContainerId = "" + + def setUp(self): + super().setUp() + common.restore_image_from_cache(self) + TestInfo_Version.topContainerId = common.run_top_container() + + def tearDown(self): + common.remove_all_containers() + common.remove_all_images() + return super().tearDown() + + @classmethod + def setUpClass(cls): + super().setUpClass() + common.enable_sock(cls) + + @classmethod + def tearDownClass(cls): + common.terminate_connection(cls) + return super().tearDownClass() + + + def test_Info(self): + self.assertIsNotNone(client.info()) + + def test_info_container_details(self): + info = client.info() + self.assertEqual(info["Containers"],1) + client.create_container(image=constant.ALPINE) + info = client.info() + self.assertEqual(info["Containers"],2) + + def test_version(self): + self.assertIsNotNone(client.version()) -- cgit v1.2.3-54-g00ecf