8186: Round up ec2 ebs volume sizes. Ensure size is in valid range. Add test for... 8186-nodemanager-ebs
authorPeter Amstutz <peter.amstutz@curoverse.com>
Tue, 20 Jun 2017 14:25:09 +0000 (10:25 -0400)
committerPeter Amstutz <peter.amstutz@curoverse.com>
Tue, 20 Jun 2017 14:33:20 +0000 (10:33 -0400)
services/nodemanager/arvnodeman/computenode/driver/ec2.py
services/nodemanager/tests/test_computenode_driver_ec2.py
services/nodemanager/tests/testutil.py

index b256eca985fd817b874f8da818bce67690fcca03..9670c9c62b5f9ec3ab46b754a7b0cb32ab70cc74 100644 (file)
@@ -70,13 +70,18 @@ class ComputeNodeDriver(BaseComputeNodeDriver):
         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
+        scratch = int(size.scratch / 1000) + 1
         if scratch > size.disk:
+            volsize = scratch - size.disk
+            if volsize < 1:
+                volsize = 1
+            if volsize > 16384:
+                volsize = 16384
             kw["ex_blockdevicemappings"] = [{
                 "DeviceName": "/dev/xvdt",
                 "Ebs": {
                     "DeleteOnTermination": True,
-                    "VolumeSize": scratch - size.disk,
+                    "VolumeSize": volsize,
                     "VolumeType": "gp2"
                 }}]
         return kw
index 14df3602313f8e1c249811395d0809dc57f961ee..e7a36ebff307889a979f7a9f6c9ab56d4c24f247 100644 (file)
@@ -96,3 +96,34 @@ class EC2ComputeNodeDriverTestCase(testutil.DriverTestMixin, unittest.TestCase):
         node = testutil.cloud_node_mock()
         node.name = name
         self.assertEqual(name, ec2.ComputeNodeDriver.node_fqdn(node))
+
+    def test_create_ebs_volume(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=5
+        size.scratch=20000
+        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": 16,
+                "VolumeType": "gp2"
+            }}],
+                         create_method.call_args[1].get('ex_blockdevicemappings'))
+
+    def test_ebs_volume_not_needed(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=20000
+        driver.create_node(size, arv_node)
+        create_method = self.driver_mock().create_node
+        self.assertTrue(create_method.called)
+        self.assertIsNone(create_method.call_args[1].get('ex_blockdevicemappings'))
index 41f4ed135563e7868c37831a91a648f09053c7f0..1ee76900bf7989a5fa66bbcd302261c2dcdca264 100644 (file)
@@ -79,7 +79,8 @@ class MockSize(object):
         self.id = 'z{}.test'.format(factor)
         self.name = self.id
         self.ram = 128 * factor
-        self.disk = 100 * factor
+        self.disk = factor   # GB
+        self.scratch = 1000 * factor # MB
         self.bandwidth = 16 * factor
         self.price = float(factor)
         self.extra = {}