X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/73812c5a32581a7f72922dcd2e448e4d4ba4d918..0eb72b526bf8bbb011551ecf019f604e17a534f1:/services/nodemanager/arvnodeman/computenode/driver/gce.py diff --git a/services/nodemanager/arvnodeman/computenode/driver/gce.py b/services/nodemanager/arvnodeman/computenode/driver/gce.py index c5bf0b8cda..419557fe28 100644 --- a/services/nodemanager/arvnodeman/computenode/driver/gce.py +++ b/services/nodemanager/arvnodeman/computenode/driver/gce.py @@ -1,4 +1,7 @@ #!/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 @@ -31,6 +34,7 @@ class ComputeNodeDriver(BaseComputeNodeDriver): create_kwargs = create_kwargs.copy() create_kwargs.setdefault('external_ip', None) create_kwargs.setdefault('ex_metadata', {}) + self._project = auth_kwargs.get("project") super(ComputeNodeDriver, self).__init__( auth_kwargs, list_kwargs, create_kwargs, driver_class) @@ -38,17 +42,13 @@ class ComputeNodeDriver(BaseComputeNodeDriver): self._disktype_links = {dt.name: self._object_link(dt) for dt in self.real.ex_list_disktypes()} - @staticmethod - def _name_key(cloud_object): - return cloud_object.name - @staticmethod def _object_link(cloud_object): return cloud_object.extra.get('selfLink') def _init_image(self, image_name): return 'image', self.search_for( - image_name, 'list_images', self._name_key) + image_name, 'list_images', self._name_key, ex_project=self._project) def _init_network(self, network_name): return 'ex_network', self.search_for( @@ -64,9 +64,16 @@ class ComputeNodeDriver(BaseComputeNodeDriver): self.create_kwargs['ex_metadata']['sshKeys'] = ( 'root:' + ssh_file.read().strip()) + 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): - cluster_id, _, node_id = arvados_node['uuid'].split('-') - name = 'compute-{}-{}'.format(node_id, cluster_id) + name = self.create_cloud_name(arvados_node) + + if size.scratch > 375000: + self._logger.warning("Requested %d MB scratch space, but GCE driver currently only supports attaching a single 375 GB disk.", size.scratch) + disks = [ {'autoDelete': True, 'boot': True, @@ -136,6 +143,10 @@ class ComputeNodeDriver(BaseComputeNodeDriver): raise def sync_node(self, cloud_node, arvados_node): + # Update the cloud node record to ensure we have the correct metadata + # fingerprint. + cloud_node = self.real.ex_get_node(cloud_node.name, cloud_node.extra['zone']) + # We can't store the FQDN on the name attribute or anything like it, # because (a) names are static throughout the node's life (so FQDN # isn't available because we don't know it at node creation time) and @@ -147,12 +158,8 @@ class ComputeNodeDriver(BaseComputeNodeDriver): self._find_metadata(metadata_items, 'hostname')['value'] = hostname except KeyError: metadata_items.append({'key': 'hostname', 'value': hostname}) - response = self.real.connection.async_request( - '/zones/{}/instances/{}/setMetadata'.format( - cloud_node.extra['zone'].name, cloud_node.name), - method='POST', data=metadata_req) - if not response.success(): - raise Exception("setMetadata error: {}".format(response.error)) + + self.real.ex_set_node_metadata(cloud_node, metadata_items) @classmethod def node_fqdn(cls, node): @@ -167,3 +174,7 @@ class ComputeNodeDriver(BaseComputeNodeDriver): node.extra['metadata']['items'], 'booted_at')) except KeyError: return 0 + + @classmethod + def node_id(cls, node): + return node.id