add test for bug #1215527

also fake result for 'disableApiTermination' added
in DescribeInstanceAttribute. One of next reviews will add this
functionality.

fix botocore version to 0.103
version 0.104 returns some inconsistent information

Change-Id: I581e803a57c9ee63e873308c0f08cd7cf2158230
This commit is contained in:
Andrey Pavlov 2015-04-17 13:06:39 +03:00
parent d4a116557d
commit a98a506eb9
7 changed files with 127 additions and 7 deletions

View File

@ -492,8 +492,12 @@ def describe_instance_attribute(context, instance_id, attribute):
if user_data:
result['userData'] = {'value': user_data}
def _format_attr_disable_api_termination(result):
result['disableApiTermination'] = {'value': False}
attribute_formatter = {
'blockDeviceMapping': _format_attr_block_device_mapping,
'disableApiTermination': _format_attr_disable_api_termination,
'groupSet': _format_attr_group_set,
'instanceType': _format_attr_instance_type,
'kernel': _format_attr_kernel,

View File

@ -105,7 +105,7 @@ fi
sudo pip install -r test-requirements.txt
# botocore not in openstack requirements now, so install it manually
sudo pip install botocore
sudo pip install botocore==0.103
sudo OS_STDOUT_CAPTURE=-1 OS_STDERR_CAPTURE=-1 OS_TEST_TIMEOUT=500 OS_TEST_LOCK_PATH=${TMPDIR:-'/tmp'} \
python -m subunit.run discover -t ./ ./ec2api/tests/functional | subunit-2to1 | tools/colorizer.py
RETVAL=$?

View File

@ -255,3 +255,110 @@ class InstanceTest(base.EC2TestCase):
self.assertEqual(200, resp.status_code, base.EC2ErrorConverter(data))
self.cancelResourceCleanUp(res_clean)
self.get_instance_waiter().wait_delete(instance_id)
def test_instance_attributes(self):
instance_type = CONF.aws.instance_type
image_id = CONF.aws.image_id
resp, data = self.client.RunInstances(
ImageId=image_id, InstanceType=instance_type,
Placement={'AvailabilityZone': self.zone}, MinCount=1, MaxCount=1)
self.assertEqual(200, resp.status_code, base.EC2ErrorConverter(data))
instance_id = data['Instances'][0]['InstanceId']
res_clean = self.addResourceCleanUp(self.client.TerminateInstances,
InstanceIds=[instance_id])
self.assertEqual(1, len(data['Instances']))
self.get_instance_waiter().wait_available(instance_id,
final_set=('running'))
if CONF.aws.run_incompatible_tests:
resp, data = self.client.DescribeInstanceAttribute(
InstanceId=instance_id, Attribute='blockDeviceMapping')
self.assertEqual(200, resp.status_code,
base.EC2ErrorConverter(data))
bdms = data.get('BlockDeviceMappings', [])
self.assertNotEmpty(bdms)
self.assertEqual(1, len(bdms))
self.assertIn('DeviceName', bdms[0])
self.assertIn('Ebs', bdms[0])
resp, data = self.client.DescribeInstanceAttribute(
InstanceId=instance_id, Attribute='disableApiTermination')
self.assertEqual(200, resp.status_code, base.EC2ErrorConverter(data))
self.assertIn('DisableApiTermination', data)
self.assertIn('Value', data['DisableApiTermination'])
self.assertFalse(data['DisableApiTermination']['Value'])
resp, data = self.client.DescribeInstanceAttribute(
InstanceId=instance_id, Attribute='groupSet')
self.assertEqual(200, resp.status_code, base.EC2ErrorConverter(data))
self.assertIn('Groups', data)
self.assertNotEmpty(data['Groups'], data)
self.assertTrue('GroupId' in data['Groups'][0]
or 'GroupName' in data['Groups'][0])
self.assertTrue(data['Groups'][0].get('GroupId')
or data['Groups'][0].get('GroupName'))
resp, data = self.client.DescribeInstanceAttribute(
InstanceId=instance_id, Attribute='instanceType')
self.assertEqual(200, resp.status_code, base.EC2ErrorConverter(data))
self.assertIn('InstanceType', data)
self.assertIn('Value', data['InstanceType'])
self.assertEqual(instance_type, data['InstanceType']['Value'])
resp, data = self.client.DescribeInstanceAttribute(
InstanceId=instance_id, Attribute='kernel')
self.assertEqual(200, resp.status_code, base.EC2ErrorConverter(data))
self.assertIn('KernelId', data)
resp, data = self.client.DescribeInstanceAttribute(
InstanceId=instance_id, Attribute='ramdisk')
self.assertEqual(200, resp.status_code, base.EC2ErrorConverter(data))
self.assertIn('RamdiskId', data)
resp, data = self.client.DescribeInstanceAttribute(
InstanceId=instance_id, Attribute='rootDeviceName')
self.assertEqual(200, resp.status_code, base.EC2ErrorConverter(data))
self.assertIn('RootDeviceName', data)
self.assertIn('Value', data['RootDeviceName'])
self.assertTrue(data['RootDeviceName']['Value'])
resp, data = self.client.TerminateInstances(InstanceIds=[instance_id])
self.assertEqual(200, resp.status_code, base.EC2ErrorConverter(data))
self.cancelResourceCleanUp(res_clean)
self.get_instance_waiter().wait_delete(instance_id)
@testtools.skipUnless(CONF.aws.run_incompatible_tests,
"Error from nova: "
"Invalid input for field/attribute 0. ...")
def test_launch_instance_with_creating_blank_volume(self):
"""Launch instance with creating blank volume."""
device_name = '/dev/xvdh'
instance_type = CONF.aws.instance_type
resp, data = self.client.RunInstances(
ImageId=CONF.aws.image_id, InstanceType=instance_type,
Placement={'AvailabilityZone': self.zone}, MinCount=1, MaxCount=1,
BlockDeviceMappings=[{'DeviceName': device_name,
'Ebs': {'VolumeSize': 1}}])
self.assertEqual(200, resp.status_code, base.EC2ErrorConverter(data))
instance_id = data['Instances'][0]['InstanceId']
res_clean = self.addResourceCleanUp(self.client.TerminateInstances,
InstanceIds=[instance_id])
self.get_instance_waiter().wait_available(instance_id,
final_set=('running'))
bdt = self.get_instance_bdm(instance_id, device_name)
self.assertIsNotNone(bdt)
volume_id = bdt['Ebs'].get('VolumeId')
self.assertIsNotNone(volume_id)
self.assertTrue(bdt['Ebs']['DeleteOnTermination'])
resp, data = self.client.DescribeVolumes(VolumeIds=[volume_id])
self.assertEqual(200, resp.status_code, base.EC2ErrorConverter(data))
self.assertEqual(1, len(data['Volumes']))
volume = data['Volumes'][0]
self.assertEqual(1, volume['Size'])
resp, data = self.client.TerminateInstances(InstanceIds=[instance_id])
self.assertEqual(200, resp.status_code, base.EC2ErrorConverter(data))
self.cancelResourceCleanUp(res_clean)
self.get_instance_waiter().wait_delete(instance_id)

View File

@ -211,6 +211,15 @@ class VolumeTest(base.EC2TestCase):
self.assertEqual(instance_id, attachment['InstanceId'])
self.assertEqual(volume_id, attachment['VolumeId'])
resp, data = self.client.DescribeInstances(InstanceIds=[instance_id])
self.assertEqual(200, resp.status_code)
self.assertEqual(1, len(data.get('Reservations', [])))
self.assertEqual(1, len(data['Reservations'][0].get('Instances', [])))
bdms = data['Reservations'][0]['Instances'][0]['BlockDeviceMappings']
self.assertNotEmpty(bdms)
self.assertIn('DeviceName', bdms[0])
self.assertIn('Ebs', bdms[0])
resp, data = self.client.DetachVolume(VolumeId=volume_id)
self.assertEqual(200, resp.status_code, base.EC2ErrorConverter(data))
self.cancelResourceCleanUp(clean_vi)

View File

@ -63,7 +63,7 @@ class EC2_EBSInstanceTuneBDM(base.EC2TestCase):
@testtools.skipUnless(
CONF.aws.run_incompatible_tests,
"Error from nova: "
"Block Device Mapping is Invalid: Unrecognized legacy format.")
"Invalid input for field/attribute 0. ...")
def test_launch_ebs_instance_with_persistent_root_device(self):
"""
@ -110,7 +110,7 @@ class EC2_EBSInstanceTuneBDM(base.EC2TestCase):
@testtools.skipUnless(
CONF.aws.run_incompatible_tests,
"Error from nova: "
"Block Device Mapping is Invalid: Unrecognized legacy format.")
"Invalid input for field/attribute 0. ...")
def test_launch_ebs_instance_with_resized_root_device(self):
"""Launch EBS-backed instance with resizing root device."""
new_size = int(math.ceil(self.root_device_size * 1.1))
@ -148,7 +148,7 @@ class EC2_EBSInstanceTuneBDM(base.EC2TestCase):
@testtools.skipUnless(
CONF.aws.run_incompatible_tests,
"Error from nova: "
"Block Device Mapping is Invalid: Unrecognized legacy format.")
"Invalid input for field/attribute 0. ...")
def test_launch_ebs_instance_with_creating_blank_volume(self):
"""Launch instance with creating blank volume."""
device_name_prefix = _get_device_name_prefix(self.root_device_name)

View File

@ -27,9 +27,9 @@ CONF = config.CONF
LOG = log.getLogger(__name__)
class MetadataTest(scenario_base.BaseScenarioTest):
class InstancesTest(scenario_base.BaseScenarioTest):
def test_metadata(self):
def test_userdata(self):
if not CONF.aws.image_id:
raise self.skipException('aws image_id does not provided')

View File

@ -1,3 +1,3 @@
#!/bin/bash -x
sudo pip install botocore
sudo pip install botocore==0.103