Make network resource creation in isolation configurable

This commit adds a helper method to the base test class
set_network_resources(). This method should be called before the super
call in setUpClass and lets you specify which network resources
are created for a test class in tenant isolation. This is useful for
fine tuning each test class so that only the resources that are needed
get created.

Change-Id: I8f66534dbe3f48552ed6cd238ad237c46d7ee60c
This commit is contained in:
Matthew Treinish
2014-01-15 10:26:07 -05:00
parent 6cbd7f5f9c
commit 9f756a0815
5 changed files with 89 additions and 35 deletions

View File

@@ -34,7 +34,8 @@ class BaseImageTest(tempest.test.BaseTestCase):
super(BaseImageTest, cls).setUpClass()
cls.created_images = []
cls._interface = 'json'
cls.isolated_creds = isolated_creds.IsolatedCreds(cls.__name__)
cls.isolated_creds = isolated_creds.IsolatedCreds(
cls.__name__, network_resources=cls.network_resources)
if not cls.config.service_available.glance:
skip_msg = ("%s skipped as glance is not available" % cls.__name__)
raise cls.skipException(skip_msg)

View File

@@ -32,7 +32,8 @@ class BaseObjectTest(tempest.test.BaseTestCase):
if not cls.config.service_available.swift:
skip_msg = ("%s skipped as swift is not available" % cls.__name__)
raise cls.skipException(skip_msg)
cls.isolated_creds = isolated_creds.IsolatedCreds(cls.__name__)
cls.isolated_creds = isolated_creds.IsolatedCreds(
cls.__name__, network_resources=cls.network_resources)
if cls.config.compute.allow_tenant_isolation:
# Get isolated creds for normal user
creds = cls.isolated_creds.get_primary_creds()

View File

@@ -32,7 +32,8 @@ LOG = logging.getLogger(__name__)
class IsolatedCreds(object):
def __init__(self, name, tempest_client=True, interface='json',
password='pass'):
password='pass', network_resources=None):
self.network_resources = network_resources
self.isolated_creds = {}
self.isolated_net_resources = {}
self.ports = []
@@ -198,15 +199,33 @@ class IsolatedCreds(object):
network = None
subnet = None
router = None
# Make sure settings
if self.network_resources:
if self.network_resources['router']:
if (not self.network_resources['subnet'] or
not self.network_resources['network']):
raise exceptions.InvalidConfiguration(
'A router requires a subnet and network')
elif self.network_resources['subnet']:
if not self.network_resources['network']:
raise exceptions.InvalidConfiguration(
'A subnet requires a network')
elif self.network_resources['dhcp']:
raise exceptions.InvalidConfiguration('DHCP requires a subnet')
data_utils.rand_name_root = data_utils.rand_name(self.name)
network_name = data_utils.rand_name_root + "-network"
network = self._create_network(network_name, tenant_id)
if not self.network_resources or self.network_resources['network']:
network_name = data_utils.rand_name_root + "-network"
network = self._create_network(network_name, tenant_id)
try:
subnet_name = data_utils.rand_name_root + "-subnet"
subnet = self._create_subnet(subnet_name, tenant_id, network['id'])
router_name = data_utils.rand_name_root + "-router"
router = self._create_router(router_name, tenant_id)
self._add_router_interface(router['id'], subnet['id'])
if not self.network_resources or self.network_resources['subnet']:
subnet_name = data_utils.rand_name_root + "-subnet"
subnet = self._create_subnet(subnet_name, tenant_id,
network['id'])
if not self.network_resources or self.network_resources['router']:
router_name = data_utils.rand_name_root + "-router"
router = self._create_router(router_name, tenant_id)
self._add_router_interface(router['id'], subnet['id'])
except Exception:
if router:
self._clear_isolated_router(router['id'], router['name'])
@@ -230,14 +249,25 @@ class IsolatedCreds(object):
if not self.tempest_client:
body = {'subnet': {'name': subnet_name, 'tenant_id': tenant_id,
'network_id': network_id, 'ip_version': 4}}
if self.network_resources:
body['enable_dhcp'] = self.network_resources['dhcp']
base_cidr = netaddr.IPNetwork(CONF.network.tenant_network_cidr)
mask_bits = CONF.network.tenant_network_mask_bits
for subnet_cidr in base_cidr.subnet(mask_bits):
try:
if self.tempest_client:
resp, resp_body = self.network_admin_client.create_subnet(
network_id, str(subnet_cidr), name=subnet_name,
tenant_id=tenant_id)
if self.network_resources:
resp, resp_body = self.network_admin_client.\
create_subnet(
network_id, str(subnet_cidr),
name=subnet_name,
tenant_id=tenant_id,
enable_dhcp=self.network_resources['dhcp'])
else:
resp, resp_body = self.network_admin_client.\
create_subnet(network_id, str(subnet_cidr),
name=subnet_name,
tenant_id=tenant_id)
else:
body['subnet']['cidr'] = str(subnet_cidr)
resp_body = self.network_admin_client.create_subnet(body)
@@ -431,26 +461,27 @@ class IsolatedCreds(object):
net_client = self.network_admin_client
for cred in self.isolated_net_resources:
network, subnet, router = self.isolated_net_resources.get(cred)
try:
if self.tempest_client:
net_client.remove_router_interface_with_subnet_id(
router['id'], subnet['id'])
else:
body = {'subnet_id': subnet['id']}
net_client.remove_interface_router(router['id'], body)
except exceptions.NotFound:
LOG.warn('router with name: %s not found for delete' %
router['name'])
pass
self._clear_isolated_router(router['id'], router['name'])
# TODO(mlavalle) This method call will be removed once patch
# https://review.openstack.org/#/c/46563/ merges in Neutron
self._cleanup_ports(network['id'])
self._clear_isolated_subnet(subnet['id'], subnet['name'])
self._clear_isolated_network(network['id'], network['name'])
LOG.info("Cleared isolated network resources: \n"
+ " network: %s, subnet: %s, router: %s"
% (network['name'], subnet['name'], router['name']))
if self.network_resources.get('router'):
try:
if self.tempest_client:
net_client.remove_router_interface_with_subnet_id(
router['id'], subnet['id'])
else:
body = {'subnet_id': subnet['id']}
net_client.remove_interface_router(router['id'], body)
except exceptions.NotFound:
LOG.warn('router with name: %s not found for delete' %
router['name'])
pass
self._clear_isolated_router(router['id'], router['name'])
if self.network_resources.get('network'):
# TODO(mlavalle) This method call will be removed once patch
# https://review.openstack.org/#/c/46563/ merges in Neutron
self._cleanup_ports(network['id'])
if self.network_resources.get('subnet'):
self._clear_isolated_subnet(subnet['id'], subnet['name'])
if self.network_resources.get('network'):
self._clear_isolated_network(network['id'], network['name'])
def clear_isolated_creds(self):
if not self.isolated_creds:

View File

@@ -235,7 +235,8 @@ class OfficialClientTest(tempest.test.BaseTestCase):
def setUpClass(cls):
super(OfficialClientTest, cls).setUpClass()
cls.isolated_creds = isolated_creds.IsolatedCreds(
__name__, tempest_client=False)
__name__, tempest_client=False,
network_resources=cls.network_resources)
username, password, tenant_name = cls.credentials()

View File

@@ -230,6 +230,8 @@ class BaseTestCase(testtools.TestCase,
setUpClassCalled = False
network_resources = {}
@classmethod
def setUpClass(cls):
if hasattr(super(BaseTestCase, cls), 'setUpClass'):
@@ -277,7 +279,8 @@ class BaseTestCase(testtools.TestCase,
"""
Returns an Openstack client manager
"""
cls.isolated_creds = isolated_creds.IsolatedCreds(cls.__name__)
cls.isolated_creds = isolated_creds.IsolatedCreds(
cls.__name__, network_resources=cls.network_resources)
force_tenant_isolation = getattr(cls, 'force_tenant_isolation', None)
if (cls.config.compute.allow_tenant_isolation or
@@ -319,6 +322,23 @@ class BaseTestCase(testtools.TestCase,
cls.config.identity.uri
)
@classmethod
def set_network_resources(self, network=False, router=False, subnet=False,
dhcp=False):
"""Specify which network resources should be created
@param network
@param router
@param subnet
@param dhcp
"""
self.network_resources = {
'network': network,
'router': router,
'subnet': subnet,
'dhcp': dhcp,
}
def call_until_true(func, duration, sleep_for):
"""