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:
parent
ff6e64992b
commit
ab16b4a7b2
|
@ -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)
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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'
|
||||
|
|
|
@ -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'
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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'
|
||||
|
|
Loading…
Reference in New Issue