diff --git a/api/test_addresses.py b/api/test_addresses.py index 6ca6ca1..fb8bf69 100644 --- a/api/test_addresses.py +++ b/api/test_addresses.py @@ -42,6 +42,7 @@ class AddressTest(base.EC2TestCase): data = self.client.release_address(AllocationId=id) self.cancelResourceCleanUp(res_clean) + @base.skip_without_ec2() def test_create_delete_standard_address(self): data = self.client.allocate_address() ip = data['PublicIp'] @@ -183,6 +184,7 @@ class AddressTest(base.EC2TestCase): self.client.release_address(AllocationId=id2) self.cancelResourceCleanUp(res_clean2) + @base.skip_without_ec2() def test_describe_standard_addresses(self): data = self.client.allocate_address(*[], **{}) ip = data['PublicIp'] @@ -306,6 +308,8 @@ class AddressTest(base.EC2TestCase): @testtools.skipUnless(CONF.aws.image_id, "image id is not defined") # skip this test for nova network due to bug #1607350 @base.skip_without_vpc() + # this is a correct skip + @base.skip_without_ec2() def test_associate_disassociate_standard_addresses(self): instance_id = self.run_instance() @@ -382,6 +386,7 @@ class AddressTest(base.EC2TestCase): self.cancelResourceCleanUp(clean_vpc) self.get_vpc_waiter().wait_delete(vpc_id) + @base.skip_without_ec2() def test_disassociate_not_associated_standard_addresses(self): data = self.client.allocate_address(Domain='standard') ip = data['PublicIp'] diff --git a/api/test_instance_attributes.py b/api/test_instance_attributes.py index ad16df2..08cbe49 100644 --- a/api/test_instance_attributes.py +++ b/api/test_instance_attributes.py @@ -128,9 +128,10 @@ class InstanceAttributeTest(base.EC2TestCase): self.assertRaises('InvalidInstanceID.NotFound', self.client.describe_instance_attribute, InstanceId='i-0', Attribute='disableApiTermination') - self.assertRaises('InvalidParameterCombination', - self.client.describe_instance_attribute, - InstanceId=instance_id, Attribute='sourceDestCheck') + if base.TesterStateHolder().get_ec2_enabled(): + self.assertRaises('InvalidParameterCombination', + self.client.describe_instance_attribute, + InstanceId=instance_id, Attribute='sourceDestCheck') self.assertRaises('InvalidParameterValue', self.client.modify_instance_attribute, @@ -146,12 +147,17 @@ class InstanceAttributeTest(base.EC2TestCase): InstanceId=instance_id, Attribute='disableApiTermination', Value='True', DisableApiTermination={'Value': False}) - self.assertRaises('InvalidParameterCombination', + ex_str = ('InvalidParameterCombination' + if base.TesterStateHolder().get_ec2_enabled() else + 'InvalidGroup.NotFound') + self.assertRaises(ex_str, self.client.modify_instance_attribute, InstanceId=instance_id, Groups=['sg-0']) - self.assertRaises('InvalidParameterCombination', - self.client.modify_instance_attribute, - InstanceId=instance_id, Attribute='sourceDestCheck', Value='False') + if base.TesterStateHolder().get_ec2_enabled(): + self.assertRaises('InvalidParameterCombination', + self.client.modify_instance_attribute, + InstanceId=instance_id, Attribute='sourceDestCheck', + Value='False') self.assertRaises('InvalidParameterValue', self.client.reset_instance_attribute, @@ -169,9 +175,10 @@ class InstanceAttributeTest(base.EC2TestCase): self.client.reset_instance_attribute, InstanceId=instance_id, Attribute='instanceType') - self.assertRaises('InvalidParameterCombination', - self.client.reset_instance_attribute, - InstanceId=instance_id, Attribute='sourceDestCheck') + if base.TesterStateHolder().get_ec2_enabled(): + self.assertRaises('InvalidParameterCombination', + self.client.reset_instance_attribute, + InstanceId=instance_id, Attribute='sourceDestCheck') self.assertRaises('IncorrectInstanceState', self.client.modify_instance_attribute, diff --git a/api/test_instances.py b/api/test_instances.py index 0ff1b33..54f4557 100644 --- a/api/test_instances.py +++ b/api/test_instances.py @@ -54,9 +54,12 @@ class InstanceTest(base.EC2TestCase): self.assertEqual(1, len(instances)) self.assertEqual(1, len(instances[0]['SecurityGroups'])) groups = reservations[0].get('Groups', []) - self.assertEqual(1, len(groups)) - self.assertEqual(groups[0]['GroupName'], - instances[0]['SecurityGroups'][0]['GroupName']) + if base.TesterStateHolder().get_ec2_enabled(): + self.assertEqual(1, len(groups)) + self.assertEqual(groups[0]['GroupName'], + instances[0]['SecurityGroups'][0]['GroupName']) + else: + self.assertEqual(0, len(groups)) self.client.terminate_instances(InstanceIds=[instance_id]) self.cancelResourceCleanUp(res_clean) diff --git a/api/test_instances_vpc.py b/api/test_instances_vpc.py index 28c84a8..acf8ee0 100644 --- a/api/test_instances_vpc.py +++ b/api/test_instances_vpc.py @@ -209,7 +209,10 @@ class InstanceInVPCTest(base.EC2TestCase): 'MaxCount': 1, 'PrivateIpAddress': '10.16.1.2' } - self.assertRaises('InvalidParameterCombination', + ex_str = ('InvalidParameterCombination' + if base.TesterStateHolder().get_ec2_enabled() else + 'InvalidParameterValue') + self.assertRaises(ex_str, self.client.run_instances, rollback_fn=_rollback, **kwargs) diff --git a/api/test_security_groups.py b/api/test_security_groups.py index d251448..18602f8 100644 --- a/api/test_security_groups.py +++ b/api/test_security_groups.py @@ -235,6 +235,13 @@ class SecurityGroupInVPCTest(SecurityGroupBaseTest): class SecurityGroupEC2ClassicTest(SecurityGroupBaseTest): + @classmethod + @base.safe_setup + def setUpClass(cls): + super(SecurityGroupEC2ClassicTest, cls).setUpClass() + if not base.TesterStateHolder().get_ec2_enabled(): + raise cls.skipException('EC2-classic is disabled') + def test_create_delete_security_group(self): name = data_utils.rand_name('sgName') desc = data_utils.rand_name('sgDesc') diff --git a/base.py b/base.py index 7afb767..1e7a44b 100644 --- a/base.py +++ b/base.py @@ -189,12 +189,21 @@ class TesterStateHolder(object): cls, *args, **kwargs) return cls._instance + _ec2_enabled = None _vpc_enabled = None - def get_vpc_enabled(self): - if self._vpc_enabled: - return self._vpc_enabled + def get_ec2_enabled(self): + if self._ec2_enabled is None: + self._fill_attributes() + return self._ec2_enabled + def get_vpc_enabled(self): + if self._vpc_enabled is None: + self._fill_attributes() + return self._vpc_enabled + + def _fill_attributes(self): + self._ec2_enabled = False self._vpc_enabled = False data = self.ec2_client.describe_account_attributes() for item in data.get('AccountAttributes', []): @@ -202,8 +211,21 @@ class TesterStateHolder(object): for value in item['AttributeValues']: if value['AttributeValue'] == 'VPC': self._vpc_enabled = True + if value['AttributeValue'] == 'EC2': + self._ec2_enabled = True - return self._vpc_enabled + +def skip_without_ec2(*args, **kwargs): + """A decorator useful to skip tests if EC2-classic is not supported.""" + def decorator(f): + @functools.wraps(f) + def wrapper(self, *func_args, **func_kwargs): + if not TesterStateHolder().get_ec2_enabled(): + msg = "Skipped because EC2-classic is not enabled" + raise testtools.TestCase.skipException(msg) + return f(self, *func_args, **func_kwargs) + return wrapper + return decorator def skip_without_vpc(*args, **kwargs): diff --git a/scenario/test_paging.py b/scenario/test_paging.py index 8d4b594..62a1ce2 100644 --- a/scenario/test_paging.py +++ b/scenario/test_paging.py @@ -32,6 +32,13 @@ class TagsPagingTest(scenario_base.BaseScenarioTest): # NOTE(andrey-mp): limit for tags for one resource in amazon TAGS_COUNT = 10 + @classmethod + @base.safe_setup + def setUpClass(cls): + super(TagsPagingTest, cls).setUpClass() + if 'amazon' in CONF.aws.ec2_url: + raise cls.skipException('Paging is broken in Amazon.') + def _create_volume_and_tags(self): data = self.client.create_volume( Size=1, AvailabilityZone=CONF.aws.aws_zone) @@ -147,6 +154,9 @@ class VolumesPagingTest(scenario_base.BaseScenarioTest): @base.safe_setup def setUpClass(cls): super(VolumesPagingTest, cls).setUpClass() + if 'amazon' in CONF.aws.ec2_url: + raise cls.skipException('Paging is broken in Amazon.') + zone = CONF.aws.aws_zone cls.ids = list() for dummy in xrange(0, cls.VOLUMES_COUNT): @@ -216,6 +226,9 @@ class SnapshotPagingTest(scenario_base.BaseScenarioTest): @base.safe_setup def setUpClass(cls): super(SnapshotPagingTest, cls).setUpClass() + if 'amazon' in CONF.aws.ec2_url: + raise cls.skipException('Paging is broken in Amazon.') + zone = CONF.aws.aws_zone data = cls.client.create_volume(Size=1, AvailabilityZone=zone) @@ -294,6 +307,8 @@ class InstancePagingTest(scenario_base.BaseScenarioTest): @base.safe_setup def setUpClass(cls): super(InstancePagingTest, cls).setUpClass() + if 'amazon' in CONF.aws.ec2_url: + raise cls.skipException('Paging is broken in Amazon.') if not CONF.aws.image_id: raise cls.skipException('aws image_id does not provided') @@ -339,7 +354,6 @@ class InstancePagingTest(scenario_base.BaseScenarioTest): self.assertEqual(max_results, self._count_instances(data)) def test_instances_paging(self): - real_count = 0 max_results = 5 kwargs = {'MaxResults': max_results} instances = set()