3 from __future__ import absolute_import, print_function
10 import arvnodeman.computenode.driver.gce as gce
11 from . import testutil
13 class GCEComputeNodeDriverTestCase(unittest.TestCase):
15 self.driver_mock = mock.MagicMock(name='driver_mock')
17 def new_driver(self, auth_kwargs={}, list_kwargs={}, create_kwargs={}):
18 create_kwargs.setdefault('ping_host', '100::')
19 return gce.ComputeNodeDriver(
20 auth_kwargs, list_kwargs, create_kwargs,
21 driver_class=self.driver_mock)
23 def test_driver_instantiation(self):
24 kwargs = {'user_id': 'foo'}
25 driver = self.new_driver(auth_kwargs=kwargs)
26 self.assertTrue(self.driver_mock.called)
27 self.assertEqual(kwargs, self.driver_mock.call_args[1])
29 def test_create_location_loaded_at_initialization(self):
30 kwargs = {'location': 'testregion'}
31 driver = self.new_driver(create_kwargs=kwargs)
32 self.assertTrue(self.driver_mock().list_locations)
34 def test_create_image_loaded_at_initialization(self):
35 kwargs = {'image': 'testimage'}
36 driver = self.new_driver(create_kwargs=kwargs)
37 self.assertTrue(self.driver_mock().list_images)
39 def test_create_includes_ping_secret(self):
40 arv_node = testutil.arvados_node_mock(info={'ping_secret': 'ssshh'})
41 driver = self.new_driver()
42 driver.create_node(testutil.MockSize(1), arv_node)
43 create_method = self.driver_mock().create_node
44 self.assertTrue(create_method.called)
45 self.assertIn('ping_secret=ssshh',
46 create_method.call_args[1].get('ex_userdata',
49 def test_generate_metadata_for_new_arvados_node(self):
50 arv_node = testutil.arvados_node_mock(8)
51 driver = self.new_driver(list_kwargs={'list': 'test'})
52 self.assertEqual({'ex_metadata': {'list': 'test'}},
53 driver.arvados_create_kwargs(arv_node))
55 def test_tags_set_default_hostname_from_new_arvados_node(self):
56 arv_node = testutil.arvados_node_mock(hostname=None)
57 cloud_node = testutil.cloud_node_mock(1)
58 driver = self.new_driver()
59 driver.sync_node(cloud_node, arv_node)
60 tag_mock = self.driver_mock().ex_set_node_tags
61 self.assertTrue(tag_mock.called)
62 self.assertEqual(['hostname-dynamic.compute.zzzzz.arvadosapi.com'],
63 tag_mock.call_args[0][1])
65 def test_sync_node_sets_static_hostname(self):
66 arv_node = testutil.arvados_node_mock(1)
67 cloud_node = testutil.cloud_node_mock(2)
68 driver = self.new_driver()
69 driver.sync_node(cloud_node, arv_node)
70 tag_mock = self.driver_mock().ex_set_node_tags
71 self.assertTrue(tag_mock.called)
72 self.assertEqual(['hostname-compute1.zzzzz.arvadosapi.com'],
73 tag_mock.call_args[0][1])
75 def test_node_create_time(self):
76 refsecs = int(time.time())
77 reftuple = time.gmtime(refsecs)
78 node = testutil.cloud_node_mock()
79 node.extra = {'launch_time': time.strftime('%Y-%m-%dT%H:%M:%S.000Z',
81 self.assertEqual(refsecs, gce.ComputeNodeDriver.node_start_time(node))
83 def test_generate_metadata_for_new_arvados_node(self):
84 arv_node = testutil.arvados_node_mock(8)
85 driver = self.new_driver(list_kwargs={'list': 'test'})
86 self.assertEqual({'ex_metadata': {'list': 'test'}},
87 driver.arvados_create_kwargs(arv_node))
89 def test_deliver_ssh_key_in_metadata(self):
90 test_ssh_key = 'ssh-rsa-foo'
91 arv_node = testutil.arvados_node_mock(1)
92 with mock.patch('__builtin__.open', mock.mock_open(read_data=test_ssh_key)) as mock_file:
93 driver = self.new_driver(create_kwargs={'ssh_key': 'ssh-key-file'})
94 mock_file.assert_called_once_with('ssh-key-file')
95 self.assertEqual({'ex_metadata': {'sshKeys': 'root:ssh-rsa-foo'}},
96 driver.arvados_create_kwargs(arv_node))
98 def test_create_driver_with_service_accounts(self):
99 srv_acct_config = { 'service_accounts': '{ "email": "foo@bar", "scopes":["storage-full"]}' }
100 arv_node = testutil.arvados_node_mock(1)
101 driver = self.new_driver(create_kwargs=srv_acct_config)
102 create_kwargs = driver.arvados_create_kwargs(arv_node)
103 self.assertEqual({u'email': u'foo@bar', u'scopes': [u'storage-full']},
104 create_kwargs['ex_service_accounts'])