X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/f054bc3d7d3d26962e62c2ea7c27214b08e85bb6..8a41cc44ee196c9347785baa476a370abe77c75c:/services/nodemanager/arvnodeman/computenode/driver/ec2.py?ds=sidebyside diff --git a/services/nodemanager/arvnodeman/computenode/driver/ec2.py b/services/nodemanager/arvnodeman/computenode/driver/ec2.py index d6b877c27c..418a9f9d85 100644 --- a/services/nodemanager/arvnodeman/computenode/driver/ec2.py +++ b/services/nodemanager/arvnodeman/computenode/driver/ec2.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 @@ -49,12 +52,15 @@ class ComputeNodeDriver(BaseComputeNodeDriver): self.tags = {key[4:]: value for key, value in list_kwargs.iteritems() if key.startswith('tag:')} + # Tags are assigned at instance creation time + create_kwargs.setdefault('ex_metadata', {}) + create_kwargs['ex_metadata'].update(self.tags) super(ComputeNodeDriver, self).__init__( auth_kwargs, {'ex_filters': list_kwargs}, create_kwargs, driver_class) def _init_image_id(self, image_id): - return 'image', self.search_for(image_id, 'list_images') + return 'image', self.search_for(image_id, 'list_images', ex_owner='self') def _init_security_groups(self, group_names): return 'ex_security_groups', [ @@ -85,21 +91,27 @@ class ComputeNodeDriver(BaseComputeNodeDriver): "VolumeSize": volsize, "VolumeType": "gp2" }}] + if size.preemptible: + # Request a Spot instance for this node + kw['ex_spot_market'] = True return kw - def post_create_node(self, cloud_node): - self.real.ex_create_tags(cloud_node, self.tags) - def sync_node(self, cloud_node, arvados_node): self.real.ex_create_tags(cloud_node, {'Name': arvados_node_fqdn(arvados_node)}) + def create_node(self, size, arvados_node): + # Set up tag indicating the Arvados assigned Cloud Size id. + self.create_kwargs['ex_metadata'].update({'arvados_node_size': size.id}) + return super(ComputeNodeDriver, self).create_node(size, arvados_node) + def list_nodes(self): # Need to populate Node.size nodes = super(ComputeNodeDriver, self).list_nodes() for n in nodes: if not n.size: - n.size = self.sizes[n.extra["instance_type"]] + n.size = self.sizes()[n.extra["instance_type"]] + n.extra['arvados_node_size'] = n.extra.get('tags', {}).get('arvados_node_size') or n.size.id return nodes @classmethod