From 58a7e4f0854e392de979c531ad397bb508a77779 Mon Sep 17 00:00:00 2001 From: Peter Amstutz Date: Tue, 20 Jun 2017 10:25:09 -0400 Subject: [PATCH] 8186: Round up ec2 ebs volume sizes. Ensure size is in valid range. Add test for creating ec2 instance with ebs storage. --- .../arvnodeman/computenode/driver/ec2.py | 9 ++++-- .../tests/test_computenode_driver_ec2.py | 31 +++++++++++++++++++ services/nodemanager/tests/testutil.py | 3 +- 3 files changed, 40 insertions(+), 3 deletions(-) diff --git a/services/nodemanager/arvnodeman/computenode/driver/ec2.py b/services/nodemanager/arvnodeman/computenode/driver/ec2.py index b256eca985..9670c9c62b 100644 --- a/services/nodemanager/arvnodeman/computenode/driver/ec2.py +++ b/services/nodemanager/arvnodeman/computenode/driver/ec2.py @@ -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 diff --git a/services/nodemanager/tests/test_computenode_driver_ec2.py b/services/nodemanager/tests/test_computenode_driver_ec2.py index 14df360231..e7a36ebff3 100644 --- a/services/nodemanager/tests/test_computenode_driver_ec2.py +++ b/services/nodemanager/tests/test_computenode_driver_ec2.py @@ -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')) diff --git a/services/nodemanager/tests/testutil.py b/services/nodemanager/tests/testutil.py index 41f4ed1355..1ee76900bf 100644 --- a/services/nodemanager/tests/testutil.py +++ b/services/nodemanager/tests/testutil.py @@ -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 = {} -- 2.30.2