# Copyright 2014 OpenStack Foundation # All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. import time from oslo_log import log from tempest.lib.common.utils import data_utils from tempest.lib import decorators import testtools from ec2api.tests.functional import base from ec2api.tests.functional import config CONF = config.CONF LOG = log.getLogger(__name__) class InstanceAttributeTest(base.EC2TestCase): @decorators.idempotent_id('485107d8-f65f-4441-9558-2ff783e52e22') @testtools.skipUnless(CONF.aws.ebs_image_id, "EBS image id is not defined") def test_describe_instance_attributes(self): instance_id = self.run_instance(ImageId=CONF.aws.ebs_image_id) data = self.client.describe_instance_attribute( InstanceId=instance_id, Attribute='blockDeviceMapping') bdms = data.get('BlockDeviceMappings', []) self.assertNotEmpty(bdms) self.assertEqual(1, len(bdms)) self.assertIn('DeviceName', bdms[0]) self.assertIn('Ebs', bdms[0]) data = self.client.describe_instance_attribute( InstanceId=instance_id, Attribute='disableApiTermination') self.assertIn('DisableApiTermination', data) self.assertIn('Value', data['DisableApiTermination']) self.assertFalse(data['DisableApiTermination']['Value']) data = self.client.describe_instance_attribute( InstanceId=instance_id, Attribute='groupSet') 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')) data = self.client.describe_instance_attribute( InstanceId=instance_id, Attribute='instanceType') self.assertIn('InstanceType', data) self.assertIn('Value', data['InstanceType']) self.assertEqual(CONF.aws.instance_type, data['InstanceType']['Value']) data = self.client.describe_instance_attribute( InstanceId=instance_id, Attribute='kernel') self.assertIn('KernelId', data) data = self.client.describe_instance_attribute( InstanceId=instance_id, Attribute='ramdisk') self.assertIn('RamdiskId', data) data = self.client.describe_instance_attribute( InstanceId=instance_id, Attribute='rootDeviceName') self.assertIn('RootDeviceName', data) self.assertIn('Value', data['RootDeviceName']) self.assertTrue(data['RootDeviceName']['Value']) self.client.terminate_instances(InstanceIds=[instance_id]) self.get_instance_waiter().wait_delete(instance_id) @decorators.idempotent_id('391f6645-d014-42c7-a727-f3a6e7a13a4c') @testtools.skipUnless(CONF.aws.image_id, "image id is not defined") def test_disable_api_termination_attribute(self): instance_id = self.run_instance(DisableApiTermination=True) res_clean = self.addResourceCleanUp( self.client.modify_instance_attribute, InstanceId=instance_id, DisableApiTermination={'Value': False}) data = self.client.describe_instance_attribute( InstanceId=instance_id, Attribute='disableApiTermination') self.assertIn('DisableApiTermination', data) self.assertIn('Value', data['DisableApiTermination']) self.assertTrue(data['DisableApiTermination']['Value']) data = self.client.modify_instance_attribute(InstanceId=instance_id, Attribute='disableApiTermination', Value='False') data = self.client.describe_instance_attribute( InstanceId=instance_id, Attribute='disableApiTermination') self.assertFalse(data['DisableApiTermination']['Value']) data = self.client.modify_instance_attribute(InstanceId=instance_id, Attribute='disableApiTermination', Value='True') data = self.client.describe_instance_attribute( InstanceId=instance_id, Attribute='disableApiTermination') self.assertTrue(data['DisableApiTermination']['Value']) self.assertRaises('OperationNotPermitted', self.client.terminate_instances, InstanceIds=[instance_id]) data = self.client.modify_instance_attribute(InstanceId=instance_id, DisableApiTermination={'Value': False}) data = self.client.describe_instance_attribute( InstanceId=instance_id, Attribute='disableApiTermination') self.assertFalse(data['DisableApiTermination']['Value']) self.client.terminate_instances(InstanceIds=[instance_id]) self.cancelResourceCleanUp(res_clean) self.get_instance_waiter().wait_delete(instance_id) @decorators.idempotent_id('50671a21-99bf-4514-acb0-97617f92e868') @testtools.skipUnless(CONF.aws.image_id, "image id is not defined") def test_instance_attributes_negative(self): instance_id = self.run_instance() self.assertRaises('InvalidParameterValue', self.client.describe_instance_attribute, InstanceId=instance_id, Attribute='fake_attribute') self.assertRaises('InvalidInstanceID.NotFound', self.client.describe_instance_attribute, InstanceId='i-0', Attribute='disableApiTermination') 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, InstanceId=instance_id, Attribute='fake_attribute') self.assertRaises('MissingParameter', self.client.modify_instance_attribute, InstanceId=instance_id, Attribute='disableApiTermination') self.assertRaises('InvalidParameterCombination', self.client.modify_instance_attribute, InstanceId=instance_id) self.assertRaises('InvalidParameterCombination', self.client.modify_instance_attribute, InstanceId=instance_id, Attribute='disableApiTermination', Value='True', DisableApiTermination={'Value': False}) 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']) 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, InstanceId=instance_id, Attribute='fake_attribute') self.assertRaises('InvalidParameterValue', self.client.reset_instance_attribute, InstanceId=instance_id, Attribute='disableApiTermination') self.assertRaises('InvalidParameterValue', self.client.reset_instance_attribute, InstanceId='i-0', Attribute='disableApiTermination') self.assertRaises('InvalidParameterValue', self.client.reset_instance_attribute, InstanceId=instance_id, Attribute='groupSet') self.assertRaises('InvalidParameterValue', self.client.reset_instance_attribute, InstanceId=instance_id, Attribute='instanceType') 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, InstanceId=instance_id, Attribute='instanceType', Value=CONF.aws.instance_type) self.assertRaises('IncorrectInstanceState', self.client.modify_instance_attribute, InstanceId=instance_id, InstanceType={'Value': CONF.aws.instance_type}) self.client.terminate_instances(InstanceIds=[instance_id]) self.get_instance_waiter().wait_delete(instance_id) @base.skip_without_vpc() @decorators.idempotent_id('6fd2c8eb-f7f9-420d-a8ae-5d5af3a49a35') @testtools.skipUnless(CONF.aws.image_id, "image id is not defined") def test_attributes_for_multiple_interfaces_negative(self): vpc_id, subnet_id = self.create_vpc_and_subnet('10.30.0.0/24') name = data_utils.rand_name('sgName') desc = data_utils.rand_name('sgDesc') data = self.client.create_security_group(VpcId=vpc_id, GroupName=name, Description=desc) group_id = data['GroupId'] self.addResourceCleanUp(self.client.delete_security_group, GroupId=group_id) time.sleep(2) data = self.client.create_network_interface(SubnetId=subnet_id, Groups=[group_id]) ni_id2 = data['NetworkInterface']['NetworkInterfaceId'] self.addResourceCleanUp(self.client.delete_network_interface, NetworkInterfaceId=ni_id2) self.get_network_interface_waiter().wait_available(ni_id2) instance_id = self.run_instance(SubnetId=subnet_id) kwargs = { 'DeviceIndex': 2, 'InstanceId': instance_id, 'NetworkInterfaceId': ni_id2 } data = self.client.attach_network_interface(*[], **kwargs) self.assertRaises('InvalidInstanceID', self.client.describe_instance_attribute, InstanceId=instance_id, Attribute='groupSet') self.assertRaises('InvalidInstanceID', self.client.modify_instance_attribute, InstanceId=instance_id, Groups=['sg-0']) self.assertRaises('InvalidInstanceID', self.client.describe_instance_attribute, InstanceId=instance_id, Attribute='sourceDestCheck') self.assertRaises('InvalidInstanceID', self.client.modify_instance_attribute, InstanceId=instance_id, SourceDestCheck={'Value': False}) self.assertRaises('InvalidInstanceID', self.client.reset_instance_attribute, InstanceId=instance_id, Attribute='sourceDestCheck') self.client.terminate_instances(InstanceIds=[instance_id]) self.get_instance_waiter().wait_delete(instance_id) @base.skip_without_vpc() @decorators.idempotent_id('da26cc0d-6c2d-4638-97f1-1abfae8f00b5') @testtools.skipUnless(CONF.aws.image_id, "image id is not defined") def test_group_set_attribute(self): vpc_id, subnet_id = self.create_vpc_and_subnet('10.30.0.0/24') instance_id = self.run_instance(SubnetId=subnet_id) data = self.client.describe_instance_attribute( InstanceId=instance_id, Attribute='groupSet') self.assertIn('Groups', data) self.assertEqual(1, len(data['Groups'])) default_group_id = data['Groups'][0]['GroupId'] name = data_utils.rand_name('sgName') desc = data_utils.rand_name('sgDesc') data = self.client.create_security_group(VpcId=vpc_id, GroupName=name, Description=desc) group_id = data['GroupId'] self.addResourceCleanUp(self.client.delete_security_group, GroupId=group_id) time.sleep(2) try: data = self.client.modify_instance_attribute( InstanceId=instance_id, Groups=[group_id]) data = self.client.describe_instance_attribute( InstanceId=instance_id, Attribute='groupSet') self.assertIn('Groups', data) self.assertEqual(1, len(data['Groups'])) self.assertNotEqual(default_group_id, data['Groups'][0]['GroupId']) self.assertRaises('DependencyViolation', self.client.delete_security_group, GroupId=group_id) finally: self.client.modify_instance_attribute(InstanceId=instance_id, Groups=[default_group_id]) data = self.client.describe_instance_attribute( InstanceId=instance_id, Attribute='groupSet') self.assertIn('Groups', data) self.assertEqual(1, len(data['Groups'])) self.assertEqual(default_group_id, data['Groups'][0]['GroupId']) self.client.terminate_instances(InstanceIds=[instance_id]) self.get_instance_waiter().wait_delete(instance_id) @base.skip_without_vpc() @decorators.idempotent_id('8e7b37b5-1f2d-4c38-b51e-dcd0e726edb3') @testtools.skipUnless(CONF.aws.image_id, "image id is not defined") def test_source_dest_check_attribute(self): vpc_id, subnet_id = self.create_vpc_and_subnet('10.30.0.0/24') instance_id = self.run_instance(SubnetId=subnet_id) def do_check(value): data = self.client.describe_instance_attribute( InstanceId=instance_id, Attribute='sourceDestCheck') self.assertIn('SourceDestCheck', data) self.assertEqual(value, data['SourceDestCheck'].get('Value')) do_check(True) self.client.modify_instance_attribute( InstanceId=instance_id, Attribute='sourceDestCheck', Value='False') do_check(False) self.client.reset_instance_attribute( InstanceId=instance_id, Attribute='sourceDestCheck') do_check(True) self.client.modify_instance_attribute( InstanceId=instance_id, Attribute='sourceDestCheck', Value='False') do_check(False) self.client.terminate_instances(InstanceIds=[instance_id]) self.get_instance_waiter().wait_delete(instance_id) @decorators.idempotent_id('a2640ab1-6aaa-4626-9f23-4aba52e3b88a') @testtools.skipUnless(CONF.aws.ebs_image_id, "EBS image id is not defined") @testtools.skipUnless(CONF.aws.instance_type_alt, "Alternative instance type is not defined") @testtools.skipUnless(CONF.aws.instance_type_alt != CONF.aws.instance_type, "Alternative instance type is not defined") def test_instance_type_attribute(self): instance_id = self.run_instance(ImageId=CONF.aws.ebs_image_id) self.client.stop_instances(InstanceIds=[instance_id]) self.get_instance_waiter().wait_available(instance_id, final_set=('stopped')) instance = self.get_instance(instance_id) self.assertEqual(CONF.aws.instance_type, instance['InstanceType']) self.client.modify_instance_attribute( InstanceId=instance_id, Attribute='instanceType', Value=CONF.aws.instance_type) instance = self.get_instance(instance_id) self.assertEqual(CONF.aws.instance_type, instance['InstanceType']) self.client.modify_instance_attribute( InstanceId=instance_id, InstanceType={'Value': CONF.aws.instance_type_alt}) instance = self.get_instance(instance_id) self.assertEqual(CONF.aws.instance_type_alt, instance['InstanceType']) self.client.start_instances(InstanceIds=[instance_id]) self.get_instance_waiter().wait_available(instance_id, final_set=('running')) instance = self.get_instance(instance_id) self.assertEqual(CONF.aws.instance_type_alt, instance['InstanceType']) self.client.terminate_instances(InstanceIds=[instance_id]) self.get_instance_waiter().wait_delete(instance_id)