2 # -*- coding: utf-8 -*-
14 import arvados.commands.keepdocker as arv_keepdocker
15 import arvados_testutil as tutil
16 import run_test_server
19 class StopTest(Exception):
23 class ArvKeepdockerTestCase(unittest.TestCase):
24 def run_arv_keepdocker(self, args):
25 sys.argv = ['arv-keepdocker'] + args
26 return arv_keepdocker.main()
28 def test_unsupported_arg(self):
29 with self.assertRaises(SystemExit):
30 self.run_arv_keepdocker(['-x=unknown'])
32 def test_version_argument(self):
35 with tutil.redirected_streams(stdout=out, stderr=err):
36 with self.assertRaises(SystemExit):
37 self.run_arv_keepdocker(['--version'])
38 self.assertEqual(out.getvalue(), '')
39 self.assertRegexpMatches(err.getvalue(), "[0-9]+\.[0-9]+\.[0-9]+")
41 def test_migrate19(self):
43 sys.argv = ['arv-migrate-docker19']
45 added = arv_keepdocker.migrate19()
46 self.assertEqual(len(added), 1)
47 self.assertEqual(added[0]['link_class'], 'docker_image_migration')
48 self.assertEqual(added[0]['name'], 'migrate_1.9_1.10')
49 self.assertEqual(added[0]['tail_uuid'], 'fa3c1a9cb6783f85f2ecda037e07b8c3+167')
50 self.assertEqual(added[0]['head_uuid'], 'd740a57097711e08eb9b2a93518f20ab+174')
52 added = arv_keepdocker.migrate19()
53 self.assertEqual(added, [])
55 run_test_server.reset()
57 @mock.patch('arvados.commands.keepdocker.find_image_hashes',
58 return_value=['abc123'])
59 @mock.patch('arvados.commands.keepdocker.find_one_image_hash',
60 return_value='abc123')
61 def test_image_format_compatibility(self, _1, _2):
62 old_id = hashlib.sha256('old').hexdigest()
63 new_id = 'sha256:'+hashlib.sha256('new').hexdigest()
64 for supported, img_id, expect_ok in [
65 (['v1'], old_id, True),
66 (['v1'], new_id, False),
70 (['v1', 'v2'], new_id, True),
71 (['v1'], new_id, False),
72 (['v2'], new_id, True)]:
74 fakeDD = arvados.api('v1')._rootDesc
76 del fakeDD['dockerImageFormats']
78 fakeDD['dockerImageFormats'] = supported
83 with tutil.redirected_streams(stdout=out, stderr=err), \
84 mock.patch('arvados.api') as api, \
85 mock.patch('arvados.commands.keepdocker.popen_docker',
86 return_value=subprocess.Popen(
88 stdout=subprocess.PIPE)), \
89 mock.patch('arvados.commands.keepdocker.prep_image_file',
90 side_effect=StopTest), \
91 self.assertRaises(StopTest if expect_ok else SystemExit):
93 api()._rootDesc = fakeDD
94 self.run_arv_keepdocker(['--force', 'testimage'])
96 self.assertEqual(out.getvalue(), '')
98 self.assertNotRegexpMatches(
99 err.getvalue(), "refusing to store",
100 msg=repr((supported, img_id)))
102 self.assertRegexpMatches(
103 err.getvalue(), "refusing to store",
104 msg=repr((supported, img_id)))
106 self.assertRegexpMatches(
108 "server does not specify supported image formats",
109 msg=repr((supported, img_id)))
111 fakeDD = arvados.api('v1')._rootDesc
112 fakeDD['dockerImageFormats'] = ['v1']
115 with tutil.redirected_streams(stdout=out, stderr=err), \
116 mock.patch('arvados.api') as api, \
117 mock.patch('arvados.commands.keepdocker.popen_docker',
118 return_value=subprocess.Popen(
120 stdout=subprocess.PIPE)), \
121 mock.patch('arvados.commands.keepdocker.prep_image_file',
122 side_effect=StopTest), \
123 self.assertRaises(StopTest):
124 api()._rootDesc = fakeDD
125 self.run_arv_keepdocker(
126 ['--force', '--force-image-format', 'testimage'])
127 self.assertRegexpMatches(err.getvalue(), "forcing incompatible image")