Implementation of create_subnet() varies in manila-tempest-plugin

There is need of stable implementation of create_subnet().

For the stable implementation of create_subnet() following parameters have
been added:

1. Condition to check empty str_cidr
2. More attributes in case of ipv6
3. Usage of default_subnet_pool

Implements: blueprint tempest-scenario-manager-stable
Signed-off by: Soniya Vyas<svyas@redhat.com>

Change-Id: I855d07272293d209145598e27e82c7837bf0aecb
This commit is contained in:
Soniya Vyas 2020-12-10 19:07:23 +05:30
parent 85e618faf3
commit 795ef25b72
1 changed files with 49 additions and 24 deletions

View File

@ -18,6 +18,7 @@ import os
import subprocess
import netaddr
from oslo_log import log
from oslo_serialization import jsonutils as json
from oslo_utils import netutils
@ -1098,6 +1099,8 @@ class NetworkScenarioTest(ScenarioTest):
:Keyword Arguments:
* *ip_version = ip version of the given network,
use_default_subnetpool = default subnetpool to
manage IPv6 addresses range.
"""
if not subnets_client:
@ -1120,44 +1123,66 @@ class NetworkScenarioTest(ScenarioTest):
network_id=ext_net['id'], cidr=cidr)['subnets'])
return len(tenant_subnets + external_subnets) != 0
ip_version = kwargs.pop('ip_version', 4)
if ip_version == 6:
tenant_cidr = netaddr.IPNetwork(
CONF.network.project_network_v6_cidr)
num_bits = CONF.network.project_network_v6_mask_bits
else:
tenant_cidr = netaddr.IPNetwork(CONF.network.project_network_cidr)
num_bits = CONF.network.project_network_mask_bits
result = None
str_cidr = None
# Repeatedly attempt subnet creation with sequential cidr
# blocks until an unallocated block is found.
for subnet_cidr in tenant_cidr.subnet(num_bits):
str_cidr = str(subnet_cidr)
if cidr_in_use(str_cidr, project_id=network['project_id']):
continue
def _make_create_subnet_request(namestart, network,
ip_version, subnets_client, **kwargs):
subnet = dict(
name=data_utils.rand_name(namestart),
network_id=network['id'],
project_id=network['project_id'],
cidr=str_cidr,
ip_version=ip_version,
**kwargs
)
if ip_version == 6:
subnet['ipv6_address_mode'] = 'slaac'
subnet['ipv6_ra_mode'] = 'slaac'
try:
result = subnets_client.create_subnet(**subnet)
break
return subnets_client.create_subnet(**subnet)
except lib_exc.Conflict as e:
is_overlapping_cidr = 'overlaps with another subnet' in str(e)
if not is_overlapping_cidr:
if 'overlaps with another subnet' not in str(e):
raise
result = None
str_cidr = None
use_default_subnetpool = kwargs.get('use_default_subnetpool', False)
ip_version = kwargs.pop('ip_version', 4)
if not use_default_subnetpool:
if ip_version == 6:
tenant_cidr = netaddr.IPNetwork(
CONF.network.project_network_v6_cidr)
num_bits = CONF.network.project_network_v6_mask_bits
else:
tenant_cidr = netaddr.IPNetwork(
CONF.network.project_network_cidr)
num_bits = CONF.network.project_network_mask_bits
# Repeatedly attempt subnet creation with sequential cidr
# blocks until an unallocated block is found.
for subnet_cidr in tenant_cidr.subnet(num_bits):
str_cidr = str(subnet_cidr)
if cidr_in_use(str_cidr, project_id=network['project_id']):
continue
result = _make_create_subnet_request(
namestart, network, ip_version, subnets_client,
cidr=str_cidr, **kwargs)
if result is not None:
break
else:
result = _make_create_subnet_request(
namestart, network, ip_version, subnets_client,
**kwargs)
self.assertIsNotNone(result, 'Unable to allocate tenant network')
subnet = result['subnet']
self.assertEqual(subnet['cidr'], str_cidr)
if str_cidr is not None:
self.assertEqual(subnet['cidr'], str_cidr)
self.addCleanup(test_utils.call_and_ignore_notfound_exc,
subnets_client.delete_subnet, subnet['id'])