Create subnet without gateway and explicit IP ver

Now it's impossible to create subnet without gateway in network
tests. This patch allows you to set gateway explicitly to None.
Backward compatibility is supported: by default it creates
subnet with default gateway as before. Also it adds possibility
to create subnet with specific IP version when you need to create
two subnets in one tenant of different IP version ("dual-stack").
Fixed attributes test for new requirements and added 2 anothers.

Change-Id: I7aca5e07be436f20cba90339785b46182d97fead
This commit is contained in:
Sergey Shnaidman 2014-09-02 22:05:00 +04:00
parent acba551078
commit 18cf59700b
2 changed files with 64 additions and 12 deletions

View File

@ -152,33 +152,35 @@ class BaseNetworkTest(tempest.test.BaseTestCase):
return network
@classmethod
def create_subnet(cls, network, gateway=None, cidr=None, mask_bits=None,
**kwargs):
def create_subnet(cls, network, gateway='', cidr=None, mask_bits=None,
ip_version=None, **kwargs):
"""Wrapper utility that returns a test subnet."""
# The cidr and mask_bits depend on the ip version.
if cls._ip_version == 4:
ip_version = ip_version if ip_version is not None else cls._ip_version
gateway_not_set = gateway == ''
if ip_version == 4:
cidr = cidr or netaddr.IPNetwork(CONF.network.tenant_network_cidr)
mask_bits = mask_bits or CONF.network.tenant_network_mask_bits
elif cls._ip_version == 6:
elif ip_version == 6:
cidr = (
cidr or netaddr.IPNetwork(CONF.network.tenant_network_v6_cidr))
mask_bits = mask_bits or CONF.network.tenant_network_v6_mask_bits
# Find a cidr that is not in use yet and create a subnet with it
for subnet_cidr in cidr.subnet(mask_bits):
if not gateway:
gateway = str(netaddr.IPAddress(subnet_cidr) + 1)
if gateway_not_set:
gateway_ip = str(netaddr.IPAddress(subnet_cidr) + 1)
else:
gateway_ip = gateway
try:
resp, body = cls.client.create_subnet(
network_id=network['id'],
cidr=str(subnet_cidr),
ip_version=cls._ip_version,
gateway_ip=gateway,
ip_version=ip_version,
gateway_ip=gateway_ip,
**kwargs)
break
except exceptions.BadRequest as e:
is_overlapping_cidr = 'overlaps with another subnet' in str(e)
# Unset gateway value if there is an overlapping subnet
gateway = None
if not is_overlapping_cidr:
raise
else:

View File

@ -279,6 +279,10 @@ class NetworksTestJSON(base.BaseNetworkTest):
# it from the list.
self.subnets.pop()
@test.attr(type='smoke')
def test_create_delete_subnet_without_gateway(self):
self._create_verify_delete_subnet()
@test.attr(type='smoke')
def test_create_delete_subnet_with_gw(self):
self._create_verify_delete_subnet(
@ -492,7 +496,7 @@ class NetworksIpV6TestJSON(NetworksTestJSON):
self.assertEqual(subnet['gateway_ip'], gateway)
@test.attr(type='smoke')
def test_create_delete_subnet_without_gw(self):
def test_create_delete_subnet_with_default_gw(self):
net = netaddr.IPNetwork(CONF.network.tenant_network_v6_cidr)
gateway_ip = str(netaddr.IPAddress(net.first + 1))
name = data_utils.rand_name('network-')
@ -501,16 +505,62 @@ class NetworksIpV6TestJSON(NetworksTestJSON):
# Verifies Subnet GW in IPv6
self.assertEqual(subnet['gateway_ip'], gateway_ip)
@test.attr(type='smoke')
def test_create_list_subnet_with_no_gw64_one_network(self):
name = data_utils.rand_name('network-')
network = self.create_network(name)
ipv6_gateway = self.subnet_dict(['gateway'])['gateway']
subnet1 = self.create_subnet(network,
ip_version=6,
gateway=ipv6_gateway)
self.assertEqual(netaddr.IPNetwork(subnet1['cidr']).version, 6,
'The created subnet is not IPv6')
subnet2 = self.create_subnet(network,
gateway=None,
ip_version=4)
self.assertEqual(netaddr.IPNetwork(subnet2['cidr']).version, 4,
'The created subnet is not IPv4')
# Verifies Subnet GW is set in IPv6
self.assertEqual(subnet1['gateway_ip'], ipv6_gateway)
# Verifies Subnet GW is None in IPv4
self.assertEqual(subnet2['gateway_ip'], None)
# Verifies all 2 subnets in the same network
_, body = self.client.list_subnets()
subnets = [sub['id'] for sub in body['subnets']
if sub['network_id'] == network['id']]
test_subnet_ids = [sub['id'] for sub in (subnet1, subnet2)]
self.assertItemsEqual(subnets,
test_subnet_ids,
'Subnet are not in the same network')
@testtools.skipUnless(CONF.network_feature_enabled.ipv6_subnet_attributes,
"IPv6 extended attributes for subnets not "
"available")
@test.attr(type='smoke')
def test_create_delete_subnet_with_v6_attributes(self):
def test_create_delete_subnet_with_v6_attributes_stateful(self):
self._create_verify_delete_subnet(
gateway=self._subnet_data[self._ip_version]['gateway'],
ipv6_ra_mode='dhcpv6-stateful',
ipv6_address_mode='dhcpv6-stateful')
@testtools.skipUnless(CONF.network_feature_enabled.ipv6_subnet_attributes,
"IPv6 extended attributes for subnets not "
"available")
@test.attr(type='smoke')
def test_create_delete_subnet_with_v6_attributes_slaac(self):
self._create_verify_delete_subnet(
ipv6_ra_mode='slaac',
ipv6_address_mode='slaac')
@testtools.skipUnless(CONF.network_feature_enabled.ipv6_subnet_attributes,
"IPv6 extended attributes for subnets not "
"available")
@test.attr(type='smoke')
def test_create_delete_subnet_with_v6_attributes_stateless(self):
self._create_verify_delete_subnet(
ipv6_ra_mode='dhcpv6-stateless',
ipv6_address_mode='dhcpv6-stateless')
class NetworksIpV6TestXML(NetworksIpV6TestJSON):
_interface = 'xml'