Merge "Stop passing around dicts in validation resources"

This commit is contained in:
Jenkins 2017-08-17 17:21:22 +00:00 committed by Gerrit Code Review
commit 29330ba31e
2 changed files with 130 additions and 117 deletions

View File

@ -19,15 +19,15 @@ from tempest.lib import exceptions as lib_exc
LOG = logging.getLogger(__name__)
def _network_service(os, use_neutron):
def _network_service(clients, use_neutron):
# Internal helper to select the right network clients
if use_neutron:
return os.network
return clients.network
else:
return os.compute
return clients.compute
def create_ssh_security_group(os, add_rule=False, ethertype='IPv4',
def create_ssh_security_group(clients, add_rule=False, ethertype='IPv4',
use_neutron=True):
"""Create a security group for ping/ssh testing
@ -35,8 +35,9 @@ def create_ssh_security_group(os, add_rule=False, ethertype='IPv4',
clients. If rules are added, the group can be attached to a VM to enable
connectivity validation over ICMP and further testing over SSH.
:param os: An instance of `tempest.lib.services.clients.ServiceClients` or
of a subclass of it. Resources are provisioned using clients from `os`.
:param clients: Instance of `tempest.lib.services.clients.ServiceClients`
or of a subclass of it. Resources are provisioned using clients from
`clients`.
:param add_rule: Whether security group rules are provisioned or not.
Defaults to `False`.
:param ethertype: 'IPv4' or 'IPv6'. Honoured only in case neutron is used.
@ -53,13 +54,14 @@ def create_ssh_security_group(os, add_rule=False, ethertype='IPv4',
creds = auth.get_credentials('http://mycloud/identity/v3',
username='me', project_name='me',
password='secret', domain_name='Default')
os = clients.ServiceClients(creds, 'http://mycloud/identity/v3')
osclients = clients.ServiceClients(creds, 'http://mycloud/identity/v3')
# Security group for IPv4 tests
sg4 = vr.create_ssh_security_group(os, add_rule=True)
sg4 = vr.create_ssh_security_group(osclients, add_rule=True)
# Security group for IPv6 tests
sg6 = vr.create_ssh_security_group(os, ethertype='IPv6', add_rule=True)
sg6 = vr.create_ssh_security_group(osclients, ethertype='IPv6',
add_rule=True)
"""
network_service = _network_service(os, use_neutron)
network_service = _network_service(clients, use_neutron)
security_groups_client = network_service.SecurityGroupsClient()
security_group_rules_client = network_service.SecurityGroupRulesClient()
# Security Group clients for nova and neutron behave the same
@ -95,7 +97,9 @@ def create_ssh_security_group(os, add_rule=False, ethertype='IPv4',
return security_group
def create_validation_resources(os, validation_resources=None,
def create_validation_resources(clients, keypair=False, floating_ip=False,
security_group=False,
security_group_rules=False,
ethertype='IPv4', use_neutron=True,
floating_network_id=None,
floating_network_name=None):
@ -104,16 +108,20 @@ def create_validation_resources(os, validation_resources=None,
Create resources required to be able to ping / ssh a virtual machine:
keypair, security group, security group rules and a floating IP.
Which of those resources are required may depend on the cloud setup and on
the specific test and it can be controlled via the validation_resources
dictionary.
the specific test and it can be controlled via the corresponding
arguments.
Provisioned resources are returned in a dictionary.
:param os: An instance of `tempest.lib.services.clients.ServiceClients` or
of a subclass of it. Resources are provisioned using clients from `os`.
:param validation_resources: A dictionary that specifies which resources to
provision. Required keys are: 'keypair', 'security_group',
'security_group_rules' and 'floating_ip'.
:param clients: Instance of `tempest.lib.services.clients.ServiceClients`
or of a subclass of it. Resources are provisioned using clients from
`clients`.
:param keypair: Whether to provision a keypair. Defaults to False.
:param floating_ip: Whether to provision a floating IP. Defaults to False.
:param security_group: Whether to provision a security group. Defaults to
False.
:param security_group_rules: Whether to provision security group rules.
Defaults to False.
:param ethertype: 'IPv4' or 'IPv6'. Honoured only in case neutron is used.
:param use_neutron: When True resources are provisioned via neutron, when
False resources are provisioned via nova.
@ -135,55 +143,54 @@ def create_validation_resources(os, validation_resources=None,
creds = auth.get_credentials('http://mycloud/identity/v3',
username='me', project_name='me',
password='secret', domain_name='Default')
os = clients.ServiceClients(creds, 'http://mycloud/identity/v3')
osclients = clients.ServiceClients(creds, 'http://mycloud/identity/v3')
# Request keypair and floating IP
resources = dict(keypair=True, security_group=False,
security_group_rules=False, floating_ip=True)
resources = vr.create_validation_resources(
os, validation_resources=resources, use_neutron=True,
floating_network_id='4240E68E-23DA-4C82-AC34-9FEFAA24521C')
osclients, use_neutron=True,
floating_network_id='4240E68E-23DA-4C82-AC34-9FEFAA24521C',
**resources)
# The floating IP to be attached to the VM
floating_ip = resources['floating_ip']['ip']
"""
# Create and Return the validation resources required to validate a VM
validation_data = {}
if validation_resources:
if validation_resources['keypair']:
keypair_name = data_utils.rand_name('keypair')
validation_data.update(os.compute.KeyPairsClient().create_keypair(
if keypair:
keypair_name = data_utils.rand_name('keypair')
validation_data.update(
clients.compute.KeyPairsClient().create_keypair(
name=keypair_name))
LOG.debug("Validation resource key %s created", keypair_name)
add_rule = False
if validation_resources['security_group']:
if validation_resources['security_group_rules']:
add_rule = True
validation_data['security_group'] = \
create_ssh_security_group(
os, add_rule, use_neutron=use_neutron, ethertype=ethertype)
if validation_resources['floating_ip']:
floating_ip_client = _network_service(
os, use_neutron).FloatingIPsClient()
if use_neutron:
floatingip = floating_ip_client.create_floatingip(
floating_network_id=floating_network_id)
# validation_resources['floating_ip'] has historically looked
# like a compute API POST /os-floating-ips response, so we need
# to mangle it a bit for a Neutron response with different
# fields.
validation_data['floating_ip'] = floatingip['floatingip']
validation_data['floating_ip']['ip'] = (
floatingip['floatingip']['floating_ip_address'])
else:
# NOTE(mriedem): The os-floating-ips compute API was deprecated
# in the 2.36 microversion. Any tests for CRUD operations on
# floating IPs using the compute API should be capped at 2.35.
validation_data.update(floating_ip_client.create_floating_ip(
pool=floating_network_name))
LOG.debug("Validation resource key %s created", keypair_name)
if security_group:
validation_data['security_group'] = create_ssh_security_group(
clients, add_rule=security_group_rules,
use_neutron=use_neutron, ethertype=ethertype)
if floating_ip:
floating_ip_client = _network_service(
clients, use_neutron).FloatingIPsClient()
if use_neutron:
floatingip = floating_ip_client.create_floatingip(
floating_network_id=floating_network_id)
# validation_resources['floating_ip'] has historically looked
# like a compute API POST /os-floating-ips response, so we need
# to mangle it a bit for a Neutron response with different
# fields.
validation_data['floating_ip'] = floatingip['floatingip']
validation_data['floating_ip']['ip'] = (
floatingip['floatingip']['floating_ip_address'])
else:
# NOTE(mriedem): The os-floating-ips compute API was deprecated
# in the 2.36 microversion. Any tests for CRUD operations on
# floating IPs using the compute API should be capped at 2.35.
validation_data.update(floating_ip_client.create_floating_ip(
pool=floating_network_name))
return validation_data
def clear_validation_resources(os, validation_data=None, use_neutron=True):
def clear_validation_resources(clients, keypair=None, floating_ip=None,
security_group=None, use_neutron=True):
"""Cleanup resources for VM ping/ssh testing
Cleanup a set of resources provisioned via `create_validation_resources`.
@ -191,12 +198,15 @@ def clear_validation_resources(os, validation_data=None, use_neutron=True):
process is continued. The first exception that was raised is re-raised
after the cleanup is complete.
:param os: An instance of `tempest.lib.services.clients.ServiceClients` or
of a subclass of it. Resources are provisioned using clients from `os`.
:param validation_data: A dictionary that specifies resources to be
cleaned up in the format returned by `create_validation_resources`.
Required keys are: 'keypair', 'security_group', 'security_group_rules'
and 'floating_ip'.
:param clients: Instance of `tempest.lib.services.clients.ServiceClients`
or of a subclass of it. Resources are provisioned using clients from
`clients`.
:param keypair: A dictionary with the keypair to be deleted. Defaults to
None.
:param floating_ip: A dictionary with the floating_ip to be deleted.
Defaults to None.
:param security_group: A dictionary with the security_group to be deleted.
Defaults to None.
:param use_neutron: When True resources are provisioned via neutron, when
False resources are provisioned via nova.
:returns: A dictionary with the same keys as the input
@ -212,71 +222,71 @@ def clear_validation_resources(os, validation_data=None, use_neutron=True):
creds = auth.get_credentials('http://mycloud/identity/v3',
username='me', project_name='me',
password='secret', domain_name='Default')
os = clients.ServiceClients(creds, 'http://mycloud/identity/v3')
osclients = clients.ServiceClients(creds, 'http://mycloud/identity/v3')
# Request keypair and floating IP
resources = dict(keypair=True, security_group=False,
security_group_rules=False, floating_ip=True)
resources = vr.create_validation_resources(
os, validation_resources=resources, use_neutron=True,
osclients, validation_resources=resources, use_neutron=True,
floating_network_id='4240E68E-23DA-4C82-AC34-9FEFAA24521C')
# Now cleanup the resources
try:
vr.clear_validation_resources(os, resources)
vr.clear_validation_resources(osclients, use_neutron=True,
**resources)
except Exception as e:
LOG.exception('Something went wrong during cleanup, ignoring')
"""
has_exception = None
if validation_data:
if 'keypair' in validation_data:
keypair_client = os.compute.KeyPairsClient()
keypair_name = validation_data['keypair']['name']
try:
keypair_client.delete_keypair(keypair_name)
except lib_exc.NotFound:
LOG.warning(
"Keypair %s is not found when attempting to delete",
keypair_name
)
except Exception as exc:
LOG.exception('Exception raised while deleting key %s',
keypair_name)
if not has_exception:
has_exception = exc
network_service = _network_service(os, use_neutron)
if 'security_group' in validation_data:
security_group_client = network_service.SecurityGroupsClient()
sec_id = validation_data['security_group']['id']
try:
security_group_client.delete_security_group(sec_id)
security_group_client.wait_for_resource_deletion(sec_id)
except lib_exc.NotFound:
LOG.warning("Security group %s is not found when attempting "
"to delete", sec_id)
except lib_exc.Conflict as exc:
LOG.exception('Conflict while deleting security '
'group %s VM might not be deleted', sec_id)
if not has_exception:
has_exception = exc
except Exception as exc:
LOG.exception('Exception raised while deleting security '
'group %s', sec_id)
if not has_exception:
has_exception = exc
if 'floating_ip' in validation_data:
floating_ip_client = network_service.FloatingIPsClient()
fip_id = validation_data['floating_ip']['id']
try:
if use_neutron:
floating_ip_client.delete_floatingip(fip_id)
else:
floating_ip_client.delete_floating_ip(fip_id)
except lib_exc.NotFound:
LOG.warning('Floating ip %s not found while attempting to '
'delete', fip_id)
except Exception as exc:
LOG.exception('Exception raised while deleting ip %s', fip_id)
if not has_exception:
has_exception = exc
if keypair:
keypair_client = clients.compute.KeyPairsClient()
keypair_name = keypair['name']
try:
keypair_client.delete_keypair(keypair_name)
except lib_exc.NotFound:
LOG.warning(
"Keypair %s is not found when attempting to delete",
keypair_name
)
except Exception as exc:
LOG.exception('Exception raised while deleting key %s',
keypair_name)
if not has_exception:
has_exception = exc
network_service = _network_service(clients, use_neutron)
if security_group:
security_group_client = network_service.SecurityGroupsClient()
sec_id = security_group['id']
try:
security_group_client.delete_security_group(sec_id)
security_group_client.wait_for_resource_deletion(sec_id)
except lib_exc.NotFound:
LOG.warning("Security group %s is not found when attempting "
"to delete", sec_id)
except lib_exc.Conflict as exc:
LOG.exception('Conflict while deleting security '
'group %s VM might not be deleted', sec_id)
if not has_exception:
has_exception = exc
except Exception as exc:
LOG.exception('Exception raised while deleting security '
'group %s', sec_id)
if not has_exception:
has_exception = exc
if floating_ip:
floating_ip_client = network_service.FloatingIPsClient()
fip_id = floating_ip['id']
try:
if use_neutron:
floating_ip_client.delete_floatingip(fip_id)
else:
floating_ip_client.delete_floating_ip(fip_id)
except lib_exc.NotFound:
LOG.warning('Floating ip %s not found while attempting to '
'delete', fip_id)
except Exception as exc:
LOG.exception('Exception raised while deleting ip %s', fip_id)
if not has_exception:
has_exception = exc
if has_exception:
raise has_exception

View File

@ -379,12 +379,14 @@ class BaseTestCase(testtools.testcase.WithAttributes,
raise lib_exc.InvalidConfiguration(
msg % CONF.validation.ip_version_for_ssh)
if hasattr(cls, "os_primary"):
vr = cls.validation_resources
cls.validation_resources = vresources.create_validation_resources(
cls.os_primary, cls.validation_resources,
cls.os_primary,
use_neutron=CONF.service_available.neutron,
ethertype='IPv' + str(CONF.validation.ip_version_for_ssh),
floating_network_id=CONF.network.public_network_id,
floating_network_name=CONF.network.floating_network_name)
floating_network_name=CONF.network.floating_network_name,
**vr)
else:
LOG.warning("Client manager not found, validation resources not"
" created")
@ -398,9 +400,10 @@ class BaseTestCase(testtools.testcase.WithAttributes,
"""
if cls.validation_resources:
if hasattr(cls, "os_primary"):
vr = cls.validation_resources
vresources.clear_validation_resources(
cls.os_primary, cls.validation_resources,
use_neutron=CONF.service_available.neutron)
cls.os_primary,
use_neutron=CONF.service_available.neutron, **vr)
cls.validation_resources = {}
else:
LOG.warning("Client manager not found, validation resources "