Port integrated tests for V3 API

Ports most of the integrated tests to the V3 API. The
test api samples test will be ported to the V3 API in a later
changeset

Partially implements blueprint v3-api-unittests

Change-Id: I00a93471d95760e6c97534808c5a93522710b20d
This commit is contained in:
Chris Yeoh 2013-07-25 18:38:23 +09:30
parent ff6e64992b
commit ab16b4a7b2
6 changed files with 93 additions and 20 deletions

View File

@ -299,3 +299,30 @@ class TestOpenStackClient(object):
def delete_server_volume(self, server_id, attachment_id):
return self.api_delete('/servers/%s/os-volume_attachments/%s' %
(server_id, attachment_id))
class TestOpenStackClientV3(TestOpenStackClient):
"""Simple OpenStack v3 API Client.
This is a really basic OpenStack API client that is under our control,
so we can make changes / insert hooks for testing
"""
def get_image(self, image_id):
return self.api_get('/os-images/%s' % image_id)['image']
def get_images(self, detail=True):
rel_url = '/os-images/detail' if detail else '/os-images'
return self.api_get(rel_url)['images']
def post_image(self, image):
return self.api_post('/os-images', image)['image']
def delete_image(self, image_id):
return self.api_delete('/os-images/%s' % image_id)
class TestOpenStackClientV3Mixin(object):
def _get_test_client(self):
return TestOpenStackClientV3('fake', 'fake', self.auth_url)

View File

@ -88,13 +88,16 @@ class _IntegratedTestBase(test.TestCase):
self._start_api_service()
self.api = client.TestOpenStackClient('fake', 'fake', self.auth_url)
self.api = self._get_test_client()
def tearDown(self):
self.osapi.stop()
nova.tests.image.fake.FakeImageService_reset()
super(_IntegratedTestBase, self).tearDown()
def _get_test_client(self):
return client.TestOpenStackClient('fake', 'fake', self.auth_url)
def _start_api_service(self):
self.osapi = service.WSGIService("osapi_compute")
self.osapi.start()
@ -133,19 +136,20 @@ class _IntegratedTestBase(test.TestCase):
image = self.api.get_images()[0]
LOG.debug("Image: %s" % image)
if 'imageRef' in image:
image_href = image['imageRef']
if self._image_ref_parameter in image:
image_href = image[self._image_ref_parameter]
else:
image_href = image['id']
image_href = 'http://fake.server/%s' % image_href
# We now have a valid imageId
server['imageRef'] = image_href
server[self._image_ref_parameter] = image_href
# Set a valid flavorId
flavor = self.api.get_flavors()[0]
LOG.debug("Using flavor: %s" % flavor)
server['flavorRef'] = 'http://fake.server/%s' % flavor['id']
server[self._flavor_ref_parameter] = ('http://fake.server/%s'
% flavor['id'])
# Set a valid server name
server_name = self.get_unused_server_name()

View File

@ -18,6 +18,7 @@
from nova.openstack.common.gettextutils import _
from nova.openstack.common import log as logging
from nova.tests.integrated.api import client
from nova.tests.integrated import integrated_helpers
@ -32,3 +33,7 @@ class LoginTest(integrated_helpers._IntegratedTestBase):
flavors = self.api.get_flavors()
for flavor in flavors:
LOG.debug(_("flavor: %s") % flavor)
class LoginTestV3(client.TestOpenStackClientV3Mixin, LoginTest):
_api_version = 'v3'

View File

@ -24,6 +24,7 @@ import traceback
from nova.openstack.common import log as logging
from nova import service
from nova.tests.integrated.api import client
from nova.tests.integrated import integrated_helpers
LOG = logging.getLogger(__name__)
@ -35,7 +36,9 @@ class MultiprocessWSGITest(integrated_helpers._IntegratedTestBase):
def _start_api_service(self):
# Process will be started in _spawn()
self.osapi = service.WSGIService("osapi_compute")
self.auth_url = 'http://%s:%s/v2' % (self.osapi.host, self.osapi.port)
self.auth_url = 'http://%(host)s:%(port)s/%(api_version)s' % ({
'host': self.osapi.host, 'port': self.osapi.port,
'api_version': self._api_version})
LOG.info('auth_url = %s' % self.auth_url)
def _get_flags(self):
@ -174,3 +177,8 @@ class MultiprocessWSGITest(integrated_helpers._IntegratedTestBase):
status = self._reap_test()
self.assertTrue(os.WIFEXITED(status))
self.assertEqual(os.WEXITSTATUS(status), 0)
class MultiprocessWSGITestV3(client.TestOpenStackClientV3Mixin,
MultiprocessWSGITest):
_api_version = 'v3'

View File

@ -33,6 +33,11 @@ LOG = logging.getLogger(__name__)
class ServersTest(integrated_helpers._IntegratedTestBase):
_api_version = 'v2'
_force_delete_parameter = 'forceDelete'
_image_ref_parameter = 'imageRef'
_flavor_ref_parameter = 'flavorRef'
_access_ipv4_parameter = 'accessIPv4'
_access_ipv6_parameter = 'accessIPv6'
def setUp(self):
super(ServersTest, self).setUp()
@ -97,20 +102,22 @@ class ServersTest(integrated_helpers._IntegratedTestBase):
self.api.post_server, post)
# With an invalid imageRef, this throws 500.
server['imageRef'] = self.get_invalid_image()
server[self._image_ref_parameter] = self.get_invalid_image()
# TODO(justinsb): Check whatever the spec says should be thrown here
self.assertRaises(client.OpenStackApiException,
self.api.post_server, post)
# Add a valid imageRef
server['imageRef'] = good_server.get('imageRef')
server[self._image_ref_parameter] = good_server.get(
self._image_ref_parameter)
# Without flavorRef, this throws 500
# TODO(justinsb): Check whatever the spec says should be thrown here
self.assertRaises(client.OpenStackApiException,
self.api.post_server, post)
server['flavorRef'] = good_server.get('flavorRef')
server[self._flavor_ref_parameter] = good_server.get(
self._flavor_ref_parameter)
# Without a name, this throws 500
# TODO(justinsb): Check whatever the spec says should be thrown here
@ -254,7 +261,8 @@ class ServersTest(integrated_helpers._IntegratedTestBase):
self.assertEqual('DELETED', found_server['status'])
# Force delete server
self.api.post_server_action(created_server_id, {'forceDelete': {}})
self.api.post_server_action(created_server_id,
{self._force_delete_parameter: {}})
# Wait for real deletion
self._wait_for_deletion(created_server_id)
@ -350,10 +358,10 @@ class ServersTest(integrated_helpers._IntegratedTestBase):
# rebuild the server with metadata and other server attributes
post = {}
post['rebuild'] = {
"imageRef": "76fa36fc-c930-4bf3-8c8a-ea2a2420deb6",
self._image_ref_parameter: "76fa36fc-c930-4bf3-8c8a-ea2a2420deb6",
"name": "blah",
"accessIPv4": "172.19.0.2",
"accessIPv6": "fe80::2",
self._access_ipv4_parameter: "172.19.0.2",
self._access_ipv6_parameter: "fe80::2",
"metadata": {'some': 'thing'},
}
@ -365,15 +373,16 @@ class ServersTest(integrated_helpers._IntegratedTestBase):
self.assertEqual(created_server_id, found_server['id'])
self.assertEqual({'some': 'thing'}, found_server.get('metadata'))
self.assertEqual('blah', found_server.get('name'))
self.assertEqual(post['rebuild']['imageRef'],
self.assertEqual(post['rebuild'][self._image_ref_parameter],
found_server.get('image')['id'])
self.assertEqual('172.19.0.2', found_server['accessIPv4'])
self.assertEqual('fe80::2', found_server['accessIPv6'])
self.assertEqual('172.19.0.2',
found_server[self._access_ipv4_parameter])
self.assertEqual('fe80::2', found_server[self._access_ipv6_parameter])
# rebuild the server with empty metadata and nothing else
post = {}
post['rebuild'] = {
"imageRef": "76fa36fc-c930-4bf3-8c8a-ea2a2420deb6",
self._image_ref_parameter: "76fa36fc-c930-4bf3-8c8a-ea2a2420deb6",
"metadata": {},
}
@ -385,10 +394,11 @@ class ServersTest(integrated_helpers._IntegratedTestBase):
self.assertEqual(created_server_id, found_server['id'])
self.assertEqual({}, found_server.get('metadata'))
self.assertEqual('blah', found_server.get('name'))
self.assertEqual(post['rebuild']['imageRef'],
self.assertEqual(post['rebuild'][self._image_ref_parameter],
found_server.get('image')['id'])
self.assertEqual('172.19.0.2', found_server['accessIPv4'])
self.assertEqual('fe80::2', found_server['accessIPv6'])
self.assertEqual('172.19.0.2',
found_server[self._access_ipv4_parameter])
self.assertEqual('fe80::2', found_server[self._access_ipv6_parameter])
# Cleanup
self._delete_server(created_server_id)
@ -489,3 +499,17 @@ class ServersTest(integrated_helpers._IntegratedTestBase):
# Cleanup
self._delete_server(created_server_id)
class ServersTestV3(client.TestOpenStackClientV3Mixin, ServersTest):
_force_delete_parameter = 'force_delete'
_api_version = 'v3'
_image_ref_parameter = 'image_ref'
_flavor_ref_parameter = 'flavor_ref'
_access_ipv4_parameter = 'access_ip_v4'
_access_ipv6_parameter = 'access_ip_v6'
def test_create_multiple_servers(self):
# TODO(cyeoh): Remove to enable the test when the V3 multiple
# create extension is merged. Bug #1206884
pass

View File

@ -20,6 +20,7 @@ from lxml import etree
from nova.api.openstack import common
from nova.api.openstack import xmlutil
from nova.openstack.common import log as logging
from nova.tests.integrated.api import client
from nova.tests.integrated import integrated_helpers
@ -51,3 +52,7 @@ class XmlTests(integrated_helpers._IntegratedTestBase):
LOG.debug("data: %s" % data)
root = etree.XML(data)
self.assertEqual(root.nsmap.get(None), common.XML_NS_V11)
class XmlTestsV3(client.TestOpenStackClientV3Mixin, XmlTests):
_api_version = 'v3'