12431: Use libcloud fork 2.2.2.dev1
[arvados.git] / services / nodemanager / arvnodeman / computenode / driver / ec2.py
index 9670c9c62b5f9ec3ab46b754a7b0cb32ab70cc74..9300645c38f47b74d780e605d32e37134df0c15a 100644 (file)
@@ -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', [
@@ -73,9 +79,10 @@ class ComputeNodeDriver(BaseComputeNodeDriver):
         scratch = int(size.scratch / 1000) + 1
         if scratch > size.disk:
             volsize = scratch - size.disk
-            if volsize < 1:
-                volsize = 1
             if volsize > 16384:
+                # Must be 1-16384 for General Purpose SSD (gp2) devices
+                # https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_EbsBlockDevice.html
+                self._logger.warning("Requested EBS volume size %d is too large, capping size request to 16384 GB", volsize)
                 volsize = 16384
             kw["ex_blockdevicemappings"] = [{
                 "DeviceName": "/dev/xvdt",
@@ -86,9 +93,6 @@ class ComputeNodeDriver(BaseComputeNodeDriver):
                 }}]
         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)})