8186: Add comment/warning about EBS volume size limit.
authorPeter Amstutz <peter.amstutz@curoverse.com>
Tue, 20 Jun 2017 16:38:10 +0000 (12:38 -0400)
committerPeter Amstutz <peter.amstutz@curoverse.com>
Tue, 20 Jun 2017 16:38:43 +0000 (12:38 -0400)
Arvados-DCO-1.1-Signed-off-by: Peter Amstutz <peter.amstutz@curoverse.com>

services/nodemanager/arvnodeman/computenode/driver/ec2.py
services/nodemanager/tests/test_computenode_driver_ec2.py

index 9670c9c62b5f9ec3ab46b754a7b0cb32ab70cc74..d6b877c27cdef137b469b7a06027712c3ac8986c 100644 (file)
@@ -73,9 +73,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",
index e7a36ebff307889a979f7a9f6c9ab56d4c24f247..8da55a1f474518f26d7b668d189d1a3757eadcf6 100644 (file)
@@ -127,3 +127,22 @@ class EC2ComputeNodeDriverTestCase(testutil.DriverTestMixin, unittest.TestCase):
         create_method = self.driver_mock().create_node
         self.assertTrue(create_method.called)
         self.assertIsNone(create_method.call_args[1].get('ex_blockdevicemappings'))
+
+    def test_ebs_volume_too_big(self):
+        arv_node = testutil.arvados_node_mock()
+        driver = self.new_driver()
+        # libcloud/ec2 "disk" sizes are in GB, Arvados/SLURM "scratch" value is in MB
+        size = testutil.MockSize(1)
+        size.disk=80
+        size.scratch=20000000
+        driver.create_node(size, arv_node)
+        create_method = self.driver_mock().create_node
+        self.assertTrue(create_method.called)
+        self.assertEqual([{
+            "DeviceName": "/dev/xvdt",
+            "Ebs": {
+                "DeleteOnTermination": True,
+                "VolumeSize": 16384,
+                "VolumeType": "gp2"
+            }}],
+                         create_method.call_args[1].get('ex_blockdevicemappings'))