Create, destroy, tag nodes.
authorPeter Amstutz <peter.amstutz@curoverse.com>
Tue, 18 Aug 2015 21:23:14 +0000 (17:23 -0400)
committerPeter Amstutz <peter.amstutz@curoverse.com>
Tue, 18 Aug 2015 21:23:14 +0000 (17:23 -0400)
services/nodemanager/arvnodeman/computenode/driver/azure.py

index c054fac36f2430b486fccbdaacc9029086b189b1..ecab75ce497a02ecf906d4a5af77090e7204f32c 100644 (file)
@@ -3,41 +3,67 @@
 from __future__ import absolute_import, print_function
 
 import time
+from operator import attrgetter
 
 import libcloud.compute.base as cloud_base
 import libcloud.compute.providers as cloud_provider
 import libcloud.compute.types as cloud_types
 
 from . import BaseComputeNodeDriver
-from .. import arvados_node_fqdn
+from .. import arvados_node_fqdn, arvados_timestamp, ARVADOS_TIMEFMT
 
 class ComputeNodeDriver(BaseComputeNodeDriver):
 
-    DEFAULT_DRIVER = cloud_provider.get_driver(cloud_types.Provider.AZURE)
+    DEFAULT_DRIVER = cloud_provider.get_driver(cloud_types.Provider.AZURE_ARM)
     SEARCH_CACHE = {}
 
     def __init__(self, auth_kwargs, list_kwargs, create_kwargs,
                  driver_class=DEFAULT_DRIVER):
+        list_kwargs["ex_resource_group"] = create_kwargs["ex_resource_group"]
+
+        self.tags = {key[4:]: value
+                     for key, value in create_kwargs.iteritems()
+                     if key.startswith('tag_')}
         super(ComputeNodeDriver, self).__init__(
             auth_kwargs, list_kwargs, create_kwargs,
             driver_class)
 
     def arvados_create_kwargs(self, arvados_node):
-        return {'name': arvados_node["uuid"]}
+        cluster_id, _, node_id = arvados_node['uuid'].split('-')
+        name = 'compute-{}-{}'.format(node_id, cluster_id)
+        tags = {
+            'booted_at': time.strftime(ARVADOS_TIMEFMT, time.gmtime()),
+            'arv-ping-url': self._make_ping_url(arvados_node),
+        }
+        tags.update(self.tags)
+        return {
+            'name': name,
+            'ex_tags': tags,
+        }
 
     def sync_node(self, cloud_node, arvados_node):
-        print("In sync_node")
+        hostname = arvados_node_fqdn(arvados_node)
+        self.real.ex_create_tags(cloud_node.id, {"hostname": hostname})
+
+    def _init_image(self, urn):
+        return "image", self.list_images(ex_urn=urn)[0]
 
-    def _init_image(self, image):
-        return 'image', self.search_for(image, 'list_images')
+    def _init_ssh_key(self, filename):
+        with open(filename) as ssh_file:
+            key = cloud_base.NodeAuthSSHKey(ssh_file.read())
+        return 'auth', key
 
-    def _init_password(self, password):
-        return 'auth', cloud_base.NodeAuthPassword(password)
+    def list_nodes(self):
+        # Azure only supports filtering node lists by resource group.
+        # Do our own filtering based on tag.
+        return [node for node in
+                super(ComputeNodeDriver, self).list_nodes()
+                if node.extra["tags"].get("arvados-class") == self.tags["arvados-class"]]
 
     @classmethod
     def node_fqdn(cls, node):
-        return node.name
+        return node.extra["tags"].get("hostname")
 
     @classmethod
     def node_start_time(cls, node):
-        pass
+        return arvados_timestamp(node.extra["tags"].get("booted_at"))