Merge "Provide more default clients for smoke tests."
diff --git a/tempest/manager.py b/tempest/manager.py
index 3856eed..0679db9 100644
--- a/tempest/manager.py
+++ b/tempest/manager.py
@@ -18,8 +18,10 @@
import logging
# Default client libs
-import novaclient.client
import glance.client
+import keystoneclient.v2_0.client
+import novaclient.client
+import quantumclient.v2_0.client
import tempest.config
from tempest import exceptions
@@ -62,16 +64,7 @@
def __init__(self):
self.config = tempest.config.TempestConfig()
- self.client = None
-
-
-class DefaultClientManager(Manager):
-
- """
- Manager class that indicates the client provided by the manager
- is the default Python client that an OpenStack API provides.
- """
- pass
+ self.client_attr_names = []
class FuzzClientManager(Manager):
@@ -86,23 +79,42 @@
pass
-class ComputeDefaultClientManager(DefaultClientManager):
+class DefaultClientManager(Manager):
"""
- Manager that provides the default python-novaclient client object
- to access the OpenStack Compute API.
+ Manager that provides the default clients to access the various
+ OpenStack APIs.
"""
NOVACLIENT_VERSION = '2'
def __init__(self):
- super(ComputeDefaultClientManager, self).__init__()
- username = self.config.compute.username
- password = self.config.compute.password
- tenant_name = self.config.compute.tenant_name
+ super(DefaultClientManager, self).__init__()
+ self.compute_client = self._get_compute_client()
+ self.image_client = self._get_image_client()
+ self.identity_client = self._get_identity_client()
+ self.network_client = self._get_network_client()
+ self.client_attr_names = [
+ 'compute_client',
+ 'image_client',
+ 'identity_client',
+ 'network_client',
+ ]
+
+ def _get_compute_client(self, username=None, password=None,
+ tenant_name=None):
+ # Novaclient will not execute operations for anyone but the
+ # identified user, so a new client needs to be created for
+ # each user that operations need to be performed for.
+ if not username:
+ username = self.config.compute.username
+ if not password:
+ password = self.config.compute.password
+ if not tenant_name:
+ tenant_name = self.config.compute.tenant_name
if None in (username, password, tenant_name):
- msg = ("Missing required credentials. "
+ msg = ("Missing required credentials for compute client. "
"username: %(username)s, password: %(password)s, "
"tenant_name: %(tenant_name)s") % locals()
raise exceptions.InvalidConfiguration(msg)
@@ -113,19 +125,12 @@
client_args = (username, password, tenant_name, auth_url)
# Create our default Nova client to use in testing
- self.client = novaclient.client.Client(self.NOVACLIENT_VERSION,
+ return novaclient.client.Client(self.NOVACLIENT_VERSION,
*client_args,
service_type=self.config.compute.catalog_type,
no_cache=True)
-
-class GlanceDefaultClientManager(DefaultClientManager):
- """
- Manager that provides the default glance client object to access
- the OpenStack Images API
- """
- def __init__(self):
- super(GlanceDefaultClientManager, self).__init__()
+ def _get_image_client(self):
host = self.config.images.host
port = self.config.images.port
strategy = self.config.identity.strategy
@@ -135,7 +140,7 @@
tenant_name = self.config.images.tenant_name
if None in (host, port, username, password, tenant_name):
- msg = ("Missing required credentials. "
+ msg = ("Missing required credentials for image client. "
"host:%(host)s, port: %(port)s username: %(username)s, "
"password: %(password)s, "
"tenant_name: %(tenant_name)s") % locals()
@@ -149,7 +154,46 @@
'auth_url': auth_url}
# Create our default Glance client to use in testing
- self.client = glance.client.Client(host, port, creds=creds)
+ return glance.client.Client(host, port, creds=creds)
+
+ def _get_identity_client(self):
+ # This identity client is not intended to check the security
+ # of the identity service, so use admin credentials.
+ username = self.config.identity_admin.username
+ password = self.config.identity_admin.password
+ tenant_name = self.config.identity_admin.tenant_name
+
+ if None in (username, password, tenant_name):
+ msg = ("Missing required credentials for identity client. "
+ "username: %(username)s, password: %(password)s, "
+ "tenant_name: %(tenant_name)s") % locals()
+ raise exceptions.InvalidConfiguration(msg)
+
+ auth_url = self.config.identity.auth_url.rstrip('tokens')
+
+ return keystoneclient.v2_0.client.Client(username=username,
+ password=password,
+ tenant_name=tenant_name,
+ endpoint=auth_url)
+
+ def _get_network_client(self):
+ # TODO(mnewby) add network-specific auth configuration
+ username = self.config.compute.username
+ password = self.config.compute.password
+ tenant_name = self.config.compute.tenant_name
+
+ if None in (username, password, tenant_name):
+ msg = ("Missing required credentials for network client. "
+ "username: %(username)s, password: %(password)s, "
+ "tenant_name: %(tenant_name)s") % locals()
+ raise exceptions.InvalidConfiguration(msg)
+
+ auth_url = self.config.identity.auth_url.rstrip('tokens')
+
+ return quantumclient.v2_0.client.Client(username=username,
+ password=password,
+ tenant_name=tenant_name,
+ auth_url=auth_url)
class ComputeFuzzClientManager(FuzzClientManager):
diff --git a/tempest/smoke.py b/tempest/smoke.py
index 9383559..c929273 100644
--- a/tempest/smoke.py
+++ b/tempest/smoke.py
@@ -38,10 +38,11 @@
pass
-class ComputeSmokeTest(test.ComputeDefaultClientTest, SmokeTest):
+class DefaultClientSmokeTest(test.DefaultClientTest, SmokeTest):
"""
- Base smoke test case class for OpenStack Compute API (Nova)
+ Base smoke test case class that provides the default clients to
+ access the various OpenStack APIs.
"""
@classmethod
diff --git a/tempest/test.py b/tempest/test.py
index 33bb3fb..4bb8ca4 100644
--- a/tempest/test.py
+++ b/tempest/test.py
@@ -38,7 +38,12 @@
def setUpClass(cls):
cls.manager = cls.manager_class()
cls.config = cls.manager.config
- cls.client = cls.manager.client
+ for attr_name in cls.manager.client_attr_names:
+ # Ensure that pre-existing class attributes won't be
+ # accidentally overriden.
+ assert not hasattr(cls, attr_name)
+ client = getattr(cls.manager, attr_name)
+ setattr(cls, attr_name, client)
cls.resource_keys = {}
cls.resources = []
@@ -57,14 +62,14 @@
del self.resource_keys[key]
-class ComputeDefaultClientTest(TestCase):
+class DefaultClientTest(TestCase):
"""
- Base test case class for OpenStack Compute API (Nova)
- that uses the novaclient libs for calling the API.
+ Base test case class that provides the default clients to access
+ the various OpenStack APIs.
"""
- manager_class = manager.ComputeDefaultClientManager
+ manager_class = manager.DefaultClientManager
def status_timeout(self, things, thing_id, expected_status):
"""
diff --git a/tempest/tests/compute/test_server_advanced_ops.py b/tempest/tests/compute/test_server_advanced_ops.py
index d6962f4..4e85b04 100644
--- a/tempest/tests/compute/test_server_advanced_ops.py
+++ b/tempest/tests/compute/test_server_advanced_ops.py
@@ -25,7 +25,7 @@
LOG = logging.getLogger(__name__)
-class TestServerAdvancedOps(test.ComputeDefaultClientTest):
+class TestServerAdvancedOps(test.DefaultClientTest):
"""
This test case stresses some advanced server instance operations:
@@ -57,7 +57,7 @@
i_name = rand_name('instance')
flavor_id = self.config.compute.flavor_ref
base_image_id = self.config.compute.image_ref
- self.instance = self.client.servers.create(
+ self.instance = self.compute_client.servers.create(
i_name, base_image_id, flavor_id)
try:
self.assertEqual(self.instance.name, i_name)
@@ -67,16 +67,16 @@
self.assertEqual(self.instance.status, 'BUILD')
instance_id = self.get_resource('instance').id
- self.status_timeout(self.client.servers, instance_id, 'ACTIVE')
+ self.status_timeout(self.compute_client.servers, instance_id, 'ACTIVE')
instance = self.get_resource('instance')
instance_id = instance.id
resize_flavor = self.config.compute.flavor_ref_alt
-
LOG.debug("Resizing instance %s from flavor %s to flavor %s",
instance.id, instance.flavor, resize_flavor)
instance.resize(resize_flavor)
- self.status_timeout(self.client.servers, instance_id, 'VERIFY_RESIZE')
+ self.status_timeout(self.compute_client.servers, instance_id,
+ 'VERIFY_RESIZE')
LOG.debug("Confirming resize of instance %s", instance_id)
instance.confirm_resize()
- self.status_timeout(self.client.servers, instance_id, 'ACTIVE')
+ self.status_timeout(self.compute_client.servers, instance_id, 'ACTIVE')
diff --git a/tempest/tests/compute/test_server_basic_ops.py b/tempest/tests/compute/test_server_basic_ops.py
index 8af5212..04b1451 100644
--- a/tempest/tests/compute/test_server_basic_ops.py
+++ b/tempest/tests/compute/test_server_basic_ops.py
@@ -23,7 +23,7 @@
LOG = logging.getLogger(__name__)
-class TestServerBasicOps(smoke.ComputeSmokeTest):
+class TestServerBasicOps(smoke.DefaultClientSmokeTest):
"""
This smoke test case follows this basic set of operations:
@@ -39,7 +39,7 @@
def test_001_create_keypair(self):
kp_name = rand_name('keypair-smoke')
- self.keypair = self.client.keypairs.create(kp_name)
+ self.keypair = self.compute_client.keypairs.create(kp_name)
try:
self.assertEqual(self.keypair.id, kp_name)
self.set_resource('keypair', self.keypair)
@@ -49,7 +49,8 @@
def test_002_create_security_group(self):
sg_name = rand_name('secgroup-smoke')
sg_desc = sg_name + " description"
- self.secgroup = self.client.security_groups.create(sg_name, sg_desc)
+ self.secgroup = self.compute_client.security_groups.create(sg_name,
+ sg_desc)
try:
self.assertEqual(self.secgroup.name, sg_name)
self.assertEqual(self.secgroup.description, sg_desc)
@@ -76,8 +77,8 @@
]
for ruleset in rulesets:
try:
- self.client.security_group_rules.create(
- self.secgroup.id, **ruleset)
+ self.compute_client.security_group_rules.create(
+ self.secgroup.id, **ruleset)
except:
self.fail("Failed to create rule in security group.")
@@ -88,7 +89,7 @@
create_kwargs = {
'key_name': self.get_resource('keypair').id
}
- self.instance = self.client.servers.create(
+ self.instance = self.compute_client.servers.create(
i_name, base_image_id, flavor_id, **create_kwargs)
try:
self.assertEqual(self.instance.name, i_name)
@@ -100,7 +101,7 @@
def test_004_wait_on_active(self):
instance_id = self.get_resource('instance').id
- self.status_timeout(self.client.servers, instance_id, 'ACTIVE')
+ self.status_timeout(self.compute_client.servers, instance_id, 'ACTIVE')
def test_005_pause_server(self):
instance = self.get_resource('instance')
@@ -108,7 +109,7 @@
LOG.debug("Pausing instance %s. Current status: %s",
instance_id, instance.status)
instance.pause()
- self.status_timeout(self.client.servers, instance_id, 'PAUSED')
+ self.status_timeout(self.compute_client.servers, instance_id, 'PAUSED')
def test_006_unpause_server(self):
instance = self.get_resource('instance')
@@ -116,7 +117,7 @@
LOG.debug("Unpausing instance %s. Current status: %s",
instance_id, instance.status)
instance.unpause()
- self.status_timeout(self.client.servers, instance_id, 'ACTIVE')
+ self.status_timeout(self.compute_client.servers, instance_id, 'ACTIVE')
def test_007_suspend_server(self):
instance = self.get_resource('instance')
@@ -124,7 +125,8 @@
LOG.debug("Suspending instance %s. Current status: %s",
instance_id, instance.status)
instance.suspend()
- self.status_timeout(self.client.servers, instance_id, 'SUSPENDED')
+ self.status_timeout(self.compute_client.servers,
+ instance_id, 'SUSPENDED')
def test_008_resume_server(self):
instance = self.get_resource('instance')
@@ -132,7 +134,7 @@
LOG.debug("Resuming instance %s. Current status: %s",
instance_id, instance.status)
instance.resume()
- self.status_timeout(self.client.servers, instance_id, 'ACTIVE')
+ self.status_timeout(self.compute_client.servers, instance_id, 'ACTIVE')
def test_099_terminate_instance(self):
instance = self.get_resource('instance')