2 # -*- coding: utf-8 -*-
15 import arvados.commands.keepdocker as arv_keepdocker
16 import arvados_testutil as tutil
17 import run_test_server
20 class StopTest(Exception):
24 class ArvKeepdockerTestCase(unittest.TestCase):
25 def run_arv_keepdocker(self, args, err):
26 sys.argv = ['arv-keepdocker'] + args
27 log_handler = logging.StreamHandler(err)
28 arv_keepdocker.logger.addHandler(log_handler)
30 return arv_keepdocker.main()
32 arv_keepdocker.logger.removeHandler(log_handler)
34 def test_unsupported_arg(self):
35 with self.assertRaises(SystemExit):
36 self.run_arv_keepdocker(['-x=unknown'], sys.stderr)
38 def test_version_argument(self):
41 with tutil.redirected_streams(stdout=out, stderr=err):
42 with self.assertRaises(SystemExit):
43 self.run_arv_keepdocker(['--version'], sys.stderr)
44 self.assertEqual(out.getvalue(), '')
45 self.assertRegexpMatches(err.getvalue(), "[0-9]+\.[0-9]+\.[0-9]+")
47 @mock.patch('arvados.commands.keepdocker.find_image_hashes',
48 return_value=['abc123'])
49 @mock.patch('arvados.commands.keepdocker.find_one_image_hash',
50 return_value='abc123')
51 def test_image_format_compatibility(self, _1, _2):
52 old_id = hashlib.sha256('old').hexdigest()
53 new_id = 'sha256:'+hashlib.sha256('new').hexdigest()
54 for supported, img_id, expect_ok in [
55 (['v1'], old_id, True),
56 (['v1'], new_id, False),
57 (None, old_id, False),
60 (['v1', 'v2'], new_id, True),
61 (['v1'], new_id, False),
62 (['v2'], new_id, True)]:
64 fakeDD = arvados.api('v1')._rootDesc
66 del fakeDD['dockerImageFormats']
68 fakeDD['dockerImageFormats'] = supported
73 with tutil.redirected_streams(stdout=out), \
74 mock.patch('arvados.api') as api, \
75 mock.patch('arvados.commands.keepdocker.popen_docker',
76 return_value=subprocess.Popen(
78 stdout=subprocess.PIPE)), \
79 mock.patch('arvados.commands.keepdocker.prep_image_file',
80 side_effect=StopTest), \
81 self.assertRaises(StopTest if expect_ok else SystemExit):
83 api()._rootDesc = fakeDD
84 self.run_arv_keepdocker(['--force', 'testimage'], err)
86 self.assertEqual(out.getvalue(), '')
88 self.assertNotRegexpMatches(
89 err.getvalue(), "refusing to store",
90 msg=repr((supported, img_id)))
92 self.assertRegexpMatches(
93 err.getvalue(), "refusing to store",
94 msg=repr((supported, img_id)))
96 self.assertRegexpMatches(
98 "server does not specify supported image formats",
99 msg=repr((supported, img_id)))
101 fakeDD = arvados.api('v1')._rootDesc
102 fakeDD['dockerImageFormats'] = ['v1']
105 with tutil.redirected_streams(stdout=out), \
106 mock.patch('arvados.api') as api, \
107 mock.patch('arvados.commands.keepdocker.popen_docker',
108 return_value=subprocess.Popen(
110 stdout=subprocess.PIPE)), \
111 mock.patch('arvados.commands.keepdocker.prep_image_file',
112 side_effect=StopTest), \
113 self.assertRaises(StopTest):
114 api()._rootDesc = fakeDD
115 self.run_arv_keepdocker(
116 ['--force', '--force-image-format', 'testimage'], err)
117 self.assertRegexpMatches(err.getvalue(), "forcing incompatible image")