6507: Add basic azure driver tests.
[arvados.git] / services / nodemanager / arvnodeman / computenode / driver / azure.py
1 #!/usr/bin/env python
2
3 from __future__ import absolute_import, print_function
4
5 import time
6 from operator import attrgetter
7
8 import libcloud.compute.base as cloud_base
9 import libcloud.compute.providers as cloud_provider
10 import libcloud.compute.types as cloud_types
11
12 from . import BaseComputeNodeDriver
13 from .. import arvados_node_fqdn, arvados_timestamp, ARVADOS_TIMEFMT
14
15 class ComputeNodeDriver(BaseComputeNodeDriver):
16
17     DEFAULT_DRIVER = cloud_provider.get_driver(cloud_types.Provider.AZURE_ARM)
18     SEARCH_CACHE = {}
19
20     def __init__(self, auth_kwargs, list_kwargs, create_kwargs,
21                  driver_class=DEFAULT_DRIVER):
22
23         if not list_kwargs.get("ex_resource_group"):
24             raise Exception("Must include ex_resource_group in Cloud List configuration (list_kwargs)")
25
26         create_kwargs["ex_resource_group"] = list_kwargs["ex_resource_group"]
27
28         self.tags = {key[4:]: value
29                      for key, value in create_kwargs.iteritems()
30                      if key.startswith('tag_')}
31         super(ComputeNodeDriver, self).__init__(
32             auth_kwargs, list_kwargs, create_kwargs,
33             driver_class)
34
35     def arvados_create_kwargs(self, arvados_node):
36         cluster_id, _, node_id = arvados_node['uuid'].split('-')
37         name = 'compute-{}-{}'.format(node_id, cluster_id)
38         tags = {
39             'booted_at': time.strftime(ARVADOS_TIMEFMT, time.gmtime()),
40             'arv-ping-url': self._make_ping_url(arvados_node),
41         }
42         tags.update(self.tags)
43         return {
44             'name': name,
45             'ex_tags': tags,
46         }
47
48     def sync_node(self, cloud_node, arvados_node):
49         hostname = arvados_node_fqdn(arvados_node)
50         self.real.ex_create_tags(cloud_node, {"hostname": hostname})
51
52     def _init_image(self, urn):
53         return "image", self.list_images(ex_urn=urn)[0]
54
55     def _init_ssh_key(self, filename):
56         with open(filename) as ssh_file:
57             key = cloud_base.NodeAuthSSHKey(ssh_file.read())
58         return 'auth', key
59
60     def list_nodes(self):
61         # Azure only supports filtering node lists by resource group.
62         # Do our own filtering based on tag.
63         return [node for node in
64                 super(ComputeNodeDriver, self).list_nodes()
65                 if node.extra["tags"].get("arvados-class") == self.tags["arvados-class"]]
66
67     @classmethod
68     def node_fqdn(cls, node):
69         return node.extra["tags"].get("hostname")
70
71     @classmethod
72     def node_start_time(cls, node):
73         return arvados_timestamp(node.extra["tags"].get("booted_at"))