X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/87e1614724027f6a9da3f3dfaa163bd8bea4ce62..18b5ad828a4149c1b768d05e477982364002a647:/services/nodemanager/arvnodeman/computenode/driver/azure.py diff --git a/services/nodemanager/arvnodeman/computenode/driver/azure.py b/services/nodemanager/arvnodeman/computenode/driver/azure.py index 13e3c119ce..32f6b6c390 100644 --- a/services/nodemanager/arvnodeman/computenode/driver/azure.py +++ b/services/nodemanager/arvnodeman/computenode/driver/azure.py @@ -1,7 +1,11 @@ #!/usr/bin/env python +# Copyright (C) The Arvados Authors. All rights reserved. +# +# SPDX-License-Identifier: AGPL-3.0 from __future__ import absolute_import, print_function +import pipes import time import libcloud.compute.base as cloud_base @@ -16,7 +20,6 @@ class ComputeNodeDriver(BaseComputeNodeDriver): DEFAULT_DRIVER = cloud_provider.get_driver(cloud_types.Provider.AZURE_ARM) SEARCH_CACHE = {} - CLOUD_ERRORS = BaseComputeNodeDriver.CLOUD_ERRORS + (BaseHTTPError,) def __init__(self, auth_kwargs, list_kwargs, create_kwargs, driver_class=DEFAULT_DRIVER): @@ -37,23 +40,26 @@ class ComputeNodeDriver(BaseComputeNodeDriver): auth_kwargs, list_kwargs, create_kwargs, driver_class) - def arvados_create_kwargs(self, arvados_node, size): - cluster_id, _, node_id = arvados_node['uuid'].split('-') - name = 'compute-{}-{}'.format(node_id, cluster_id) + def create_cloud_name(self, arvados_node): + uuid_parts = arvados_node['uuid'].split('-', 2) + return 'compute-{parts[2]}-{parts[0]}'.format(parts=uuid_parts) + + def arvados_create_kwargs(self, size, arvados_node): tags = { 'booted_at': time.strftime(ARVADOS_TIMEFMT, time.gmtime()), 'arv-ping-url': self._make_ping_url(arvados_node) } tags.update(self.tags) + name = self.create_cloud_name(arvados_node) customdata = """#!/bin/sh mkdir -p /var/tmp/arv-node-data/meta-data -echo "%s" > /var/tmp/arv-node-data/arv-ping-url -echo "%s" > /var/tmp/arv-node-data/meta-data/instance-id -echo "%s" > /var/tmp/arv-node-data/meta-data/instance-type -""" % (tags['arv-ping-url'], - name, - size.id) +echo %s > /var/tmp/arv-node-data/arv-ping-url +echo %s > /var/tmp/arv-node-data/meta-data/instance-id +echo %s > /var/tmp/arv-node-data/meta-data/instance-type +""" % (pipes.quote(tags['arv-ping-url']), + pipes.quote(name), + pipes.quote(size.id)) return { 'name': name, @@ -72,11 +78,17 @@ echo "%s" > /var/tmp/arv-node-data/meta-data/instance-type def _init_image(self, urn): return "image", self.get_image(urn) + def create_node(self, size, arvados_node): + # Set up tag indicating the Arvados assigned Cloud Size id. + self.create_kwargs.setdefault('ex_tags', {}) + self.create_kwargs['ex_tags'].update({'arvados-node-size-id': size.id}) + return super(ComputeNodeDriver, self).create_node(size, arvados_node) + def list_nodes(self): # Azure only supports filtering node lists by resource group. # Do our own filtering based on tag. nodes = [node for node in - super(ComputeNodeDriver, self).list_nodes() + super(ComputeNodeDriver, self).list_nodes(ex_fetch_nic=False, ex_fetch_power_state=False) if node.extra["tags"].get("arvados-class") == self.tags["arvados-class"]] for n in nodes: # Need to populate Node.size @@ -97,3 +109,7 @@ echo "%s" > /var/tmp/arv-node-data/meta-data/instance-type @classmethod def node_start_time(cls, node): return arvados_timestamp(node.extra["tags"].get("booted_at")) + + @classmethod + def node_id(cls, node): + return node.name