ec2-api/ec2api/tests/functional/api/test_addresses.py
maliki 2752e445ee Add tempest test UUID to all functional tests.
This patch adds a tempest decorator of UUID for each test in
the functional tests tree. .
This helps in discovering tests by their UUID using tempest
CLI and the decorator format is:
@decorators.idempotent_id('12345678-1234-1234-1234-123456789abc')

Change-Id: Ib4a4694600b1a28be6c23c73fa078960ce4efdec
2016-11-07 21:26:29 -08:00

437 lines
17 KiB
Python

# 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
import botocore.exceptions
from oslo_log import log
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 AddressTest(base.EC2TestCase):
@base.skip_without_vpc()
@decorators.idempotent_id('218a4b6b-c3a9-44b0-8148-4bd0bc36bd7d')
def test_create_delete_vpc_address(self):
kwargs = {
'Domain': 'vpc',
}
data = self.client.allocate_address(*[], **kwargs)
id = data['AllocationId']
res_clean = self.addResourceCleanUp(self.client.release_address,
AllocationId=id)
self.assertEqual('vpc', data['Domain'])
data = self.client.release_address(AllocationId=id)
self.cancelResourceCleanUp(res_clean)
@base.skip_without_ec2()
@decorators.idempotent_id('285b8b4e-5aef-4e7f-be9e-37e6475be21b')
def test_create_delete_standard_address(self):
data = self.client.allocate_address()
ip = data['PublicIp']
res_clean = self.addResourceCleanUp(self.client.release_address,
PublicIp=ip)
data = self.client.release_address(PublicIp=ip)
self.cancelResourceCleanUp(res_clean)
@base.skip_without_vpc()
@decorators.idempotent_id('5be3ad8d-b071-472b-b92a-7199c82334a2')
def test_invalid_delete_vpc_address(self):
kwargs = {
'Domain': 'vpc',
}
data = self.client.allocate_address(*[], **kwargs)
ip = data['PublicIp']
id = data['AllocationId']
res_clean = self.addResourceCleanUp(self.client.release_address,
AllocationId=id)
self.assertEqual('vpc', data['Domain'])
self.assertRaises('InvalidParameterCombination',
self.client.release_address,
PublicIp=ip, AllocationId=id)
self.assertRaises('InvalidParameterValue',
self.client.release_address,
PublicIp=ip)
data = self.client.release_address(AllocationId=id)
self.cancelResourceCleanUp(res_clean)
if CONF.aws.run_incompatible_tests:
self.assertRaises('AuthFailure',
self.client.release_address,
PublicIp=ip)
self.assertRaises('InvalidAllocationID.NotFound',
self.client.release_address,
AllocationId=id)
kwargs = {
"AllocationId": 'eipalloc-00000000',
}
self.assertRaises('InvalidAllocationID.NotFound',
self.client.release_address,
**kwargs)
if CONF.aws.run_incompatible_tests:
self.assertRaises('InvalidParameterValue',
self.client.release_address,
PublicIp='ip')
@decorators.idempotent_id('e8171637-9ccd-471a-97da-c78a36ba3c4b')
def test_invalid_create_address(self):
kwargs = {
'Domain': 'invalid',
}
try:
data = self.client.allocate_address(*[], **kwargs)
allocation_id = data.get('AllocationId')
if allocation_id:
self.client.release_address(AllocationId=allocation_id)
else:
public_ip = data.get('PublicIp')
self.client.release_address(PublicIp=public_ip)
except botocore.exceptions.ClientError as e:
self.assertEqual('InvalidParameterValue',
e.response['Error']['Code'])
@base.skip_without_vpc()
@decorators.idempotent_id('b0d0b498-1fe2-479e-995c-80ace2f339a7')
def test_describe_vpc_addresses(self):
kwargs = {
'Domain': 'vpc',
}
data = self.client.allocate_address(*[], **kwargs)
ip = data['PublicIp']
id = data['AllocationId']
res_clean = self.addResourceCleanUp(self.client.release_address,
AllocationId=id)
data = self.client.describe_addresses(*[], **{})
for address in data['Addresses']:
if address.get('AllocationId') == id:
self.assertEqual('vpc', address['Domain'])
self.assertEqual(ip, address['PublicIp'])
break
else:
self.fail('Created address could not be found')
kwargs = {
'PublicIps': [ip],
}
data = self.client.describe_addresses(*[], **kwargs)
self.assertEqual(1, len(data['Addresses']))
self.assertEqual(id, data['Addresses'][0]['AllocationId'])
kwargs = {
'AllocationIds': [id],
}
data = self.client.describe_addresses(*[], **kwargs)
self.assertEqual(1, len(data['Addresses']))
self.assertEqual(ip, data['Addresses'][0]['PublicIp'])
kwargs = {
'PublicIps': ['invalidIp'],
}
self.assertRaises('InvalidParameterValue',
self.client.describe_addresses,
**kwargs)
kwargs = {
'AllocationIds': ['eipalloc-00000000'],
}
self.assertRaises('InvalidAllocationID.NotFound',
self.client.describe_addresses,
**kwargs)
kwargs = {
'Domain': 'vpc',
}
data = self.client.allocate_address(*[], **kwargs)
id2 = data['AllocationId']
res_clean2 = self.addResourceCleanUp(self.client.release_address,
AllocationId=id2)
kwargs = {
'PublicIps': [ip],
'AllocationIds': [id2],
}
data = self.client.describe_addresses(*[], **kwargs)
self.assertEqual(2, len(data['Addresses']))
# NOTE(andrey-mp): wait abit before releasing
time.sleep(3)
self.client.release_address(AllocationId=id)
self.cancelResourceCleanUp(res_clean)
self.client.release_address(AllocationId=id2)
self.cancelResourceCleanUp(res_clean2)
@base.skip_without_ec2()
@decorators.idempotent_id('a5c09f47-3be3-4d46-b59d-25195d67e6d5')
def test_describe_standard_addresses(self):
data = self.client.allocate_address(*[], **{})
ip = data['PublicIp']
res_clean = self.addResourceCleanUp(self.client.release_address,
PublicIp=ip)
data = self.client.describe_addresses(*[], **{})
for address in data['Addresses']:
if address['PublicIp'] == ip:
self.assertEqual('standard', address['Domain'])
break
else:
self.fail('Created address could not be found')
kwargs = {
'PublicIps': [ip],
}
data = self.client.describe_addresses(*[], **kwargs)
self.assertEqual(1, len(data['Addresses']))
self.assertEqual(ip, data['Addresses'][0]['PublicIp'])
kwargs = {
'PublicIps': ['invalidIp'],
}
self.assertRaises('InvalidParameterValue',
self.client.describe_addresses,
PublicIps=['invalidIp'])
# NOTE(andrey-mp): wait abit before releasing
time.sleep(3)
self.client.release_address(PublicIp=ip)
self.cancelResourceCleanUp(res_clean)
@base.skip_without_vpc()
@decorators.idempotent_id('6f154e48-f260-4d8d-b1d1-a1cf174f58fa')
@testtools.skipUnless(CONF.aws.image_id, "image id is not defined")
def test_associate_disassociate_vpc_addresses(self):
aws_zone = CONF.aws.aws_zone
base_net = '10.3.0.0'
data = self.client.create_vpc(CidrBlock=base_net + '/20')
vpc_id = data['Vpc']['VpcId']
clean_vpc = self.addResourceCleanUp(self.client.delete_vpc,
VpcId=vpc_id)
self.get_vpc_waiter().wait_available(vpc_id)
cidr = base_net + '/24'
data = self.client.create_subnet(VpcId=vpc_id, CidrBlock=cidr,
AvailabilityZone=aws_zone)
subnet_id = data['Subnet']['SubnetId']
clean_subnet = self.addResourceCleanUp(self.client.delete_subnet,
SubnetId=subnet_id)
instance_id = self.run_instance(SubnetId=subnet_id)
data = self.client.allocate_address(Domain='vpc')
alloc_id = data['AllocationId']
clean_a = self.addResourceCleanUp(self.client.release_address,
AllocationId=alloc_id)
self.assertRaises('Gateway.NotAttached',
self.client.associate_address,
InstanceId=instance_id, AllocationId=alloc_id)
# Create internet gateway and try to associate again
data = self.client.create_internet_gateway()
gw_id = data['InternetGateway']['InternetGatewayId']
clean_ig = self.addResourceCleanUp(self.client.delete_internet_gateway,
InternetGatewayId=gw_id)
data = self.client.attach_internet_gateway(VpcId=vpc_id,
InternetGatewayId=gw_id)
clean_aig = self.addResourceCleanUp(
self.client.detach_internet_gateway,
VpcId=vpc_id,
InternetGatewayId=gw_id)
self.prepare_route(vpc_id, gw_id)
data = self.client.associate_address(InstanceId=instance_id,
AllocationId=alloc_id)
assoc_id = data['AssociationId']
clean_aa = self.addResourceCleanUp(self.client.disassociate_address,
AssociationId=assoc_id)
self.get_address_assoc_waiter().wait_available(
{'AllocationId': alloc_id})
kwargs = {
'AllocationIds': [alloc_id],
}
data = self.client.describe_addresses(*[], **kwargs)
self.assertEqual(instance_id, data['Addresses'][0]['InstanceId'])
data = self.client.disassociate_address(AssociationId=assoc_id)
self.cancelResourceCleanUp(clean_aa)
self.get_address_assoc_waiter().wait_delete({'AllocationId': alloc_id})
# NOTE(andrey-mp): cleanup
time.sleep(3)
self.client.detach_internet_gateway(VpcId=vpc_id,
InternetGatewayId=gw_id)
self.cancelResourceCleanUp(clean_aig)
self.client.delete_internet_gateway(InternetGatewayId=gw_id)
self.cancelResourceCleanUp(clean_ig)
self.client.release_address(AllocationId=alloc_id)
self.cancelResourceCleanUp(clean_a)
self.client.terminate_instances(InstanceIds=[instance_id])
self.get_instance_waiter().wait_delete(instance_id)
self.client.delete_subnet(SubnetId=subnet_id)
self.cancelResourceCleanUp(clean_subnet)
self.get_subnet_waiter().wait_delete(subnet_id)
self.client.delete_vpc(VpcId=vpc_id)
self.cancelResourceCleanUp(clean_vpc)
self.get_vpc_waiter().wait_delete(vpc_id)
@decorators.idempotent_id('4aaf01d2-ade5-4e8b-b24a-ab22448b3236')
@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()
data = self.client.allocate_address(*[], **{})
ip = data['PublicIp']
clean_a = self.addResourceCleanUp(self.client.release_address,
PublicIp=ip)
data = self.client.associate_address(InstanceId=instance_id,
PublicIp=ip)
clean_aa = self.addResourceCleanUp(self.client.disassociate_address,
PublicIp=ip)
self.get_address_assoc_waiter().wait_available({'PublicIp': ip})
kwargs = {
'PublicIps': [ip],
}
data = self.client.describe_addresses(*[], **kwargs)
self.assertEqual(instance_id, data['Addresses'][0]['InstanceId'])
data = self.client.disassociate_address(PublicIp=ip)
self.cancelResourceCleanUp(clean_aa)
self.get_address_assoc_waiter().wait_delete({'PublicIp': ip})
time.sleep(3)
data = self.client.release_address(PublicIp=ip)
self.cancelResourceCleanUp(clean_a)
data = self.client.terminate_instances(InstanceIds=[instance_id])
self.get_instance_waiter().wait_delete(instance_id)
@base.skip_without_vpc()
@decorators.idempotent_id('3c0ab7f5-ee9c-4966-8d43-e89f5520f245')
def test_disassociate_not_associated_vpc_addresses(self):
aws_zone = CONF.aws.aws_zone
base_net = '10.3.0.0'
data = self.client.create_vpc(CidrBlock=base_net + '/20')
vpc_id = data['Vpc']['VpcId']
clean_vpc = self.addResourceCleanUp(self.client.delete_vpc,
VpcId=vpc_id)
self.get_vpc_waiter().wait_available(vpc_id)
cidr = base_net + '/24'
data = self.client.create_subnet(VpcId=vpc_id, CidrBlock=cidr,
AvailabilityZone=aws_zone)
subnet_id = data['Subnet']['SubnetId']
clean_subnet = self.addResourceCleanUp(self.client.delete_subnet,
SubnetId=subnet_id)
data = self.client.allocate_address(Domain='vpc')
alloc_id = data['AllocationId']
ip = data['PublicIp']
clean_a = self.addResourceCleanUp(self.client.release_address,
AllocationId=alloc_id)
assoc_id = 'eipassoc-00000001'
self.assertRaises('InvalidAssociationID.NotFound',
self.client.disassociate_address,
AssociationId=assoc_id)
self.assertRaises('InvalidParameterValue',
self.client.disassociate_address,
PublicIp=ip)
self.client.release_address(AllocationId=alloc_id)
self.cancelResourceCleanUp(clean_a)
self.client.delete_subnet(SubnetId=subnet_id)
self.cancelResourceCleanUp(clean_subnet)
self.get_subnet_waiter().wait_delete(subnet_id)
self.client.delete_vpc(VpcId=vpc_id)
self.cancelResourceCleanUp(clean_vpc)
self.get_vpc_waiter().wait_delete(vpc_id)
@base.skip_without_ec2()
@decorators.idempotent_id('a70babef-18ec-4340-a3a2-63388cfc3cb5')
def test_disassociate_not_associated_standard_addresses(self):
data = self.client.allocate_address(Domain='standard')
ip = data['PublicIp']
clean_a = self.addResourceCleanUp(self.client.release_address,
PublicIp=ip)
data = self.client.disassociate_address(PublicIp=ip)
data = self.client.release_address(PublicIp=ip)
self.cancelResourceCleanUp(clean_a)
@base.skip_without_vpc()
@decorators.idempotent_id('91b971f5-2674-478e-84df-115fef506c5b')
@testtools.skipUnless(CONF.aws.run_incompatible_tests,
'preliminary address association is not supported')
def test_preliminary_associate_address(self):
# NOTE(ft): AWS can associate an address to a subnet IP if the subnet
# has no internet access
vpc_id, subnet_id = self.create_vpc_and_subnet('10.3.0.0/20')
self.create_and_attach_internet_gateway(vpc_id)
data = self.client.allocate_address(Domain='vpc')
alloc_id = data['AllocationId']
self.addResourceCleanUp(self.client.release_address,
AllocationId=alloc_id)
data = self.client.create_network_interface(SubnetId=subnet_id)
ni_id = data['NetworkInterface']['NetworkInterfaceId']
self.addResourceCleanUp(self.client.delete_network_interface,
NetworkInterfaceId=ni_id)
self.get_network_interface_waiter().wait_available(ni_id)
data = self.client.associate_address(
AllocationId=alloc_id, NetworkInterfaceId=ni_id)
assoc_id = data['AssociationId']
self.addResourceCleanUp(self.client.disassociate_address,
AssociationId=assoc_id)