Refactor integrated tests to support V2 and V3 API testing

Refactors the integrated test classes so they can be used
for both V2 and V3 API testing. No actual V3 testing is
added in this changeset.

Partially implements blueprint v3-api-unittests
Partially implements blueprint v3-api-specification

Change-Id: Ic7d7b513c3bc19ac1962c0a8489b55e9685fb7c0
This commit is contained in:
Chris Yeoh 2013-07-25 10:55:55 +09:30
parent fa575b51ff
commit 2b376cbe24
7 changed files with 82 additions and 71 deletions

View File

@ -98,8 +98,9 @@ class _IntegratedTestBase(test.TestCase):
def _start_api_service(self):
self.osapi = service.WSGIService("osapi_compute")
self.osapi.start()
self.auth_url = 'http://%s:%s/v2' % (self.osapi.host, self.osapi.port)
LOG.warn(self.auth_url)
self.auth_url = 'http://%(host)s:%(port)s/%(api_version)s' % ({
'host': self.osapi.host, 'port': self.osapi.port,
'api_version': self._api_version})
def _get_flags(self):
"""An opportunity to setup flags, before the services are started."""

View File

@ -90,22 +90,6 @@ class ApiSampleTestBase(integrated_helpers._IntegratedTestBase):
all_extensions = False
extension_name = None
def setUp(self):
extends = []
self.flags(use_ipv6=False,
osapi_compute_link_prefix=self._get_host(),
osapi_glance_link_prefix=self._get_glance_host())
if not self.all_extensions:
if hasattr(self, 'extends_name'):
extends = [self.extends_name]
ext = [self.extension_name] if self.extension_name else []
self.flags(osapi_compute_extension=ext + extends)
super(ApiSampleTestBase, self).setUp()
self.useFixture(test.SampleNetworks())
fake_network.stub_compute_with_ips(self.stubs)
fake_utils.stub_out_utils_spawn_n(self.stubs)
self.generate_samples = os.getenv('GENERATE_SAMPLES') is not None
def _pretty_data(self, data):
if self.ctype == 'json':
data = jsonutils.dumps(jsonutils.loads(data), sort_keys=True,
@ -357,10 +341,6 @@ class ApiSampleTestBase(integrated_helpers._IntegratedTestBase):
'public_key': 'ssh-rsa[ a-zA-Z0-9/+=]*'
'Generated by Nova',
'fingerprint': '([0-9a-f]{2}:){15}[0-9a-f]{2}',
# '[0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2}:'
# '[0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2}:'
# '[0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2}:'
# '[0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2}',
'host': self._get_host(),
'host_name': '[0-9a-z]{32}',
'glance_host': self._get_glance_host(),
@ -393,7 +373,27 @@ class ApiSampleTestBase(integrated_helpers._IntegratedTestBase):
return self._get_response(url, 'DELETE')
class ApiSamplesTrap(ApiSampleTestBase):
class ApiSampleTestBaseV2(ApiSampleTestBase):
_api_version = 'v2'
def setUp(self):
extends = []
self.flags(use_ipv6=False,
osapi_compute_link_prefix=self._get_host(),
osapi_glance_link_prefix=self._get_glance_host())
if not self.all_extensions:
if hasattr(self, 'extends_name'):
extends = [self.extends_name]
ext = [self.extension_name] if self.extension_name else []
self.flags(osapi_compute_extension=ext + extends)
super(ApiSampleTestBaseV2, self).setUp()
self.useFixture(test.SampleNetworks())
fake_network.stub_compute_with_ips(self.stubs)
fake_utils.stub_out_utils_spawn_n(self.stubs)
self.generate_samples = os.getenv('GENERATE_SAMPLES') is not None
class ApiSamplesTrap(ApiSampleTestBaseV2):
"""Make sure extensions don't get added without tests."""
all_extensions = True
@ -446,7 +446,7 @@ class ApiSamplesTrap(ApiSampleTestBase):
self.assertEqual(missing_tests, [])
class VersionsSampleJsonTest(ApiSampleTestBase):
class VersionsSampleJsonTest(ApiSampleTestBaseV2):
def test_versions_get(self):
response = self._do_get('', strip_version=True)
subs = self._get_regexes()
@ -457,7 +457,7 @@ class VersionsSampleXmlTest(VersionsSampleJsonTest):
ctype = 'xml'
class ServersSampleBase(ApiSampleTestBase):
class ServersSampleBase(ApiSampleTestBaseV2):
def _post_server(self):
subs = {
'image_id': fake.get_valid_image_id(),
@ -607,7 +607,7 @@ class ServersIpsXmlTest(ServersIpsJsonTest):
ctype = 'xml'
class ExtensionsSampleJsonTest(ApiSampleTestBase):
class ExtensionsSampleJsonTest(ApiSampleTestBaseV2):
all_extensions = True
def test_extensions_get(self):
@ -620,7 +620,7 @@ class ExtensionsSampleXmlTest(ExtensionsSampleJsonTest):
ctype = 'xml'
class FlavorsSampleJsonTest(ApiSampleTestBase):
class FlavorsSampleJsonTest(ApiSampleTestBaseV2):
def test_flavors_get(self):
response = self._do_get('flavors/1')
@ -637,7 +637,7 @@ class FlavorsSampleXmlTest(FlavorsSampleJsonTest):
ctype = 'xml'
class HostsSampleJsonTest(ApiSampleTestBase):
class HostsSampleJsonTest(ApiSampleTestBaseV2):
extension_name = "nova.api.openstack.compute.contrib.hosts.Hosts"
def test_host_startup(self):
@ -684,7 +684,7 @@ class FlavorsSampleAllExtensionXmlTest(FlavorsSampleXmlTest):
all_extensions = True
class ImagesSampleJsonTest(ApiSampleTestBase):
class ImagesSampleJsonTest(ApiSampleTestBaseV2):
def test_images_list(self):
# Get api sample of images get list request.
response = self._do_get('images')
@ -752,7 +752,7 @@ class ImagesSampleXmlTest(ImagesSampleJsonTest):
ctype = 'xml'
class LimitsSampleJsonTest(ApiSampleTestBase):
class LimitsSampleJsonTest(ApiSampleTestBaseV2):
def test_limits_get(self):
response = self._do_get('limits')
subs = self._get_regexes()
@ -763,7 +763,7 @@ class LimitsSampleXmlTest(LimitsSampleJsonTest):
ctype = 'xml'
class CoverageExtJsonTests(ApiSampleTestBase):
class CoverageExtJsonTests(ApiSampleTestBaseV2):
extension_name = ("nova.api.openstack.compute.contrib.coverage_ext."
"Coverage_ext")
@ -935,7 +935,7 @@ class ServerStartStopXmlTest(ServerStartStopJsonTest):
ctype = 'xml'
class UserDataJsonTest(ApiSampleTestBase):
class UserDataJsonTest(ApiSampleTestBaseV2):
extension_name = "nova.api.openstack.compute.contrib.user_data.User_data"
def test_user_data_post(self):
@ -956,7 +956,7 @@ class UserDataXmlTest(UserDataJsonTest):
ctype = 'xml'
class FlavorsExtraDataJsonTest(ApiSampleTestBase):
class FlavorsExtraDataJsonTest(ApiSampleTestBaseV2):
extension_name = ('nova.api.openstack.compute.contrib.flavorextradata.'
'Flavorextradata')
@ -1002,7 +1002,7 @@ class FlavorsExtraDataXmlTest(FlavorsExtraDataJsonTest):
ctype = 'xml'
class FlavorRxtxJsonTest(ApiSampleTestBase):
class FlavorRxtxJsonTest(ApiSampleTestBaseV2):
extension_name = ('nova.api.openstack.compute.contrib.flavor_rxtx.'
'Flavor_rxtx')
@ -1045,7 +1045,7 @@ class FlavorRxtxXmlTest(FlavorRxtxJsonTest):
ctype = 'xml'
class FlavorSwapJsonTest(ApiSampleTestBase):
class FlavorSwapJsonTest(ApiSampleTestBaseV2):
extension_name = ('nova.api.openstack.compute.contrib.flavor_swap.'
'Flavor_swap')
@ -1193,7 +1193,7 @@ class SecurityGroupDefaultRulesSampleXmlTest(
ctype = 'xml'
class SchedulerHintsJsonTest(ApiSampleTestBase):
class SchedulerHintsJsonTest(ApiSampleTestBaseV2):
extension_name = ("nova.api.openstack.compute.contrib.scheduler_hints."
"Scheduler_hints")
@ -1261,7 +1261,7 @@ class ExtendedServerAttributesXmlTest(ExtendedServerAttributesJsonTest):
ctype = 'xml'
class FloatingIpsJsonTest(ApiSampleTestBase):
class FloatingIpsJsonTest(ApiSampleTestBaseV2):
extension_name = "nova.api.openstack.compute.contrib." \
"floating_ips.Floating_ips"
@ -1359,7 +1359,7 @@ class ExtendedFloatingIpsXmlTest(ExtendedFloatingIpsJsonTest):
ctype = 'xml'
class FloatingIpsBulkJsonTest(ApiSampleTestBase):
class FloatingIpsBulkJsonTest(ApiSampleTestBaseV2):
extension_name = "nova.api.openstack.compute.contrib." \
"floating_ips_bulk.Floating_ips_bulk"
@ -1429,7 +1429,7 @@ class FloatingIpsBulkXmlTest(FloatingIpsBulkJsonTest):
ctype = 'xml'
class KeyPairsSampleJsonTest(ApiSampleTestBase):
class KeyPairsSampleJsonTest(ApiSampleTestBaseV2):
extension_name = "nova.api.openstack.compute.contrib.keypairs.Keypairs"
def generalize_subs(self, subs, vanilla_regexes):
@ -1583,7 +1583,7 @@ class VirtualInterfacesXmlTest(VirtualInterfacesJsonTest):
ctype = 'xml'
class CloudPipeSampleJsonTest(ApiSampleTestBase):
class CloudPipeSampleJsonTest(ApiSampleTestBaseV2):
extension_name = "nova.api.openstack.compute.contrib.cloudpipe.Cloudpipe"
def setUp(self):
@ -1632,7 +1632,7 @@ class CloudPipeSampleXmlTest(CloudPipeSampleJsonTest):
ctype = "xml"
class CloudPipeUpdateJsonTest(ApiSampleTestBase):
class CloudPipeUpdateJsonTest(ApiSampleTestBaseV2):
extension_name = ("nova.api.openstack.compute.contrib"
".cloudpipe_update.Cloudpipe_update")
@ -1657,7 +1657,7 @@ class CloudPipeUpdateXmlTest(CloudPipeUpdateJsonTest):
ctype = "xml"
class AgentsJsonTest(ApiSampleTestBase):
class AgentsJsonTest(ApiSampleTestBaseV2):
extension_name = "nova.api.openstack.compute.contrib.agents.Agents"
def _get_flags(self):
@ -1757,7 +1757,7 @@ class AgentsXmlTest(AgentsJsonTest):
ctype = "xml"
class FixedIpJsonTest(ApiSampleTestBase):
class FixedIpJsonTest(ApiSampleTestBaseV2):
extension_name = "nova.api.openstack.compute.contrib.fixed_ips.Fixed_ips"
def _get_flags(self):
@ -1909,7 +1909,7 @@ class AggregatesSampleXmlTest(AggregatesSampleJsonTest):
ctype = 'xml'
class CertificatesSamplesJsonTest(ApiSampleTestBase):
class CertificatesSamplesJsonTest(ApiSampleTestBaseV2):
extension_name = ("nova.api.openstack.compute.contrib.certificates."
"Certificates")
@ -1929,7 +1929,7 @@ class CertificatesSamplesXmlTest(CertificatesSamplesJsonTest):
ctype = 'xml'
class UsedLimitsSamplesJsonTest(ApiSampleTestBase):
class UsedLimitsSamplesJsonTest(ApiSampleTestBaseV2):
extension_name = ("nova.api.openstack.compute.contrib.used_limits."
"Used_limits")
@ -1944,7 +1944,7 @@ class UsedLimitsSamplesXmlTest(UsedLimitsSamplesJsonTest):
ctype = "xml"
class UsedLimitsForAdminSamplesJsonTest(ApiSampleTestBase):
class UsedLimitsForAdminSamplesJsonTest(ApiSampleTestBaseV2):
extends_name = ("nova.api.openstack.compute.contrib.used_limits."
"Used_limits")
extension_name = (
@ -1996,7 +1996,7 @@ class MultipleCreateXmlTest(MultipleCreateJsonTest):
ctype = 'xml'
class ServicesJsonTest(ApiSampleTestBase):
class ServicesJsonTest(ApiSampleTestBaseV2):
extension_name = "nova.api.openstack.compute.contrib.services.Services"
def setUp(self):
@ -2080,7 +2080,7 @@ class ServicesXmlTest(ServicesJsonTest):
ctype = 'xml'
class ExtendedServicesJsonTest(ApiSampleTestBase):
class ExtendedServicesJsonTest(ApiSampleTestBaseV2):
"""
This extension is extending the functionalities of the
Services extension so the funcionalities introduced by this extension
@ -2366,7 +2366,7 @@ class DeferredDeleteSampleXmlTests(DeferredDeleteSampleJsonTests):
ctype = 'xml'
class QuotasSampleJsonTests(ApiSampleTestBase):
class QuotasSampleJsonTests(ApiSampleTestBaseV2):
extension_name = "nova.api.openstack.compute.contrib.quotas.Quotas"
def test_show_quotas(self):
@ -2392,7 +2392,7 @@ class QuotasSampleXmlTests(QuotasSampleJsonTests):
ctype = "xml"
class ExtendedQuotasSampleJsonTests(ApiSampleTestBase):
class ExtendedQuotasSampleJsonTests(ApiSampleTestBaseV2):
extends_name = "nova.api.openstack.compute.contrib.quotas.Quotas"
extension_name = ("nova.api.openstack.compute.contrib"
".extended_quotas.Extended_quotas")
@ -2416,7 +2416,7 @@ class ExtendedQuotasSampleXmlTests(ExtendedQuotasSampleJsonTests):
ctype = "xml"
class UserQuotasSampleJsonTests(ApiSampleTestBase):
class UserQuotasSampleJsonTests(ApiSampleTestBaseV2):
extends_name = "nova.api.openstack.compute.contrib.quotas.Quotas"
extension_name = ("nova.api.openstack.compute.contrib"
".user_quotas.User_quotas")
@ -2611,7 +2611,7 @@ class ExtendedVIFNetSampleXmlTests(ExtendedIpsSampleJsonTests):
ctype = 'xml'
class FlavorManageSampleJsonTests(ApiSampleTestBase):
class FlavorManageSampleJsonTests(ApiSampleTestBaseV2):
extension_name = ("nova.api.openstack.compute.contrib.flavormanage."
"Flavormanage")
@ -2742,7 +2742,7 @@ class DiskConfigXmlTest(DiskConfigJsonTest):
ctype = 'xml'
class OsNetworksJsonTests(ApiSampleTestBase):
class OsNetworksJsonTests(ApiSampleTestBaseV2):
extension_name = ("nova.api.openstack.compute.contrib.os_tenant_networks"
".Os_tenant_networks")
@ -2789,7 +2789,7 @@ class OsNetworksXmlTests(OsNetworksJsonTests):
self.assertEqual(response.status, 202)
class NetworksJsonTests(ApiSampleTestBase):
class NetworksJsonTests(ApiSampleTestBaseV2):
extension_name = ("nova.api.openstack.compute.contrib"
".os_networks.Os_networks")
@ -2842,7 +2842,7 @@ class NetworksXmlTests(NetworksJsonTests):
ctype = 'xml'
class NetworksAssociateJsonTests(ApiSampleTestBase):
class NetworksAssociateJsonTests(ApiSampleTestBaseV2):
extension_name = ("nova.api.openstack.compute.contrib"
".networks_associate.Networks_associate")
@ -2895,7 +2895,7 @@ class NetworksAssociateXmlTests(NetworksAssociateJsonTests):
ctype = 'xml'
class FlavorDisabledSampleJsonTests(ApiSampleTestBase):
class FlavorDisabledSampleJsonTests(ApiSampleTestBaseV2):
extension_name = ("nova.api.openstack.compute.contrib.flavor_disabled."
"Flavor_disabled")
@ -2918,7 +2918,7 @@ class FlavorDisabledSampleXmlTests(FlavorDisabledSampleJsonTests):
ctype = "xml"
class QuotaClassesSampleJsonTests(ApiSampleTestBase):
class QuotaClassesSampleJsonTests(ApiSampleTestBaseV2):
extension_name = ("nova.api.openstack.compute.contrib.quota_classes."
"Quota_classes")
set_id = 'test_class'
@ -2943,7 +2943,7 @@ class QuotaClassesSampleXmlTests(QuotaClassesSampleJsonTests):
ctype = "xml"
class CellsSampleJsonTest(ApiSampleTestBase):
class CellsSampleJsonTest(ApiSampleTestBaseV2):
extension_name = "nova.api.openstack.compute.contrib.cells.Cells"
def setUp(self):
@ -3000,7 +3000,7 @@ class CellsSampleXmlTest(CellsSampleJsonTest):
ctype = 'xml'
class CellsCapacitySampleJsonTest(ApiSampleTestBase):
class CellsCapacitySampleJsonTest(ApiSampleTestBaseV2):
extends_name = ("nova.api.openstack.compute.contrib.cells.Cells")
extension_name = ("nova.api.openstack.compute.contrib."
"cell_capacities.Cell_capacities")
@ -3048,7 +3048,7 @@ class CellsCapacitySampleXmlTest(CellsCapacitySampleJsonTest):
ctype = 'xml'
class BareMetalNodesJsonTest(ApiSampleTestBase, bm_db_base.BMDBTestCase):
class BareMetalNodesJsonTest(ApiSampleTestBaseV2, bm_db_base.BMDBTestCase):
extension_name = ('nova.api.openstack.compute.contrib.baremetal_nodes.'
'Baremetal_nodes')
@ -3154,7 +3154,7 @@ class BlockDeviceMappingV2BootXmlTest(BlockDeviceMappingV2BootJsonTest):
ctype = 'xml'
class FloatingIPPoolsSampleJsonTests(ApiSampleTestBase):
class FloatingIPPoolsSampleJsonTests(ApiSampleTestBaseV2):
extension_name = ("nova.api.openstack.compute.contrib.floating_ip_pools."
"Floating_ip_pools")
@ -3203,7 +3203,7 @@ class MultinicSampleXmlTest(MultinicSampleJsonTest):
ctype = "xml"
class InstanceUsageAuditLogJsonTest(ApiSampleTestBase):
class InstanceUsageAuditLogJsonTest(ApiSampleTestBaseV2):
extension_name = ("nova.api.openstack.compute.contrib."
"instance_usage_audit_log.Instance_usage_audit_log")
@ -3227,7 +3227,7 @@ class InstanceUsageAuditLogXmlTest(InstanceUsageAuditLogJsonTest):
ctype = "xml"
class FlavorExtraSpecsSampleJsonTests(ApiSampleTestBase):
class FlavorExtraSpecsSampleJsonTests(ApiSampleTestBaseV2):
extension_name = ("nova.api.openstack.compute.contrib.flavorextraspecs."
"Flavorextraspecs")
@ -3372,7 +3372,7 @@ class EvacuateXmlTest(EvacuateJsonTest):
ctype = 'xml'
class FloatingIpDNSJsonTest(ApiSampleTestBase):
class FloatingIpDNSJsonTest(ApiSampleTestBaseV2):
extension_name = ("nova.api.openstack.compute.contrib.floating_ip_dns."
"Floating_ip_dns")
@ -3453,7 +3453,7 @@ class FloatingIpDNSXmlTest(FloatingIpDNSJsonTest):
ctype = 'xml'
class InstanceActionsSampleJsonTest(ApiSampleTestBase):
class InstanceActionsSampleJsonTest(ApiSampleTestBaseV2):
extension_name = ('nova.api.openstack.compute.contrib.instance_actions.'
'Instance_actions')
@ -3520,7 +3520,7 @@ class InstanceActionsSampleXmlTest(InstanceActionsSampleJsonTest):
ctype = 'xml'
class ImageSizeSampleJsonTests(ApiSampleTestBase):
class ImageSizeSampleJsonTests(ApiSampleTestBaseV2):
extension_name = ("nova.api.openstack.compute.contrib"
".image_size.Image_size")
@ -3578,7 +3578,7 @@ class ConfigDriveSampleXmlTest(ConfigDriveSampleJsonTest):
ctype = 'xml'
class FlavorAccessSampleJsonTests(ApiSampleTestBase):
class FlavorAccessSampleJsonTests(ApiSampleTestBaseV2):
extension_name = ("nova.api.openstack.compute.contrib.flavor_access."
"Flavor_access")
@ -3661,7 +3661,7 @@ class FlavorAccessSampleXmlTests(FlavorAccessSampleJsonTests):
ctype = 'xml'
class HypervisorsSampleJsonTests(ApiSampleTestBase):
class HypervisorsSampleJsonTests(ApiSampleTestBaseV2):
extension_name = ("nova.api.openstack.compute.contrib.hypervisors."
"Hypervisors")
@ -3709,7 +3709,7 @@ class HypervisorsSampleXmlTests(HypervisorsSampleJsonTests):
ctype = "xml"
class HypervisorsCellsSampleJsonTests(ApiSampleTestBase):
class HypervisorsCellsSampleJsonTests(ApiSampleTestBaseV2):
extension_name = ("nova.api.openstack.compute.contrib.hypervisors."
"Hypervisors")
@ -3913,7 +3913,7 @@ class AttachInterfacesSampleXmlTest(AttachInterfacesSampleJsonTest):
ctype = 'xml'
class SnapshotsSampleJsonTests(ApiSampleTestBase):
class SnapshotsSampleJsonTests(ApiSampleTestBaseV2):
extension_name = "nova.api.openstack.compute.contrib.volumes.Volumes"
create_subs = {
@ -4205,7 +4205,7 @@ class VolumesSampleXmlTest(VolumesSampleJsonTest):
ctype = 'xml'
class MigrationsSamplesJsonTest(ApiSampleTestBase):
class MigrationsSamplesJsonTest(ApiSampleTestBaseV2):
extension_name = ("nova.api.openstack.compute.contrib.migrations."
"Migrations")

View File

@ -26,6 +26,8 @@ LOG = logging.getLogger(__name__)
class ExtensionsTest(integrated_helpers._IntegratedTestBase):
_api_version = 'v2'
def _get_flags(self):
f = super(ExtensionsTest, self)._get_flags()
f['osapi_compute_extension'] = CONF.osapi_compute_extension[:]

View File

@ -25,6 +25,8 @@ LOG = logging.getLogger(__name__)
class LoginTest(integrated_helpers._IntegratedTestBase):
_api_version = 'v2'
def test_login(self):
# Simple check - we list flavors - so we know we're logged in.
flavors = self.api.get_flavors()

View File

@ -30,6 +30,8 @@ LOG = logging.getLogger(__name__)
class MultiprocessWSGITest(integrated_helpers._IntegratedTestBase):
_api_version = 'v2'
def _start_api_service(self):
# Process will be started in _spawn()
self.osapi = service.WSGIService("osapi_compute")

View File

@ -32,6 +32,8 @@ LOG = logging.getLogger(__name__)
class ServersTest(integrated_helpers._IntegratedTestBase):
_api_version = 'v2'
def setUp(self):
super(ServersTest, self).setUp()
self.conductor = self.start_service(

View File

@ -29,6 +29,8 @@ LOG = logging.getLogger(__name__)
class XmlTests(integrated_helpers._IntegratedTestBase):
""""Some basic XML sanity checks."""
_api_version = 'v2'
def test_namespace_limits(self):
headers = {}
headers['Accept'] = 'application/xml'