075760ab7d8469edc63ad6eaad57b90cc6a118b8
[arvados.git] / services / nodemanager / tests / test_computenode_driver_gce.py
1 #!/usr/bin/env python
2
3 from __future__ import absolute_import, print_function
4
5 import time
6 import unittest
7
8 import mock
9
10 import arvnodeman.computenode.driver.gce as gce
11 from . import testutil
12
13 class GCEComputeNodeDriverTestCase(unittest.TestCase):
14     def setUp(self):
15         self.driver_mock = mock.MagicMock(name='driver_mock')
16
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)
22
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])
28
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)
33
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)
38
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',
47                                                      'arg missing'))
48
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))
54
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])
64
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])
74
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',
80                                                    reftuple)}
81         self.assertEqual(refsecs, gce.ComputeNodeDriver.node_start_time(node))
82
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))
88
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))
97
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'])