2 # -*- coding: utf-8 -*-
14 import arvados.commands.keepdocker as arv_keepdocker
15 import arvados_testutil as tutil
18 class StopTest(Exception):
22 class ArvKeepdockerTestCase(unittest.TestCase):
23 def run_arv_keepdocker(self, args):
24 sys.argv = ['arv-keepdocker'] + args
25 return arv_keepdocker.main()
27 def test_unsupported_arg(self):
28 with self.assertRaises(SystemExit):
29 self.run_arv_keepdocker(['-x=unknown'])
31 def test_version_argument(self):
34 with tutil.redirected_streams(stdout=out, stderr=err):
35 with self.assertRaises(SystemExit):
36 self.run_arv_keepdocker(['--version'])
37 self.assertEqual(out.getvalue(), '')
38 self.assertRegexpMatches(err.getvalue(), "[0-9]+\.[0-9]+\.[0-9]+")
40 @mock.patch('arvados.commands.keepdocker.find_image_hashes',
41 return_value=['abc123'])
42 @mock.patch('arvados.commands.keepdocker.find_one_image_hash',
43 return_value='abc123')
44 def test_image_format_compatibility(self, _1, _2):
45 old_id = hashlib.sha256('old').hexdigest()
46 new_id = 'sha256:'+hashlib.sha256('new').hexdigest()
47 for supported, img_id, expect_ok in [
48 (['v1'], old_id, True),
49 (['v1'], new_id, False),
53 (['v1', 'v2'], new_id, True),
54 (['v1'], new_id, False),
55 (['v2'], new_id, True)]:
57 fakeDD = arvados.api('v1')._rootDesc
59 del fakeDD['dockerImageFormats']
61 fakeDD['dockerImageFormats'] = supported
66 with tutil.redirected_streams(stdout=out, stderr=err), \
67 mock.patch('arvados.api') as api, \
68 mock.patch('arvados.commands.keepdocker.popen_docker',
69 return_value=subprocess.Popen(
71 stdout=subprocess.PIPE)), \
72 mock.patch('arvados.commands.keepdocker.prep_image_file',
73 side_effect=StopTest), \
74 self.assertRaises(StopTest if expect_ok else SystemExit):
76 api()._rootDesc = fakeDD
77 self.run_arv_keepdocker(['--force', 'testimage'])
79 self.assertEqual(out.getvalue(), '')
81 self.assertNotRegexpMatches(
82 err.getvalue(), "refusing to store",
83 msg=repr((supported, img_id)))
85 self.assertRegexpMatches(
86 err.getvalue(), "refusing to store",
87 msg=repr((supported, img_id)))
89 self.assertRegexpMatches(
91 "server does not specify supported image formats",
92 msg=repr((supported, img_id)))
94 fakeDD = arvados.api('v1')._rootDesc
95 fakeDD['dockerImageFormats'] = ['v1']
98 with tutil.redirected_streams(stdout=out, stderr=err), \
99 mock.patch('arvados.api') as api, \
100 mock.patch('arvados.commands.keepdocker.popen_docker',
101 return_value=subprocess.Popen(
103 stdout=subprocess.PIPE)), \
104 mock.patch('arvados.commands.keepdocker.prep_image_file',
105 side_effect=StopTest), \
106 self.assertRaises(StopTest):
107 api()._rootDesc = fakeDD
108 self.run_arv_keepdocker(
109 ['--force', '--force-image-format', 'testimage'])
110 self.assertRegexpMatches(err.getvalue(), "forcing incompatible image")