8784: Fix test for latest firefox.
[arvados.git] / services / nodemanager / tests / test_computenode_driver_azure.py
1 #!/usr/bin/env python
2
3 from __future__ import absolute_import, print_function
4
5 import ssl
6 import time
7 import unittest
8
9 import libcloud.common.types as cloud_types
10 import mock
11
12 import arvnodeman.computenode.driver.azure as azure
13 from . import testutil
14
15 class AzureComputeNodeDriverTestCase(testutil.DriverTestMixin, unittest.TestCase):
16     TEST_CLASS = azure.ComputeNodeDriver
17
18     def new_driver(self, auth_kwargs={}, list_kwargs={}, create_kwargs={}):
19         list_kwargs.setdefault("ex_resource_group", "TestResourceGroup")
20         return super(AzureComputeNodeDriverTestCase, self).new_driver(auth_kwargs, list_kwargs, create_kwargs)
21
22     def test_driver_instantiation(self):
23         kwargs = {'key': 'testkey'}
24         driver = self.new_driver(auth_kwargs=kwargs)
25         self.assertTrue(self.driver_mock.called)
26         self.assertEqual(kwargs, self.driver_mock.call_args[1])
27
28     def test_create_image_loaded_at_initialization(self):
29         get_method = self.driver_mock().get_image
30         get_method.return_value = testutil.cloud_object_mock('id_b')
31         driver = self.new_driver(create_kwargs={'image': 'id_b'})
32         self.assertEqual(1, get_method.call_count)
33
34     def test_create_includes_ping(self):
35         arv_node = testutil.arvados_node_mock(info={'ping_secret': 'ssshh'})
36         arv_node["hostname"] = None
37         driver = self.new_driver()
38         driver.create_node(testutil.MockSize(1), arv_node)
39         create_method = self.driver_mock().create_node
40         self.assertTrue(create_method.called)
41         self.assertIn('ping_secret=ssshh',
42                       create_method.call_args[1].get('ex_tags', {}).get('arv-ping-url', ""))
43
44     def test_name_from_new_arvados_node(self):
45         arv_node = testutil.arvados_node_mock(hostname=None)
46         driver = self.new_driver()
47         self.assertEqual('compute-000000000000063-zzzzz',
48                          driver.arvados_create_kwargs(testutil.MockSize(1), arv_node)['name'])
49
50
51
52     def check_node_tagged(self, cloud_node, expected_tags):
53         tag_mock = self.driver_mock().ex_create_tags
54         self.assertTrue(tag_mock.called)
55         self.assertIs(cloud_node, tag_mock.call_args[0][0])
56         self.assertEqual(expected_tags, tag_mock.call_args[0][1])
57
58     def test_node_create_time(self):
59         refsecs = int(time.time())
60         reftuple = time.gmtime(refsecs)
61         node = testutil.cloud_node_mock()
62         node.extra = {'tags': {'booted_at': time.strftime('%Y-%m-%dT%H:%M:%S.000Z',
63                                                    reftuple)}}
64         self.assertEqual(refsecs, azure.ComputeNodeDriver.node_start_time(node))
65
66     def test_node_fqdn(self):
67         name = 'fqdntest.zzzzz.arvadosapi.com'
68         node = testutil.cloud_node_mock()
69         node.extra = {'tags': {"hostname": name}}
70         self.assertEqual(name, azure.ComputeNodeDriver.node_fqdn(node))
71
72     def test_sync_node(self):
73         arv_node = testutil.arvados_node_mock(1)
74         cloud_node = testutil.cloud_node_mock(2)
75         driver = self.new_driver()
76         driver.sync_node(cloud_node, arv_node)
77         self.check_node_tagged(cloud_node,
78                                {'hostname': 'compute1.zzzzz.arvadosapi.com'})
79
80     def test_custom_data(self):
81         arv_node = testutil.arvados_node_mock(hostname=None)
82         driver = self.new_driver()
83         self.assertEqual("""#!/bin/sh
84 mkdir -p    /var/tmp/arv-node-data/meta-data
85 echo 'https://100::/arvados/v1/nodes/zzzzz-yyyyy-000000000000063/ping?ping_secret=defaulttestsecret' > /var/tmp/arv-node-data/arv-ping-url
86 echo compute-000000000000063-zzzzz > /var/tmp/arv-node-data/meta-data/instance-id
87 echo z1.test > /var/tmp/arv-node-data/meta-data/instance-type
88 """,
89                          driver.arvados_create_kwargs(testutil.MockSize(1), arv_node)['ex_customdata'])
90
91     def test_create_raises_but_actually_succeeded(self):
92         arv_node = testutil.arvados_node_mock(1, hostname=None)
93         driver = self.new_driver(create_kwargs={"tag_arvados-class": "dynamic-compute"})
94         nodelist = [testutil.cloud_node_mock(1, tags={"arvados-class": "dynamic-compute"})]
95         nodelist[0].name = 'compute-000000000000001-zzzzz'
96         self.driver_mock().list_nodes.return_value = nodelist
97         self.driver_mock().create_node.side_effect = IOError
98         n = driver.create_node(testutil.MockSize(1), arv_node)
99         self.assertEqual('compute-000000000000001-zzzzz', n.name)
100
101     def test_ex_fetch_nic_false(self):
102         arv_node = testutil.arvados_node_mock(1, hostname=None)
103         driver = self.new_driver(create_kwargs={"tag_arvados-class": "dynamic-compute"})
104         nodelist = [testutil.cloud_node_mock(1, tags={"arvados-class": "dynamic-compute"})]
105         nodelist[0].name = 'compute-000000000000001-zzzzz'
106         self.driver_mock().list_nodes.return_value = nodelist
107         n = driver.list_nodes()
108         self.assertEqual(nodelist, n)
109         self.driver_mock().list_nodes.assert_called_with(ex_fetch_nic=False, ex_resource_group='TestResourceGroup')
110
111     def test_create_can_find_node_after_timeout(self):
112         super(AzureComputeNodeDriverTestCase,
113               self).test_create_can_find_node_after_timeout(
114                   create_kwargs={'tag_arvados-class': 'test'},
115                   node_extra={'tags': {'arvados-class': 'test'}})
116
117     def test_node_found_after_timeout_has_fixed_size(self):
118         size = testutil.MockSize(4)
119         node_props = {'hardwareProfile': {'vmSize': size.id}}
120         cloud_node = testutil.cloud_node_mock(tags={'arvados-class': 'test'}, properties=node_props)
121         cloud_node.size = None
122         self.check_node_found_after_timeout_has_fixed_size(
123             size, cloud_node, {'tag_arvados-class': 'test'})