summaryrefslogtreecommitdiff
path: root/buildscripts/tests
diff options
context:
space:
mode:
authorJonathan Abrahams <jonathan@mongodb.com>2017-07-03 09:07:16 -0400
committerJonathan Abrahams <jonathan@mongodb.com>2017-07-03 09:07:16 -0400
commit3fd1d565b0dd8863be687843746b2cd7e5860377 (patch)
tree7ca8e2aec62f6b84495e9a483144e2c41c179796 /buildscripts/tests
parentedc858ca3a32974c07f027e6860a52ac6e89039b (diff)
downloadmongo-3fd1d565b0dd8863be687843746b2cd7e5860377.tar.gz
SERVER-29813 Spawn and control AWS EC2 instances using Boto 3
Diffstat (limited to 'buildscripts/tests')
-rwxr-xr-xbuildscripts/tests/test_aws_ec2.py276
1 files changed, 276 insertions, 0 deletions
diff --git a/buildscripts/tests/test_aws_ec2.py b/buildscripts/tests/test_aws_ec2.py
new file mode 100755
index 00000000000..40f433392f2
--- /dev/null
+++ b/buildscripts/tests/test_aws_ec2.py
@@ -0,0 +1,276 @@
+#!/usr/bin/env python
+
+"""Unit test for buildscripts/aws_ec2.py."""
+
+import datetime
+import os
+import sys
+import unittest
+
+if __name__ == "__main__" and __package__ is None:
+ sys.path.append(os.getcwd())
+from buildscripts import aws_ec2
+
+_AMI = "ami-ed6bec86"
+_INSTANCE_TYPE = "t1.micro"
+
+
+class AwsEc2TestCase(unittest.TestCase):
+ def setUp(self):
+ self.aws_ec2 = aws_ec2.AwsEc2()
+ self.launched_instances = []
+ self.ami = _AMI
+ self.instance_type = _INSTANCE_TYPE
+ self.key_name = None
+ self.security_groups = None
+ self.expire_dt = datetime.datetime.utcnow() + datetime.timedelta(hours=1)
+ self.tags = [{"Key": "expire-on", "Value": self.expire_dt.strftime("%Y-%m-%d %H:%M:%S")},
+ {"Key": "Name", "Value": "Unittest AWS EC2 Launcher"},
+ {"Key": "owner", "Value": ""}]
+
+ def tearDown(self):
+ for instance in self.launched_instances:
+ self.aws_ec2.control_instance(mode="terminate", image_id=instance)
+
+
+class AwsEc2Connect(AwsEc2TestCase):
+ def runTest(self):
+ self.assertIsNotNone(self.aws_ec2)
+
+
+class AwsEc2Launch(AwsEc2TestCase):
+ def runTest(self):
+ code, ret = self.aws_ec2.launch_instance(
+ ami=self.ami,
+ instance_type=self.instance_type,
+ key_name=self.key_name,
+ security_groups=self.security_groups,
+ tags=self.tags)
+ self.assertEqual(0, code, ret)
+ self.launched_instances.append(ret.instance_id)
+
+ code, ret = self.aws_ec2.launch_instance(
+ ami=self.ami,
+ block_devices={"xvde": 5, "xvdf": 10},
+ instance_type=self.instance_type,
+ key_name=self.key_name,
+ security_groups=self.security_groups,
+ tags=self.tags)
+ self.assertEqual(0, code, ret)
+ self.launched_instances.append(ret.instance_id)
+
+ code, ret = self.aws_ec2.launch_instance(
+ ami=self.ami,
+ instance_type=self.instance_type,
+ key_name=self.key_name,
+ security_groups=self.security_groups,
+ tags=self.tags,
+ DryRun=True)
+ self.assertEqual(1, code, ret)
+
+ code, ret = self.aws_ec2.launch_instance(
+ ami=self.ami,
+ instance_type=self.instance_type,
+ key_name=self.key_name,
+ security_groups=self.security_groups,
+ tags=self.tags,
+ InvalidParam=True)
+ self.assertEqual(1, code, ret)
+
+ code, ret = self.aws_ec2.launch_instance(
+ ami="ami-bad_ami",
+ instance_type=self.instance_type,
+ key_name=self.key_name,
+ security_groups=self.security_groups,
+ tags=self.tags)
+ self.assertNotEqual(0, code, ret)
+
+ code, ret = self.aws_ec2.launch_instance(
+ ami=self.ami,
+ instance_type="bad_instance_type",
+ key_name=self.key_name,
+ security_groups=self.security_groups,
+ tags=self.tags)
+ self.assertNotEqual(0, code, ret)
+
+ code, ret = self.aws_ec2.launch_instance(
+ ami=self.ami,
+ instance_type=self.instance_type,
+ key_name="bad_key_name",
+ security_groups=self.security_groups,
+ tags=self.tags)
+ self.assertNotEqual(0, code, ret)
+
+
+class AwsEc2LaunchStatus(AwsEc2TestCase):
+ def runTest(self):
+ code, ret = self.aws_ec2.launch_instance(
+ ami=self.ami,
+ instance_type=self.instance_type,
+ key_name=self.key_name,
+ security_groups=self.security_groups,
+ tags=self.tags)
+ self.assertEqual(0, code, ret)
+ self.launched_instances.append(ret.instance_id)
+ self.assertEqual(self.ami, ret.image_id, ret)
+ self.assertEqual(self.instance_type, ret.instance_type, ret)
+ self.assertTrue(ret.state["Name"] in ["pending", "running"], ret)
+ for tag in ret.tags:
+ self.assertTrue(tag in self.tags, ret)
+ for tag in self.tags:
+ self.assertTrue(tag in ret.tags, ret)
+
+ code, ret = self.aws_ec2.launch_instance(
+ ami=self.ami,
+ instance_type=self.instance_type,
+ key_name=self.key_name,
+ security_groups=self.security_groups,
+ tags=self.tags,
+ wait_time_secs=300,
+ show_progress=True)
+ self.assertEqual("running", ret.state["Name"], ret)
+ self.assertIsNotNone(ret.public_ip_address, ret)
+ self.assertIsNotNone(ret.private_ip_address, ret)
+ self.launched_instances.append(ret.instance_id)
+
+
+class AwsEc2ControlStatus(AwsEc2TestCase):
+ def runTest(self):
+ code, ret = self.aws_ec2.launch_instance(
+ ami=self.ami,
+ instance_type=self.instance_type,
+ key_name=self.key_name,
+ security_groups=self.security_groups,
+ tags=self.tags)
+ self.assertEqual(0, code, ret)
+ self.launched_instances.append(ret.instance_id)
+
+ code, ret = self.aws_ec2.control_instance(
+ mode="status",
+ image_id=ret.instance_id)
+ self.assertEqual(0, code, ret)
+ self.assertEqual(self.ami, ret.image_id, ret)
+ self.assertEqual(self.instance_type, ret.instance_type, ret)
+ self.assertTrue(ret.state["Name"] in ["pending", "running"], ret)
+ for tag in ret.tags:
+ self.assertTrue(tag in self.tags, ret)
+ for tag in self.tags:
+ self.assertTrue(tag in ret.tags, ret)
+ self.assertIsNotNone(ret.instance_id, ret)
+ self.assertIsNotNone(ret.image_id, ret)
+ self.assertIsNotNone(ret.instance_type, ret)
+ self.assertIsNotNone(ret.state["Name"], ret)
+ self.assertIsNotNone(ret.tags, ret)
+
+ self.assertRaises(ValueError,
+ self.aws_ec2.control_instance,
+ mode="bad_mode",
+ image_id=ret.instance_id)
+
+ code, ret = self.aws_ec2.control_instance(mode="status", image_id="bad_id")
+ self.assertNotEqual(0, code, ret)
+ self.assertRegexpMatches(ret, "Invalid", ret)
+
+
+class AwsEc2ControlStart(AwsEc2TestCase):
+ def runTest(self):
+ code, ret = self.aws_ec2.launch_instance(
+ ami=self.ami,
+ instance_type=self.instance_type,
+ key_name=self.key_name,
+ security_groups=self.security_groups,
+ tags=self.tags)
+ self.assertEqual(0, code, ret)
+ self.launched_instances.append(ret.instance_id)
+
+ code, ret = self.aws_ec2.control_instance(mode="start", image_id=ret.instance_id)
+ self.assertEqual(0, code, ret)
+ self.assertTrue(ret.state["Name"] in ["starting", "running"], ret)
+
+
+class AwsEc2ControlStartReboot(AwsEc2TestCase):
+ def runTest(self):
+ code, ret = self.aws_ec2.launch_instance(
+ ami=self.ami,
+ instance_type=self.instance_type,
+ key_name=self.key_name,
+ security_groups=self.security_groups,
+ tags=self.tags)
+ self.assertEqual(0, code, ret)
+ self.launched_instances.append(ret.instance_id)
+
+ code, ret = self.aws_ec2.control_instance(mode="start", image_id=ret.instance_id)
+ self.assertEqual(0, code, ret)
+ self.assertTrue(ret.state["Name"] in ["running"], ret)
+
+ code, ret = self.aws_ec2.control_instance(mode="reboot", image_id=ret.instance_id)
+ self.assertEqual(0, code, ret)
+ self.assertTrue(ret.state["Name"] in ["rebooting", "running"], ret)
+
+
+class AwsEc2ControlStop(AwsEc2TestCase):
+ def runTest(self):
+ code, ret = self.aws_ec2.launch_instance(
+ ami=self.ami,
+ instance_type=self.instance_type,
+ key_name=self.key_name,
+ security_groups=self.security_groups,
+ tags=self.tags,
+ wait_time_secs=60)
+ self.assertEqual(0, code, ret)
+ self.launched_instances.append(ret.instance_id)
+
+ code, ret = self.aws_ec2.control_instance(mode="stop", image_id=ret.instance_id)
+ self.assertEqual(0, code, ret)
+ self.assertTrue(ret.state["Name"] in ["stopping", "stopped"], ret)
+
+ code, ret = self.aws_ec2.control_instance(mode="start", image_id=ret.instance_id)
+ self.assertEqual(0, code, ret)
+ self.assertTrue(ret.state["Name"] in ["pending", "running"], ret)
+
+ code, ret = self.aws_ec2.control_instance(mode="force-stop", image_id=ret.instance_id)
+ self.assertEqual(0, code, ret)
+ self.assertTrue(ret.state["Name"] in ["stopping", "stopped"], ret)
+
+
+class AwsEc2ControlTerminate(AwsEc2TestCase):
+ def runTest(self):
+ code, ret = self.aws_ec2.launch_instance(
+ ami=self.ami,
+ instance_type=self.instance_type,
+ key_name=self.key_name,
+ security_groups=self.security_groups,
+ tags=self.tags)
+ self.assertEqual(0, code, ret)
+ self.launched_instances.append(ret.instance_id)
+
+ code, ret = self.aws_ec2.control_instance(mode="terminate", image_id=ret.instance_id)
+ self.assertEqual(0, code, ret)
+ self.assertTrue(ret.state["Name"] in ["shutting-down", "terminated"], ret)
+
+ code, ret = self.aws_ec2.control_instance(mode="start", image_id=ret.instance_id)
+ self.assertNotEqual(0, code, ret)
+
+
+class AwsEc2TagInstance(AwsEc2TestCase):
+ def runTest(self):
+ code, ret = self.aws_ec2.launch_instance(
+ ami=self.ami,
+ instance_type=self.instance_type,
+ key_name=self.key_name,
+ security_groups=self.security_groups,
+ tags=[])
+ self.assertEqual(0, code, ret)
+ self.launched_instances.append(ret.instance_id)
+
+ self.aws_ec2.tag_instance(image_id=ret.instance_id, tags=self.tags)
+ code, ret = self.aws_ec2.control_instance(mode="status", image_id=ret.instance_id)
+ self.assertEqual(0, code, ret)
+ for tag in ret.tags:
+ self.assertTrue(tag in self.tags, ret)
+ for tag in self.tags:
+ self.assertTrue(tag in ret.tags, ret)
+
+
+if __name__ == "__main__":
+ unittest.main()