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

This commit is contained in:
Zuul 2021-03-02 20:11:37 +00:00 committed by Gerrit Code Review
commit fcef5a2b11
1 changed files with 49 additions and 24 deletions

View File

@ -18,6 +18,7 @@ import os
import subprocess import subprocess
import netaddr import netaddr
from oslo_log import log from oslo_log import log
from oslo_serialization import jsonutils as json from oslo_serialization import jsonutils as json
from oslo_utils import netutils from oslo_utils import netutils
@ -1098,6 +1099,8 @@ class NetworkScenarioTest(ScenarioTest):
:Keyword Arguments: :Keyword Arguments:
* *ip_version = ip version of the given network, * *ip_version = ip version of the given network,
use_default_subnetpool = default subnetpool to
manage IPv6 addresses range.
""" """
if not subnets_client: if not subnets_client:
@ -1120,44 +1123,66 @@ class NetworkScenarioTest(ScenarioTest):
network_id=ext_net['id'], cidr=cidr)['subnets']) network_id=ext_net['id'], cidr=cidr)['subnets'])
return len(tenant_subnets + external_subnets) != 0 return len(tenant_subnets + external_subnets) != 0
ip_version = kwargs.pop('ip_version', 4) def _make_create_subnet_request(namestart, network,
ip_version, subnets_client, **kwargs):
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
subnet = dict( subnet = dict(
name=data_utils.rand_name(namestart), name=data_utils.rand_name(namestart),
network_id=network['id'], network_id=network['id'],
project_id=network['project_id'], project_id=network['project_id'],
cidr=str_cidr,
ip_version=ip_version, ip_version=ip_version,
**kwargs **kwargs
) )
if ip_version == 6:
subnet['ipv6_address_mode'] = 'slaac'
subnet['ipv6_ra_mode'] = 'slaac'
try: try:
result = subnets_client.create_subnet(**subnet) return subnets_client.create_subnet(**subnet)
break
except lib_exc.Conflict as e: except lib_exc.Conflict as e:
is_overlapping_cidr = 'overlaps with another subnet' in str(e) if 'overlaps with another subnet' not in str(e):
if not is_overlapping_cidr:
raise 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') self.assertIsNotNone(result, 'Unable to allocate tenant network')
subnet = result['subnet'] 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, self.addCleanup(test_utils.call_and_ignore_notfound_exc,
subnets_client.delete_subnet, subnet['id']) subnets_client.delete_subnet, subnet['id'])