summaryrefslogtreecommitdiff
path: root/contrib/python/podman/test/test_images.py
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/python/podman/test/test_images.py')
-rw-r--r--contrib/python/podman/test/test_images.py172
1 files changed, 172 insertions, 0 deletions
diff --git a/contrib/python/podman/test/test_images.py b/contrib/python/podman/test/test_images.py
new file mode 100644
index 000000000..14bf90992
--- /dev/null
+++ b/contrib/python/podman/test/test_images.py
@@ -0,0 +1,172 @@
+import itertools
+import os
+import unittest
+from collections import Counter
+from datetime import datetime, timezone
+from test.podman_testcase import PodmanTestCase
+
+import podman
+
+
+class TestImages(PodmanTestCase):
+ @classmethod
+ def setUpClass(cls):
+ super().setUpClass()
+
+ @classmethod
+ def tearDownClass(cls):
+ super().tearDownClass()
+
+ def setUp(self):
+ self.tmpdir = os.environ['TMPDIR']
+ self.host = os.environ['PODMAN_HOST']
+
+ self.pclient = podman.Client(self.host)
+ self.images = self.loadCache()
+
+ def tearDown(self):
+ pass
+
+ def loadCache(self):
+ with podman.Client(self.host) as pclient:
+ self.images = list(pclient.images.list())
+
+ self.alpine_image = next(
+ iter([
+ i for i in self.images
+ if 'docker.io/library/alpine:latest' in i['repoTags']
+ ] or []), None)
+
+ return self.images
+
+ def test_list(self):
+ actual = self.loadCache()
+ self.assertGreaterEqual(len(actual), 2)
+ self.assertIsNotNone(self.alpine_image)
+
+ def test_build(self):
+ path = os.path.join(self.tmpdir, 'ctnr', 'Dockerfile')
+ img, logs = self.pclient.images.build(
+ dockerfile=[path],
+ tags=['alpine-unittest'],
+ )
+ self.assertIsNotNone(img)
+ self.assertIn('localhost/alpine-unittest:latest', img.repoTags)
+ self.assertLess(
+ podman.datetime_parse(img.created), datetime.now(timezone.utc))
+ self.assertTrue(logs)
+
+ def test_create(self):
+ img_details = self.alpine_image.inspect()
+
+ actual = self.alpine_image.container()
+ self.assertIsNotNone(actual)
+ self.assertEqual(actual.status, 'configured')
+
+ ctnr = actual.start()
+ self.assertIn(ctnr.status, ['running', 'exited'])
+
+ ctnr_details = ctnr.inspect()
+ for e in img_details.containerconfig['env']:
+ self.assertIn(e, ctnr_details.config['env'])
+
+ def test_export(self):
+ path = os.path.join(self.tmpdir, 'alpine_export.tar')
+ target = 'oci-archive:{}:latest'.format(path)
+
+ actual = self.alpine_image.export(target, False)
+ self.assertTrue(actual)
+ self.assertTrue(os.path.isfile(path))
+
+ def test_get(self):
+ actual = self.pclient.images.get(self.alpine_image.id)
+ self.assertEqual(actual, self.alpine_image)
+
+ def test_history(self):
+ records = []
+ bucket = Counter()
+ for record in self.alpine_image.history():
+ self.assertIn(record.id, (self.alpine_image.id, '<missing>'))
+ bucket[record.id] += 1
+ records.append(record)
+
+ self.assertGreater(bucket[self.alpine_image.id], 0)
+ self.assertEqual(sum(bucket.values()), len(records))
+
+ def test_inspect(self):
+ actual = self.alpine_image.inspect()
+ self.assertEqual(actual.id, self.alpine_image.id)
+
+ def test_push(self):
+ path = '{}/alpine_push'.format(self.tmpdir)
+ target = 'dir:{}'.format(path)
+ self.alpine_image.push(target)
+
+ self.assertTrue(os.path.isfile(os.path.join(path, 'manifest.json')))
+ self.assertTrue(os.path.isfile(os.path.join(path, 'version')))
+
+ def test_tag(self):
+ self.assertEqual(self.alpine_image.id,
+ self.alpine_image.tag('alpine:fubar'))
+ self.loadCache()
+ self.assertIn('alpine:fubar', self.alpine_image.repoTags)
+
+ def test_remove(self):
+ before = self.loadCache()
+
+ # assertRaises doesn't follow the import name :(
+ with self.assertRaises(podman.ErrorOccurred):
+ self.alpine_image.remove()
+
+ actual = self.alpine_image.remove(force=True)
+ self.assertEqual(self.alpine_image.id, actual)
+ after = self.loadCache()
+
+ self.assertLess(len(after), len(before))
+ TestImages.setUpClass()
+ self.loadCache()
+
+ def test_import_delete_unused(self):
+ before = self.loadCache()
+ # create unused image, so we have something to delete
+ source = os.path.join(self.tmpdir, 'alpine_gold.tar')
+ new_img = self.pclient.images.import_image(
+ source,
+ 'alpine2:latest',
+ 'unittest.test_import',
+ )
+ after = self.loadCache()
+
+ self.assertEqual(len(before) + 1, len(after))
+ self.assertIsNotNone(
+ next(iter([i for i in after if new_img in i['id']] or []), None))
+
+ actual = self.pclient.images.delete_unused()
+ self.assertIn(new_img, actual)
+
+ after = self.loadCache()
+ self.assertGreaterEqual(len(before), len(after))
+
+ TestImages.setUpClass()
+ self.loadCache()
+
+ def test_pull(self):
+ before = self.loadCache()
+ actual = self.pclient.images.pull('prom/busybox:latest')
+ after = self.loadCache()
+
+ self.assertEqual(len(before) + 1, len(after))
+ self.assertIsNotNone(
+ next(iter([i for i in after if actual in i['id']] or []), None))
+
+ def test_search(self):
+ actual = self.pclient.images.search('alpine', 25)
+ names, length = itertools.tee(actual)
+
+ for img in names:
+ self.assertIn('alpine', img.name)
+ self.assertTrue(0 < len(list(length)) <= 25)
+
+
+if __name__ == '__main__':
+ unittest.main()