From 52600e6bee170ac6d78eff004ecc98394c43ff6f Mon Sep 17 00:00:00 2001 From: "jaypipes@gmail.com" <> Date: Wed, 13 Oct 2010 16:17:23 -0400 Subject: Adds unit test for WSGI image controller for OpenStack API using Glance Service. --- nova/tests/api/openstack/fakes.py | 38 ++++++++------ nova/tests/api/openstack/test_images.py | 87 +++++++++++++++++++++++++++++++-- 2 files changed, 107 insertions(+), 18 deletions(-) (limited to 'nova/tests') diff --git a/nova/tests/api/openstack/fakes.py b/nova/tests/api/openstack/fakes.py index 34bc1f2a9..1d4cddffc 100644 --- a/nova/tests/api/openstack/fakes.py +++ b/nova/tests/api/openstack/fakes.py @@ -108,48 +108,56 @@ def stub_out_networking(stubs): FLAGS.FAKE_subdomain = 'api' -def stub_out_glance(stubs): +def stub_out_glance(stubs, initial_fixtures=[]): class FakeParallaxClient: - def __init__(self): - self.fixtures = {} + def __init__(self, initial_fixtures): + self.fixtures = initial_fixtures - def fake_get_images(self): + def fake_get_image_index(self): + return [dict(id=f['id'], name=f['name']) + for f in self.fixtures] + + def fake_get_image_details(self): return self.fixtures def fake_get_image_metadata(self, image_id): - for k, f in self.fixtures.iteritems(): - if k == image_id: + for f in self.fixtures: + if f['id'] == image_id: return f return None def fake_add_image_metadata(self, image_data): id = ''.join(random.choice(string.letters) for _ in range(20)) image_data['id'] = id - self.fixtures[id] = image_data + self.fixtures.append(image_data) return id def fake_update_image_metadata(self, image_id, image_data): - if image_id not in self.fixtures.keys(): + f = self.fake_get_image_metadata(image_id) + if not f: raise exc.NotFound - self.fixtures[image_id].update(image_data) + f.update(image_data) def fake_delete_image_metadata(self, image_id): - if image_id not in self.fixtures.keys(): + f = self.fake_get_image_metadata(image_id) + if not f: raise exc.NotFound - del self.fixtures[image_id] + self.fixtures.remove(f) def fake_delete_all(self): - self.fixtures = {} + self.fixtures = [] - fake_parallax_client = FakeParallaxClient() - stubs.Set(nova.image.service.ParallaxClient, 'get_images', - fake_parallax_client.fake_get_images) + fake_parallax_client = FakeParallaxClient(initial_fixtures) + stubs.Set(nova.image.service.ParallaxClient, 'get_image_index', + fake_parallax_client.fake_get_image_index) + stubs.Set(nova.image.service.ParallaxClient, 'get_image_details', + fake_parallax_client.fake_get_image_details) stubs.Set(nova.image.service.ParallaxClient, 'get_image_metadata', fake_parallax_client.fake_get_image_metadata) stubs.Set(nova.image.service.ParallaxClient, 'add_image_metadata', diff --git a/nova/tests/api/openstack/test_images.py b/nova/tests/api/openstack/test_images.py index 505fea3e2..4cbc01841 100644 --- a/nova/tests/api/openstack/test_images.py +++ b/nova/tests/api/openstack/test_images.py @@ -15,18 +15,31 @@ # License for the specific language governing permissions and limitations # under the License. +""" +Tests of the new image services, both as a service layer, +and as a WSGI layer +""" + +import json +import datetime import logging import unittest import stubout +import webob from nova import exception +from nova import flags from nova import utils +import nova.api.openstack from nova.api.openstack import images from nova.tests.api.openstack import fakes -class BaseImageServiceTests(): +FLAGS = flags.FLAGS + + +class BaseImageServiceTests(object): """Tasks to test for all image services""" @@ -98,13 +111,16 @@ class BaseImageServiceTests(): 'serverId': None, 'progress': None}] + num_images = len(self.service.index()) + self.assertEquals(0, num_images, str(self.service.index())) + ids = [] for fixture in fixtures: new_id = self.service.create(fixture) ids.append(new_id) num_images = len(self.service.index()) - self.assertEquals(2, num_images) + self.assertEquals(2, num_images, str(self.service.index())) self.service.delete(ids[0]) @@ -135,7 +151,72 @@ class GlanceImageServiceTest(unittest.TestCase, self.stubs = stubout.StubOutForTesting() fakes.stub_out_glance(self.stubs) self.service = utils.import_object('nova.image.service.GlanceImageService') + self.service.delete_all() + + def tearDown(self): + self.stubs.UnsetAll() + + +class ImageControllerWithGlanceServiceTest(unittest.TestCase): + + """Test of the OpenStack API /images application controller""" + + # Registered images at start of each test. + + IMAGE_FIXTURES = [ + {'id': '23g2ogk23k4hhkk4k42l', + 'name': 'public image #1', + 'created_at': str(datetime.datetime.utcnow()), + 'modified_at': str(datetime.datetime.utcnow()), + 'deleted_at': None, + 'deleted': False, + 'is_public': True, + 'status': 'available', + 'image_type': 'kernel' + }, + {'id': 'slkduhfas73kkaskgdas', + 'name': 'public image #2', + 'created_at': str(datetime.datetime.utcnow()), + 'modified_at': str(datetime.datetime.utcnow()), + 'deleted_at': None, + 'deleted': False, + 'is_public': True, + 'status': 'available', + 'image_type': 'ramdisk' + }, + ] + + def setUp(self): + self.orig_image_service = FLAGS.image_service + FLAGS.image_service = 'nova.image.service.GlanceImageService' + self.stubs = stubout.StubOutForTesting() + fakes.FakeAuthManager.auth_data = {} + fakes.FakeAuthDatabase.data = {} + fakes.stub_out_networking(self.stubs) + fakes.stub_out_rate_limiting(self.stubs) + fakes.stub_out_auth(self.stubs) + fakes.stub_out_key_pair_funcs(self.stubs) + fakes.stub_out_glance(self.stubs, initial_fixtures=self.IMAGE_FIXTURES) def tearDown(self): - self.service.delete_all() self.stubs.UnsetAll() + FLAGS.image_service = self.orig_image_service + + def test_get_image_index(self): + req = webob.Request.blank('/v1.0/images') + res = req.get_response(nova.api.API()) + res_dict = json.loads(res.body) + + fixture_index = [dict(id=f['id'], name=f['name']) for f + in self.IMAGE_FIXTURES] + + for image in res_dict['images']: + self.assertEquals(1, fixture_index.count(image), "image %s not in fixture index!" % str(image)) + + def test_get_image_details(self): + req = webob.Request.blank('/v1.0/images/detail') + res = req.get_response(nova.api.API()) + res_dict = json.loads(res.body) + + for image in res_dict['images']: + self.assertEquals(1, self.IMAGE_FIXTURES.count(image), "image %s not in fixtures!" % str(image)) -- cgit