X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/420d88e40bc5c2d12fe53a5f9f25ec19d80de797..319c1aa1ffcb065492eb1878687c993d7638e94e:/services/nodemanager/arvnodeman/computenode/driver/ec2.py diff --git a/services/nodemanager/arvnodeman/computenode/driver/ec2.py b/services/nodemanager/arvnodeman/computenode/driver/ec2.py index 255a948a6c..6a9f473245 100644 --- a/services/nodemanager/arvnodeman/computenode/driver/ec2.py +++ b/services/nodemanager/arvnodeman/computenode/driver/ec2.py @@ -52,19 +52,10 @@ class ComputeNodeDriver(BaseComputeNodeDriver): super(ComputeNodeDriver, self).__init__( auth_kwargs, {'ex_filters': list_kwargs}, create_kwargs, driver_class) - for key in self.create_kwargs.keys(): - init_method = getattr(self, '_init_' + key, None) - if init_method is not None: - new_pair = init_method(self.create_kwargs.pop(key)) - if new_pair is not None: - self.create_kwargs[new_pair[0]] = new_pair[1] def _init_image_id(self, image_id): return 'image', self.search_for(image_id, 'list_images') - def _init_ping_host(self, ping_host): - self.ping_host = ping_host - def _init_security_groups(self, group_names): return 'ex_security_groups', [ self.search_for(gname.strip(), 'ex_get_security_groups') @@ -73,20 +64,21 @@ class ComputeNodeDriver(BaseComputeNodeDriver): def _init_subnet_id(self, subnet_id): return 'ex_subnet', self.search_for(subnet_id, 'ex_list_subnets') - def _init_ssh_key(self, filename): - with open(filename) as ssh_file: - key = cloud_base.NodeAuthSSHKey(ssh_file.read()) - return 'auth', key - - def arvados_create_kwargs(self, arvados_node): - result = {'name': arvados_node_fqdn(arvados_node)} - ping_secret = arvados_node['info'].get('ping_secret') - if ping_secret is not None: - ping_url = ('https://{}/arvados/v1/nodes/{}/ping?ping_secret={}'. - format(self.ping_host, arvados_node['uuid'], - ping_secret)) - result['ex_userdata'] = ping_url - return result + create_cloud_name = staticmethod(arvados_node_fqdn) + + def arvados_create_kwargs(self, size, arvados_node): + kw = {'name': self.create_cloud_name(arvados_node), + 'ex_userdata': self._make_ping_url(arvados_node)} + # libcloud/ec2 disk sizes are in GB, Arvados/SLURM "scratch" value is in MB + scratch = size.scratch / 1000 + if scratch > size.disk: + kw["ex_blockdevicemappings"] = [{ + "Ebs": { + "DeleteOnTermination": True, + "VolumeSize": scratch - size.disk, + "VolumeType": "gp2" + }}] + return kw def post_create_node(self, cloud_node): self.real.ex_create_tags(cloud_node, self.tags) @@ -95,8 +87,24 @@ class ComputeNodeDriver(BaseComputeNodeDriver): self.real.ex_create_tags(cloud_node, {'Name': arvados_node_fqdn(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"]] + return nodes + + @classmethod + def node_fqdn(cls, node): + return node.name + @classmethod def node_start_time(cls, node): time_str = node.extra['launch_time'].split('.', 2)[0] + 'UTC' return time.mktime(time.strptime( time_str,'%Y-%m-%dT%H:%M:%S%Z')) - time.timezone + + @classmethod + def node_id(cls, node): + return node.id