From 3d9d99a53d372abf9f69f1d6e66fa6c6491ec752 Mon Sep 17 00:00:00 2001 From: Sandy Walsh Date: Thu, 3 Mar 2011 19:27:15 -0400 Subject: tests passing --- nova/tests/test_service.py | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'nova/tests') diff --git a/nova/tests/test_service.py b/nova/tests/test_service.py index 45d9afa6c..cb31a3c43 100644 --- a/nova/tests/test_service.py +++ b/nova/tests/test_service.py @@ -120,6 +120,12 @@ class ServiceTestCase(test.TestCase): proxy=mox.IsA(service.Service)).AndReturn( rpc.AdapterConsumer) + rpc.AdapterConsumer(connection=mox.IgnoreArg(), + topic='%s_fanout' % topic, + proxy=mox.IsA(service.Service)).AndReturn( + rpc.AdapterConsumer) + + rpc.AdapterConsumer.attach_to_eventlet() rpc.AdapterConsumer.attach_to_eventlet() rpc.AdapterConsumer.attach_to_eventlet() -- cgit From 05065a72ab06879d8ddd48ab45bc870386a0562d Mon Sep 17 00:00:00 2001 From: Sandy Walsh Date: Wed, 23 Feb 2011 14:41:11 -0800 Subject: tests working again --- nova/tests/test_rpc.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'nova/tests') diff --git a/nova/tests/test_rpc.py b/nova/tests/test_rpc.py index 4820e04fb..44d7c91eb 100644 --- a/nova/tests/test_rpc.py +++ b/nova/tests/test_rpc.py @@ -36,7 +36,7 @@ class RpcTestCase(test.TestCase): super(RpcTestCase, self).setUp() self.conn = rpc.Connection.instance(True) self.receiver = TestReceiver() - self.consumer = rpc.AdapterConsumer(connection=self.conn, + self.consumer = rpc.TopicAdapterConsumer(connection=self.conn, topic='test', proxy=self.receiver) self.consumer.attach_to_eventlet() @@ -97,7 +97,7 @@ class RpcTestCase(test.TestCase): nested = Nested() conn = rpc.Connection.instance(True) - consumer = rpc.AdapterConsumer(connection=conn, + consumer = rpc.TopicAdapterConsumer(connection=conn, topic='nested', proxy=nested) consumer.attach_to_eventlet() -- cgit From 05fc3ea219f36bc1c246179b25b1feb017888b01 Mon Sep 17 00:00:00 2001 From: Sandy Walsh Date: Wed, 23 Feb 2011 17:58:32 -0800 Subject: Tests all working again --- nova/tests/test_service.py | 25 ++++++++++++++----------- nova/tests/test_test.py | 2 +- 2 files changed, 15 insertions(+), 12 deletions(-) (limited to 'nova/tests') diff --git a/nova/tests/test_service.py b/nova/tests/test_service.py index cb31a3c43..b006caadd 100644 --- a/nova/tests/test_service.py +++ b/nova/tests/test_service.py @@ -108,26 +108,29 @@ class ServiceTestCase(test.TestCase): app = service.Service.create(host=host, binary=binary) self.mox.StubOutWithMock(rpc, - 'AdapterConsumer', + 'TopicAdapterConsumer', use_mock_anything=True) - rpc.AdapterConsumer(connection=mox.IgnoreArg(), + self.mox.StubOutWithMock(rpc, + 'FanoutAdapterConsumer', + use_mock_anything=True) + rpc.TopicAdapterConsumer(connection=mox.IgnoreArg(), topic=topic, proxy=mox.IsA(service.Service)).AndReturn( - rpc.AdapterConsumer) + rpc.TopicAdapterConsumer) - rpc.AdapterConsumer(connection=mox.IgnoreArg(), + rpc.TopicAdapterConsumer(connection=mox.IgnoreArg(), topic='%s.%s' % (topic, host), proxy=mox.IsA(service.Service)).AndReturn( - rpc.AdapterConsumer) + rpc.TopicAdapterConsumer) - rpc.AdapterConsumer(connection=mox.IgnoreArg(), - topic='%s_fanout' % topic, + rpc.FanoutAdapterConsumer(connection=mox.IgnoreArg(), + topic=topic, proxy=mox.IsA(service.Service)).AndReturn( - rpc.AdapterConsumer) + rpc.FanoutAdapterConsumer) - rpc.AdapterConsumer.attach_to_eventlet() - rpc.AdapterConsumer.attach_to_eventlet() - rpc.AdapterConsumer.attach_to_eventlet() + rpc.TopicAdapterConsumer.attach_to_eventlet() + rpc.TopicAdapterConsumer.attach_to_eventlet() + rpc.FanoutAdapterConsumer.attach_to_eventlet() service_create = {'host': host, 'binary': binary, diff --git a/nova/tests/test_test.py b/nova/tests/test_test.py index e237674e6..35c838065 100644 --- a/nova/tests/test_test.py +++ b/nova/tests/test_test.py @@ -34,7 +34,7 @@ class IsolationTestCase(test.TestCase): def test_rpc_consumer_isolation(self): connection = rpc.Connection.instance(new=True) - consumer = rpc.TopicConsumer(connection, topic='compute') + consumer = rpc.TopicAdapterConsumer(connection, topic='compute') consumer.register_callback( lambda x, y: self.fail('I should never be called')) consumer.attach_to_eventlet() -- cgit From c8df2602fd8f4f2cb7716e6283f3779c6895a479 Mon Sep 17 00:00:00 2001 From: Sandy Walsh Date: Thu, 24 Feb 2011 14:32:25 -0800 Subject: service capabilities test --- nova/tests/test_zones.py | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) (limited to 'nova/tests') diff --git a/nova/tests/test_zones.py b/nova/tests/test_zones.py index 5a52a0506..3ca71d5f1 100644 --- a/nova/tests/test_zones.py +++ b/nova/tests/test_zones.py @@ -76,6 +76,34 @@ class ZoneManagerTestCase(test.TestCase): self.assertEquals(len(zm.zone_states), 1) self.assertEquals(zm.zone_states[1].username, 'user1') + def test_service_capabilities(self): + zm = zone_manager.ZoneManager() + caps = zm.get_zone_capabilities(self, None) + self.assertEquals(caps, {}) + + zm.update_service_capabilities("svc1", "host1", dict(a=1, b=2)) + caps = zm.get_zone_capabilities(self, None) + self.assertEquals(caps, dict(svc1_a=(1, 1), svc1_b=(2, 2))) + + zm.update_service_capabilities("svc1", "host1", dict(a=2, b=3)) + caps = zm.get_zone_capabilities(self, None) + self.assertEquals(caps, dict(svc1_a=(2, 2), svc1_b=(3, 3))) + + zm.update_service_capabilities("svc1", "host2", dict(a=20, b=30)) + caps = zm.get_zone_capabilities(self, None) + self.assertEquals(caps, dict(svc1_a=(2, 20), svc1_b=(3, 30))) + + zm.update_service_capabilities("svc10", "host1", dict(a=99, b=99)) + caps = zm.get_zone_capabilities(self, None) + self.assertEquals(caps, dict(svc1_a=(2, 20), svc1_b=(3, 30), + svc10_a=(99, 99), svc10_b=(99, 99))) + + zm.update_service_capabilities("svc1", "host3", dict(c=5)) + caps = zm.get_zone_capabilities(self, None) + self.assertEquals(caps, dict(svc1_a=(2, 20), svc1_b=(3, 30), + svc1_c=(5, 5), svc10_a=(99, 99), + svc10_b=(99, 99))) + def test_refresh_from_db_replace_existing(self): zm = zone_manager.ZoneManager() zone_state = zone_manager.ZoneState() -- cgit From 47bbfaab52642f3ff79bcdefb8d705fb02b549f9 Mon Sep 17 00:00:00 2001 From: Sandy Walsh Date: Thu, 24 Feb 2011 15:23:15 -0800 Subject: new tests --- nova/tests/api/openstack/test_zones.py | 30 +++++++++++++++++++++++++++--- nova/tests/test_zones.py | 6 ++++++ 2 files changed, 33 insertions(+), 3 deletions(-) (limited to 'nova/tests') diff --git a/nova/tests/api/openstack/test_zones.py b/nova/tests/api/openstack/test_zones.py index 82b892b9e..33a66df0b 100644 --- a/nova/tests/api/openstack/test_zones.py +++ b/nova/tests/api/openstack/test_zones.py @@ -75,6 +75,10 @@ def zone_get_all_db(context): ] +def zone_caps(method, context, params): + return dict() + + class ZonesTest(test.TestCase): def setUp(self): super(ZonesTest, self).setUp() @@ -93,13 +97,18 @@ class ZonesTest(test.TestCase): self.stubs.Set(nova.db, 'zone_create', zone_create) self.stubs.Set(nova.db, 'zone_delete', zone_delete) + self.old_zone_name = FLAGS.zone_name + self.old_zone_caps = FLAGS.zone_capabilities + def tearDown(self): self.stubs.UnsetAll() FLAGS.allow_admin_api = self.allow_admin + FLAGS.zone_name = self.old_zone_name + FLAGS.zone_capabilities = self.old_zone_caps super(ZonesTest, self).tearDown() def test_get_zone_list_scheduler(self): - self.stubs.Set(api.API, '_call_scheduler', zone_get_all_scheduler) + self.stubs.Set(api, '_call_scheduler', zone_get_all_scheduler) req = webob.Request.blank('/v1.0/zones') res = req.get_response(fakes.wsgi_app()) res_dict = json.loads(res.body) @@ -108,8 +117,7 @@ class ZonesTest(test.TestCase): self.assertEqual(len(res_dict['zones']), 2) def test_get_zone_list_db(self): - self.stubs.Set(api.API, '_call_scheduler', - zone_get_all_scheduler_empty) + self.stubs.Set(api, '_call_scheduler', zone_get_all_scheduler_empty) self.stubs.Set(nova.db, 'zone_get_all', zone_get_all_db) req = webob.Request.blank('/v1.0/zones') res = req.get_response(fakes.wsgi_app()) @@ -162,3 +170,19 @@ class ZonesTest(test.TestCase): self.assertEqual(res_dict['zone']['id'], 1) self.assertEqual(res_dict['zone']['api_url'], 'http://example.com') self.assertFalse('username' in res_dict['zone']) + + def test_zone_info(self): + FLAGS.zone_name = 'darksecret' + FLAGS.zone_capabilities = 'cap1:a,b;cap2:c,d' + self.stubs.Set(api, '_call_scheduler', zone_caps) + + body = dict(zone=dict(username='zeb', password='sneaky')) + req = webob.Request.blank('/v1.0/zones/info') + + res = req.get_response(fakes.wsgi_app()) + res_dict = json.loads(res.body) + self.assertEqual(res.status_int, 200) + self.assertEqual(res_dict['zone']['name'], 'darksecret') + self.assertEqual(res_dict['zone']['cap1'], 'a,b') + self.assertEqual(res_dict['zone']['cap2'], 'c,d') + diff --git a/nova/tests/test_zones.py b/nova/tests/test_zones.py index 3ca71d5f1..79d766f28 100644 --- a/nova/tests/test_zones.py +++ b/nova/tests/test_zones.py @@ -104,6 +104,12 @@ class ZoneManagerTestCase(test.TestCase): svc1_c=(5, 5), svc10_a=(99, 99), svc10_b=(99, 99))) + caps = zm.get_zone_capabilities(self, 'svc1') + self.assertEquals(caps, dict(svc1_a=(2, 20), svc1_b=(3, 30), + svc1_c=(5, 5))) + caps = zm.get_zone_capabilities(self, 'svc10') + self.assertEquals(caps, dict(svc10_a=(99, 99), svc10_b=(99, 99))) + def test_refresh_from_db_replace_existing(self): zm = zone_manager.ZoneManager() zone_state = zone_manager.ZoneState() -- cgit From 307dcb7906ff066e2883cdee8998dfa78ebc8221 Mon Sep 17 00:00:00 2001 From: Sandy Walsh Date: Thu, 24 Feb 2011 15:44:27 -0800 Subject: sorry, pep8 --- nova/tests/api/openstack/test_zones.py | 5 ++--- nova/tests/test_zones.py | 10 +++++----- 2 files changed, 7 insertions(+), 8 deletions(-) (limited to 'nova/tests') diff --git a/nova/tests/api/openstack/test_zones.py b/nova/tests/api/openstack/test_zones.py index 33a66df0b..a40d46749 100644 --- a/nova/tests/api/openstack/test_zones.py +++ b/nova/tests/api/openstack/test_zones.py @@ -76,7 +76,7 @@ def zone_get_all_db(context): def zone_caps(method, context, params): - return dict() + return dict() class ZonesTest(test.TestCase): @@ -175,7 +175,7 @@ class ZonesTest(test.TestCase): FLAGS.zone_name = 'darksecret' FLAGS.zone_capabilities = 'cap1:a,b;cap2:c,d' self.stubs.Set(api, '_call_scheduler', zone_caps) - + body = dict(zone=dict(username='zeb', password='sneaky')) req = webob.Request.blank('/v1.0/zones/info') @@ -185,4 +185,3 @@ class ZonesTest(test.TestCase): self.assertEqual(res_dict['zone']['name'], 'darksecret') self.assertEqual(res_dict['zone']['cap1'], 'a,b') self.assertEqual(res_dict['zone']['cap2'], 'c,d') - diff --git a/nova/tests/test_zones.py b/nova/tests/test_zones.py index 79d766f28..48e1442cf 100644 --- a/nova/tests/test_zones.py +++ b/nova/tests/test_zones.py @@ -88,28 +88,28 @@ class ZoneManagerTestCase(test.TestCase): zm.update_service_capabilities("svc1", "host1", dict(a=2, b=3)) caps = zm.get_zone_capabilities(self, None) self.assertEquals(caps, dict(svc1_a=(2, 2), svc1_b=(3, 3))) - + zm.update_service_capabilities("svc1", "host2", dict(a=20, b=30)) caps = zm.get_zone_capabilities(self, None) self.assertEquals(caps, dict(svc1_a=(2, 20), svc1_b=(3, 30))) - + zm.update_service_capabilities("svc10", "host1", dict(a=99, b=99)) caps = zm.get_zone_capabilities(self, None) self.assertEquals(caps, dict(svc1_a=(2, 20), svc1_b=(3, 30), svc10_a=(99, 99), svc10_b=(99, 99))) - + zm.update_service_capabilities("svc1", "host3", dict(c=5)) caps = zm.get_zone_capabilities(self, None) self.assertEquals(caps, dict(svc1_a=(2, 20), svc1_b=(3, 30), svc1_c=(5, 5), svc10_a=(99, 99), svc10_b=(99, 99))) - + caps = zm.get_zone_capabilities(self, 'svc1') self.assertEquals(caps, dict(svc1_a=(2, 20), svc1_b=(3, 30), svc1_c=(5, 5))) caps = zm.get_zone_capabilities(self, 'svc10') self.assertEquals(caps, dict(svc10_a=(99, 99), svc10_b=(99, 99))) - + def test_refresh_from_db_replace_existing(self): zm = zone_manager.ZoneManager() zone_state = zone_manager.ZoneState() -- cgit From 6b95c5133452ae26da2cb7f08267aa4cb056e7af Mon Sep 17 00:00:00 2001 From: Dan Prince Date: Thu, 10 Mar 2011 15:05:04 -0500 Subject: Initial support fo extension resources. Tests. --- nova/tests/api/openstack/test_extensions.py | 83 +++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 nova/tests/api/openstack/test_extensions.py (limited to 'nova/tests') diff --git a/nova/tests/api/openstack/test_extensions.py b/nova/tests/api/openstack/test_extensions.py new file mode 100644 index 000000000..f5332c84a --- /dev/null +++ b/nova/tests/api/openstack/test_extensions.py @@ -0,0 +1,83 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2011 OpenStack LLC. +# All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +import unittest + +import webob + +from nova.api import openstack +import nova.wsgi + +class StubController(nova.wsgi.Controller): + + def __init__(self, body): + self.body = body + + def index(self, req): + return self.body + +class StubExtensionManager(object): + + def __init__(self, resources): + self.resources = resources + + def get_resources(self): + return self.resources + +class WidgetExtensionResource(object): + + def __init__(self, name, collection, wsgi_app): + self.name = name + self.collection = collection + self.wsgi_app = wsgi_app + + def add_routes(self, mapper): + mapper.resource(self.name, self.collection, controller=self.wsgi_app) + +class ExtensionTest(unittest.TestCase): + + def test_no_extension_present(self): + manager = StubExtensionManager([]) + router = openstack.APIRouter(manager) + request = webob.Request.blank("/widgets") + response = request.get_response(router) + self.assertEqual(404, response.status_int) + + def test_get_resources(self): + response_body = "Buy more widgets!" + response = webob.Response() + response.body = response_body + resource1 = WidgetExtensionResource("widget", "widgets", response) + manager = StubExtensionManager([resource1]) + router = openstack.APIRouter(manager) + request = webob.Request.blank("/widgets") + response = request.get_response(router) + self.assertEqual(200, response.status_int) + self.assertEqual(response_body, response.body) + + def test_get_resources_with_controller(self): + response_body = "Buy more widgets!" + controller = StubController(response_body) + resource1 = WidgetExtensionResource("widget", "widgets", controller) + manager = StubExtensionManager([resource1]) + router = openstack.APIRouter(manager) + request = webob.Request.blank("/widgets") + response = request.get_response(router) + self.assertEqual(200, response.status_int) + self.assertEqual(response_body, response.body) + + -- cgit From 7d4eae131f2f844f368aa5ff79c68191756775b6 Mon Sep 17 00:00:00 2001 From: Dan Prince Date: Fri, 11 Mar 2011 14:33:12 -0500 Subject: Add config for osapi_extensions_path. Update the ExtensionManager so that it loads extensions in the osapi_extensions_path. --- nova/tests/api/openstack/extensions/widgets.py | 27 ++++++++++++++++++++++++++ nova/tests/api/openstack/test_extensions.py | 19 ++++++++++++++++++ 2 files changed, 46 insertions(+) create mode 100644 nova/tests/api/openstack/extensions/widgets.py (limited to 'nova/tests') diff --git a/nova/tests/api/openstack/extensions/widgets.py b/nova/tests/api/openstack/extensions/widgets.py new file mode 100644 index 000000000..bc0947223 --- /dev/null +++ b/nova/tests/api/openstack/extensions/widgets.py @@ -0,0 +1,27 @@ +from nova import wsgi + +class WidgetController(wsgi.Controller): + + def index(self, req): + return "Buy more widgets!" + +class WidgetExtensionResource(object): + + def __init__(self): + pass + + def add_routes(self, mapper): + mapper.resource('widget', 'widgets', controller=WidgetController()) + + +class WidgetExtension(object): + + def __init__(self): + pass + + def get_resources(self): + return WidgetExtensionResource() + + +def get_extension(): + return WidgetExtension() diff --git a/nova/tests/api/openstack/test_extensions.py b/nova/tests/api/openstack/test_extensions.py index f5332c84a..ff41d6d99 100644 --- a/nova/tests/api/openstack/test_extensions.py +++ b/nova/tests/api/openstack/test_extensions.py @@ -16,12 +16,16 @@ # under the License. import unittest +import os.path import webob +from nova import flags from nova.api import openstack import nova.wsgi +FLAGS = flags.FLAGS + class StubController(nova.wsgi.Controller): def __init__(self, body): @@ -81,3 +85,18 @@ class ExtensionTest(unittest.TestCase): self.assertEqual(response_body, response.body) +class ExtensionManagerTest(unittest.TestCase): + + def setUp(self): + FLAGS.osapi_extensions_path = os.path.join(os.path.dirname(__file__), + "extensions") + + def test_get_resources(self): + router = openstack.APIRouter() + request = webob.Request.blank("/widgets") + response = request.get_response(router) + self.assertEqual(200, response.status_int) + self.assertEqual("Buy more widgets!", response.body) + + + -- cgit From 2bfa7b29c7882da559041cea771b9243555828fa Mon Sep 17 00:00:00 2001 From: Dan Prince Date: Sun, 13 Mar 2011 13:51:42 -0400 Subject: The extension name is constructed from the camel cased module_name + 'Extension'. --- nova/tests/api/openstack/extensions/widgets.py | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) (limited to 'nova/tests') diff --git a/nova/tests/api/openstack/extensions/widgets.py b/nova/tests/api/openstack/extensions/widgets.py index bc0947223..e03fc7776 100644 --- a/nova/tests/api/openstack/extensions/widgets.py +++ b/nova/tests/api/openstack/extensions/widgets.py @@ -1,27 +1,23 @@ from nova import wsgi -class WidgetController(wsgi.Controller): +class WidgetsController(wsgi.Controller): def index(self, req): return "Buy more widgets!" -class WidgetExtensionResource(object): +class WidgetsExtensionResource(object): def __init__(self): pass def add_routes(self, mapper): - mapper.resource('widget', 'widgets', controller=WidgetController()) + mapper.resource('widget', 'widgets', controller=WidgetsController()) -class WidgetExtension(object): +class WidgetsExtension(object): def __init__(self): pass def get_resources(self): - return WidgetExtensionResource() - - -def get_extension(): - return WidgetExtension() + return WidgetsExtensionResource() -- cgit From 229c5bc3324d5df39ca959d71a540a806bc5ad3e Mon Sep 17 00:00:00 2001 From: Dan Prince Date: Mon, 14 Mar 2011 16:58:03 -0400 Subject: Implement action extensions. --- nova/tests/api/openstack/extensions/widgets.py | 22 +++++++++++++ nova/tests/api/openstack/test_extensions.py | 44 ++++++++++++++++++++++++-- 2 files changed, 64 insertions(+), 2 deletions(-) (limited to 'nova/tests') diff --git a/nova/tests/api/openstack/extensions/widgets.py b/nova/tests/api/openstack/extensions/widgets.py index e03fc7776..6839d2bb2 100644 --- a/nova/tests/api/openstack/extensions/widgets.py +++ b/nova/tests/api/openstack/extensions/widgets.py @@ -1,10 +1,14 @@ from nova import wsgi +from nova.api.openstack import extensions + + class WidgetsController(wsgi.Controller): def index(self, req): return "Buy more widgets!" + class WidgetsExtensionResource(object): def __init__(self): @@ -21,3 +25,21 @@ class WidgetsExtension(object): def get_resources(self): return WidgetsExtensionResource() + + def get_actions(self): + actions = [] + actions.append(extensions.ExtensionAction('server', 'servers', + 'add_widget', + self._add_widget)) + actions.append(extensions.ExtensionAction('server', 'servers', + 'delete_widget', + self._delete_widget)) + return actions + + def _add_widget(self, input_dict, req, id): + + return "Widget Added." + + def _delete_widget(self, input_dict, req, id): + + return "Widget Deleted." diff --git a/nova/tests/api/openstack/test_extensions.py b/nova/tests/api/openstack/test_extensions.py index ff41d6d99..f8d217e9c 100644 --- a/nova/tests/api/openstack/test_extensions.py +++ b/nova/tests/api/openstack/test_extensions.py @@ -15,10 +15,10 @@ # License for the specific language governing permissions and limitations # under the License. +import json import unittest -import os.path - import webob +import os.path from nova import flags from nova.api import openstack @@ -26,6 +26,7 @@ import nova.wsgi FLAGS = flags.FLAGS + class StubController(nova.wsgi.Controller): def __init__(self, body): @@ -34,6 +35,7 @@ class StubController(nova.wsgi.Controller): def index(self, req): return self.body + class StubExtensionManager(object): def __init__(self, resources): @@ -42,6 +44,7 @@ class StubExtensionManager(object): def get_resources(self): return self.resources + class WidgetExtensionResource(object): def __init__(self, name, collection, wsgi_app): @@ -52,6 +55,7 @@ class WidgetExtensionResource(object): def add_routes(self, mapper): mapper.resource(self.name, self.collection, controller=self.wsgi_app) + class ExtensionTest(unittest.TestCase): def test_no_extension_present(self): @@ -99,4 +103,40 @@ class ExtensionManagerTest(unittest.TestCase): self.assertEqual("Buy more widgets!", response.body) +class ExtendedActionTest(unittest.TestCase): + def setUp(self): + FLAGS.osapi_extensions_path = os.path.join(os.path.dirname(__file__), + "extensions") + + def test_extended_action(self): + app = openstack.APIRouter() + ext_midware = openstack.extensions.ExtensionMiddleware(app) + body = dict(add_widget=dict(name="test")) + request = webob.Request.blank("/servers/1/action") + request.method = 'POST' + request.content_type = 'application/json' + request.body = json.dumps(body) + response = request.get_response(ext_midware) + self.assertEqual(200, response.status_int) + self.assertEqual("Widget Added.", response.body) + + def test_invalid_action_body(self): + app = openstack.APIRouter() + ext_midware = openstack.extensions.ExtensionMiddleware(app) + body = dict(blah=dict(name="test")) # Doesn't exist + request = webob.Request.blank("/servers/1/action") + request.method = 'POST' + request.content_type = 'application/json' + request.body = json.dumps(body) + response = request.get_response(ext_midware) + self.assertEqual(501, response.status_int) + + def test_invalid_action(self): + app = openstack.APIRouter() + ext_midware = openstack.extensions.ExtensionMiddleware(app) + request = webob.Request.blank("/asdf/1/action") + request.method = 'POST' + request.content_type = 'application/json' + response = request.get_response(ext_midware) + self.assertEqual(404, response.status_int) -- cgit From f0141b1616e1b1fc9e52e33b37cc3a1091c57587 Mon Sep 17 00:00:00 2001 From: Dan Prince Date: Mon, 14 Mar 2011 22:24:34 -0400 Subject: Moved extended resource code into the extensions.py module. --- nova/tests/api/openstack/extensions/widgets.py | 15 ++---- nova/tests/api/openstack/test_extensions.py | 66 +++++++++++++------------- 2 files changed, 38 insertions(+), 43 deletions(-) (limited to 'nova/tests') diff --git a/nova/tests/api/openstack/extensions/widgets.py b/nova/tests/api/openstack/extensions/widgets.py index 6839d2bb2..d5a2d95d9 100644 --- a/nova/tests/api/openstack/extensions/widgets.py +++ b/nova/tests/api/openstack/extensions/widgets.py @@ -9,22 +9,17 @@ class WidgetsController(wsgi.Controller): return "Buy more widgets!" -class WidgetsExtensionResource(object): - - def __init__(self): - pass - - def add_routes(self, mapper): - mapper.resource('widget', 'widgets', controller=WidgetsController()) - - class WidgetsExtension(object): def __init__(self): pass def get_resources(self): - return WidgetsExtensionResource() + resources = [] + widgets = extensions.ExtensionResource('widget', 'widgets', + WidgetsController()) + resources.append(widgets) + return resources def get_actions(self): actions = [] diff --git a/nova/tests/api/openstack/test_extensions.py b/nova/tests/api/openstack/test_extensions.py index f8d217e9c..080760c14 100644 --- a/nova/tests/api/openstack/test_extensions.py +++ b/nova/tests/api/openstack/test_extensions.py @@ -22,6 +22,7 @@ import os.path from nova import flags from nova.api import openstack +from nova.api.openstack import extensions import nova.wsgi FLAGS = flags.FLAGS @@ -38,53 +39,51 @@ class StubController(nova.wsgi.Controller): class StubExtensionManager(object): - def __init__(self, resources): - self.resources = resources + def __init__(self, resource): + self.resource = resource def get_resources(self): - return self.resources + resources = [] + if self.resource: + resources.append(self.resource) + return resources + def get_actions(self): + actions = [] + return actions -class WidgetExtensionResource(object): - def __init__(self, name, collection, wsgi_app): - self.name = name - self.collection = collection - self.wsgi_app = wsgi_app - - def add_routes(self, mapper): - mapper.resource(self.name, self.collection, controller=self.wsgi_app) - - -class ExtensionTest(unittest.TestCase): +class ExtensionResourceTest(unittest.TestCase): def test_no_extension_present(self): - manager = StubExtensionManager([]) - router = openstack.APIRouter(manager) + manager = StubExtensionManager(None) + app = openstack.APIRouter() + ext_midware = extensions.ExtensionMiddleware(app, manager) request = webob.Request.blank("/widgets") - response = request.get_response(router) + response = request.get_response(ext_midware) self.assertEqual(404, response.status_int) def test_get_resources(self): response_body = "Buy more widgets!" - response = webob.Response() - response.body = response_body - resource1 = WidgetExtensionResource("widget", "widgets", response) - manager = StubExtensionManager([resource1]) - router = openstack.APIRouter(manager) + widgets = extensions.ExtensionResource('widget', 'widgets', + StubController(response_body)) + manager = StubExtensionManager(widgets) + app = openstack.APIRouter() + ext_midware = extensions.ExtensionMiddleware(app, manager) request = webob.Request.blank("/widgets") - response = request.get_response(router) + response = request.get_response(ext_midware) self.assertEqual(200, response.status_int) self.assertEqual(response_body, response.body) def test_get_resources_with_controller(self): response_body = "Buy more widgets!" - controller = StubController(response_body) - resource1 = WidgetExtensionResource("widget", "widgets", controller) - manager = StubExtensionManager([resource1]) - router = openstack.APIRouter(manager) + widgets = extensions.ExtensionResource('widget', 'widgets', + StubController(response_body)) + manager = StubExtensionManager(widgets) + app = openstack.APIRouter() + ext_midware = extensions.ExtensionMiddleware(app, manager) request = webob.Request.blank("/widgets") - response = request.get_response(router) + response = request.get_response(ext_midware) self.assertEqual(200, response.status_int) self.assertEqual(response_body, response.body) @@ -96,9 +95,10 @@ class ExtensionManagerTest(unittest.TestCase): "extensions") def test_get_resources(self): - router = openstack.APIRouter() + app = openstack.APIRouter() + ext_midware = extensions.ExtensionMiddleware(app) request = webob.Request.blank("/widgets") - response = request.get_response(router) + response = request.get_response(ext_midware) self.assertEqual(200, response.status_int) self.assertEqual("Buy more widgets!", response.body) @@ -111,7 +111,7 @@ class ExtendedActionTest(unittest.TestCase): def test_extended_action(self): app = openstack.APIRouter() - ext_midware = openstack.extensions.ExtensionMiddleware(app) + ext_midware = extensions.ExtensionMiddleware(app) body = dict(add_widget=dict(name="test")) request = webob.Request.blank("/servers/1/action") request.method = 'POST' @@ -123,7 +123,7 @@ class ExtendedActionTest(unittest.TestCase): def test_invalid_action_body(self): app = openstack.APIRouter() - ext_midware = openstack.extensions.ExtensionMiddleware(app) + ext_midware = extensions.ExtensionMiddleware(app) body = dict(blah=dict(name="test")) # Doesn't exist request = webob.Request.blank("/servers/1/action") request.method = 'POST' @@ -134,7 +134,7 @@ class ExtendedActionTest(unittest.TestCase): def test_invalid_action(self): app = openstack.APIRouter() - ext_midware = openstack.extensions.ExtensionMiddleware(app) + ext_midware = extensions.ExtensionMiddleware(app) request = webob.Request.blank("/asdf/1/action") request.method = 'POST' request.content_type = 'application/json' -- cgit From 0053b776276e9cac617c812931c248be7e49fea2 Mon Sep 17 00:00:00 2001 From: Dan Prince Date: Tue, 15 Mar 2011 23:00:09 -0400 Subject: Add ResponseExtensions. --- nova/tests/api/openstack/extensions/widgets.py | 26 +++++-- nova/tests/api/openstack/test_extensions.py | 103 ++++++++++++++++++------- 2 files changed, 95 insertions(+), 34 deletions(-) (limited to 'nova/tests') diff --git a/nova/tests/api/openstack/extensions/widgets.py b/nova/tests/api/openstack/extensions/widgets.py index d5a2d95d9..f463721f1 100644 --- a/nova/tests/api/openstack/extensions/widgets.py +++ b/nova/tests/api/openstack/extensions/widgets.py @@ -1,3 +1,5 @@ +import json + from nova import wsgi from nova.api.openstack import extensions @@ -9,28 +11,40 @@ class WidgetsController(wsgi.Controller): return "Buy more widgets!" -class WidgetsExtension(object): +class Widgets(object): def __init__(self): pass def get_resources(self): resources = [] - widgets = extensions.ExtensionResource('widget', 'widgets', + widgets = extensions.ResourceExtension('widgets', WidgetsController()) resources.append(widgets) return resources def get_actions(self): actions = [] - actions.append(extensions.ExtensionAction('server', 'servers', - 'add_widget', + actions.append(extensions.ActionExtension('servers', 'add_widget', self._add_widget)) - actions.append(extensions.ExtensionAction('server', 'servers', - 'delete_widget', + actions.append(extensions.ActionExtension('servers', 'delete_widget', self._delete_widget)) return actions + def get_response_extensions(self): + response_exts = [] + + def _resp_handler(res): + # only handle JSON responses + data = json.loads(res.body) + data['flavor']['widgets'] = "Buy more widgets!" + return data + + widgets = extensions.ResponseExtension('/v1.0/flavors/:(id)', 'GET', + _resp_handler) + response_exts.append(widgets) + return response_exts + def _add_widget(self, input_dict, req, id): return "Widget Added." diff --git a/nova/tests/api/openstack/test_extensions.py b/nova/tests/api/openstack/test_extensions.py index 080760c14..8725c8f0e 100644 --- a/nova/tests/api/openstack/test_extensions.py +++ b/nova/tests/api/openstack/test_extensions.py @@ -16,13 +16,17 @@ # under the License. import json +import stubout import unittest import webob import os.path +from nova import context from nova import flags from nova.api import openstack from nova.api.openstack import extensions +from nova.api.openstack import flavors +from nova.tests.api.openstack import fakes import nova.wsgi FLAGS = flags.FLAGS @@ -39,21 +43,31 @@ class StubController(nova.wsgi.Controller): class StubExtensionManager(object): - def __init__(self, resource): - self.resource = resource + def __init__(self, resource_ext=None, action_ext=None, response_ext=None): + self.resource_ext = resource_ext + self.action_ext = action_ext + self.response_ext = response_ext def get_resources(self): - resources = [] - if self.resource: - resources.append(self.resource) - return resources + resource_exts = [] + if self.resource_ext: + resource_exts.append(self.resource_ext) + return resource_exts def get_actions(self): - actions = [] - return actions + action_exts = [] + if self.action_ext: + action_exts.append(self.action_ext) + return action_exts + def get_response_extensions(self): + response_exts = [] + if self.response_ext: + response_exts.append(self.response_ext) + return response_exts -class ExtensionResourceTest(unittest.TestCase): + +class ResourceExtensionTest(unittest.TestCase): def test_no_extension_present(self): manager = StubExtensionManager(None) @@ -65,7 +79,7 @@ class ExtensionResourceTest(unittest.TestCase): def test_get_resources(self): response_body = "Buy more widgets!" - widgets = extensions.ExtensionResource('widget', 'widgets', + widgets = extensions.ResourceExtension('widgets', StubController(response_body)) manager = StubExtensionManager(widgets) app = openstack.APIRouter() @@ -77,7 +91,7 @@ class ExtensionResourceTest(unittest.TestCase): def test_get_resources_with_controller(self): response_body = "Buy more widgets!" - widgets = extensions.ExtensionResource('widget', 'widgets', + widgets = extensions.ResourceExtension('widgets', StubController(response_body)) manager = StubExtensionManager(widgets) app = openstack.APIRouter() @@ -103,40 +117,73 @@ class ExtensionManagerTest(unittest.TestCase): self.assertEqual("Buy more widgets!", response.body) -class ExtendedActionTest(unittest.TestCase): +class ActionExtensionTest(unittest.TestCase): def setUp(self): FLAGS.osapi_extensions_path = os.path.join(os.path.dirname(__file__), "extensions") - def test_extended_action(self): + def _send_server_action_request(self, url, body): app = openstack.APIRouter() ext_midware = extensions.ExtensionMiddleware(app) - body = dict(add_widget=dict(name="test")) - request = webob.Request.blank("/servers/1/action") + request = webob.Request.blank(url) request.method = 'POST' request.content_type = 'application/json' request.body = json.dumps(body) response = request.get_response(ext_midware) + return response + + def test_extended_action(self): + body = dict(add_widget=dict(name="test")) + response = self._send_server_action_request("/servers/1/action", body) self.assertEqual(200, response.status_int) self.assertEqual("Widget Added.", response.body) + body = dict(delete_widget=dict(name="test")) + response = self._send_server_action_request("/servers/1/action", body) + self.assertEqual(200, response.status_int) + self.assertEqual("Widget Deleted.", response.body) + def test_invalid_action_body(self): - app = openstack.APIRouter() - ext_midware = extensions.ExtensionMiddleware(app) body = dict(blah=dict(name="test")) # Doesn't exist - request = webob.Request.blank("/servers/1/action") - request.method = 'POST' - request.content_type = 'application/json' - request.body = json.dumps(body) - response = request.get_response(ext_midware) + response = self._send_server_action_request("/servers/1/action", body) self.assertEqual(501, response.status_int) def test_invalid_action(self): - app = openstack.APIRouter() - ext_midware = extensions.ExtensionMiddleware(app) - request = webob.Request.blank("/asdf/1/action") - request.method = 'POST' - request.content_type = 'application/json' - response = request.get_response(ext_midware) + body = dict(blah=dict(name="test")) + response = self._send_server_action_request("/asdf/1/action", body) self.assertEqual(404, response.status_int) + + +class ResponseExtensionTest(unittest.TestCase): + + def setUp(self): + super(ResponseExtensionTest, self).setUp() + self.stubs = stubout.StubOutForTesting() + fakes.FakeAuthManager.reset_fake_data() + fakes.FakeAuthDatabase.data = {} + fakes.stub_out_networking(self.stubs) + fakes.stub_out_rate_limiting(self.stubs) + fakes.stub_out_auth(self.stubs) + self.context = context.get_admin_context() + + def test_get_resources(self): + + test_resp = "Buy more widgets!" + + def _resp_handler(res): + # only handle JSON responses + data = json.loads(res.body) + data['flavor']['widgets'] = test_resp + return data + + widgets = extensions.ResponseExtension('/v1.0/flavors/:(id)', 'GET', + _resp_handler) + manager = StubExtensionManager(None, None, widgets) + app = fakes.wsgi_app() + ext_midware = extensions.ExtensionMiddleware(app, manager) + request = webob.Request.blank("/v1.0/flavors/1") + response = request.get_response(ext_midware) + self.assertEqual(200, response.status_int) + response_data = json.loads(response.body) + self.assertEqual(test_resp, response_data['flavor']['widgets']) -- cgit From d714df5ed4a6a1d4f1c0f7680c2fbb6a6abb81a5 Mon Sep 17 00:00:00 2001 From: Dan Prince Date: Wed, 16 Mar 2011 11:02:22 -0400 Subject: Implement top level extensions. --- nova/tests/api/openstack/extensions/foxinsocks.py | 70 +++++++++++++++++++++++ nova/tests/api/openstack/extensions/widgets.py | 54 ----------------- nova/tests/api/openstack/test_extensions.py | 68 +++++++++++++++------- 3 files changed, 118 insertions(+), 74 deletions(-) create mode 100644 nova/tests/api/openstack/extensions/foxinsocks.py delete mode 100644 nova/tests/api/openstack/extensions/widgets.py (limited to 'nova/tests') diff --git a/nova/tests/api/openstack/extensions/foxinsocks.py b/nova/tests/api/openstack/extensions/foxinsocks.py new file mode 100644 index 000000000..09a328273 --- /dev/null +++ b/nova/tests/api/openstack/extensions/foxinsocks.py @@ -0,0 +1,70 @@ +import json + +from nova import wsgi + +from nova.api.openstack import extensions + + +class FoxInSocksController(wsgi.Controller): + + def index(self, req): + return "Try to say this Mr. Knox, sir..." + + +class Foxinsocks(object): + + def __init__(self): + pass + + def get_name(self): + return "Fox In Socks" + + def get_alias(self): + return "FOXNSOX" + + def get_description(self): + return "The Fox In Socks Extension" + + def get_namespace(self): + return "http://www.fox.in.socks/api/ext/pie/v1.0" + + def get_updated(self): + return "2011-01-22T13:25:27-06:00" + + def get_resources(self): + resources = [] + resource = extensions.ResourceExtension('foxnsocks', + FoxInSocksController()) + resources.append(resource) + return resources + + def get_actions(self): + actions = [] + actions.append(extensions.ActionExtension('servers', 'add_tweedle', + self._add_tweedle)) + actions.append(extensions.ActionExtension('servers', 'delete_tweedle', + self._delete_tweedle)) + return actions + + def get_response_extensions(self): + response_exts = [] + + def _resp_handler(res): + #NOTE: This only handles JSON responses. + # You can use content type header to test for XML. + data = json.loads(res.body) + data['flavor']['googoose'] = "Gooey goo for chewy chewing!" + return data + + resp_ext = extensions.ResponseExtension('/v1.0/flavors/:(id)', 'GET', + _resp_handler) + response_exts.append(resp_ext) + return response_exts + + def _add_tweedle(self, input_dict, req, id): + + return "Tweedle Beetle Added." + + def _delete_tweedle(self, input_dict, req, id): + + return "Tweedle Beetle Deleted." diff --git a/nova/tests/api/openstack/extensions/widgets.py b/nova/tests/api/openstack/extensions/widgets.py deleted file mode 100644 index f463721f1..000000000 --- a/nova/tests/api/openstack/extensions/widgets.py +++ /dev/null @@ -1,54 +0,0 @@ -import json - -from nova import wsgi - -from nova.api.openstack import extensions - - -class WidgetsController(wsgi.Controller): - - def index(self, req): - return "Buy more widgets!" - - -class Widgets(object): - - def __init__(self): - pass - - def get_resources(self): - resources = [] - widgets = extensions.ResourceExtension('widgets', - WidgetsController()) - resources.append(widgets) - return resources - - def get_actions(self): - actions = [] - actions.append(extensions.ActionExtension('servers', 'add_widget', - self._add_widget)) - actions.append(extensions.ActionExtension('servers', 'delete_widget', - self._delete_widget)) - return actions - - def get_response_extensions(self): - response_exts = [] - - def _resp_handler(res): - # only handle JSON responses - data = json.loads(res.body) - data['flavor']['widgets'] = "Buy more widgets!" - return data - - widgets = extensions.ResponseExtension('/v1.0/flavors/:(id)', 'GET', - _resp_handler) - response_exts.append(widgets) - return response_exts - - def _add_widget(self, input_dict, req, id): - - return "Widget Added." - - def _delete_widget(self, input_dict, req, id): - - return "Widget Deleted." diff --git a/nova/tests/api/openstack/test_extensions.py b/nova/tests/api/openstack/test_extensions.py index 8725c8f0e..0f99dec55 100644 --- a/nova/tests/api/openstack/test_extensions.py +++ b/nova/tests/api/openstack/test_extensions.py @@ -48,6 +48,15 @@ class StubExtensionManager(object): self.action_ext = action_ext self.response_ext = response_ext + def get_name(self): + return "Tweedle Beetle Extension" + + def get_alias(self): + return "TWDLBETL" + + def get_description(self): + return "Provides access to Tweedle Beetles" + def get_resources(self): resource_exts = [] if self.resource_ext: @@ -67,36 +76,53 @@ class StubExtensionManager(object): return response_exts +class ExtensionControllerTest(unittest.TestCase): + + def test_index(self): + app = openstack.APIRouter() + ext_midware = extensions.ExtensionMiddleware(app) + request = webob.Request.blank("/extensions") + response = request.get_response(ext_midware) + self.assertEqual(200, response.status_int) + + def test_get_by_alias(self): + app = openstack.APIRouter() + ext_midware = extensions.ExtensionMiddleware(app) + request = webob.Request.blank("/extensions/FOXNSOX") + response = request.get_response(ext_midware) + self.assertEqual(200, response.status_int) + +response_body = "Try to say this Mr. Knox, sir..." + class ResourceExtensionTest(unittest.TestCase): + def test_no_extension_present(self): manager = StubExtensionManager(None) app = openstack.APIRouter() ext_midware = extensions.ExtensionMiddleware(app, manager) - request = webob.Request.blank("/widgets") + request = webob.Request.blank("/blah") response = request.get_response(ext_midware) self.assertEqual(404, response.status_int) def test_get_resources(self): - response_body = "Buy more widgets!" - widgets = extensions.ResourceExtension('widgets', + res_ext = extensions.ResourceExtension('tweedles', StubController(response_body)) - manager = StubExtensionManager(widgets) + manager = StubExtensionManager(res_ext) app = openstack.APIRouter() ext_midware = extensions.ExtensionMiddleware(app, manager) - request = webob.Request.blank("/widgets") + request = webob.Request.blank("/tweedles") response = request.get_response(ext_midware) self.assertEqual(200, response.status_int) self.assertEqual(response_body, response.body) def test_get_resources_with_controller(self): - response_body = "Buy more widgets!" - widgets = extensions.ResourceExtension('widgets', + res_ext = extensions.ResourceExtension('tweedles', StubController(response_body)) - manager = StubExtensionManager(widgets) + manager = StubExtensionManager(res_ext) app = openstack.APIRouter() ext_midware = extensions.ExtensionMiddleware(app, manager) - request = webob.Request.blank("/widgets") + request = webob.Request.blank("/tweedles") response = request.get_response(ext_midware) self.assertEqual(200, response.status_int) self.assertEqual(response_body, response.body) @@ -104,6 +130,8 @@ class ResourceExtensionTest(unittest.TestCase): class ExtensionManagerTest(unittest.TestCase): + response_body = "Try to say this Mr. Knox, sir..." + def setUp(self): FLAGS.osapi_extensions_path = os.path.join(os.path.dirname(__file__), "extensions") @@ -111,10 +139,10 @@ class ExtensionManagerTest(unittest.TestCase): def test_get_resources(self): app = openstack.APIRouter() ext_midware = extensions.ExtensionMiddleware(app) - request = webob.Request.blank("/widgets") + request = webob.Request.blank("/foxnsocks") response = request.get_response(ext_midware) self.assertEqual(200, response.status_int) - self.assertEqual("Buy more widgets!", response.body) + self.assertEqual(response_body, response.body) class ActionExtensionTest(unittest.TestCase): @@ -134,15 +162,15 @@ class ActionExtensionTest(unittest.TestCase): return response def test_extended_action(self): - body = dict(add_widget=dict(name="test")) + body = dict(add_tweedle=dict(name="test")) response = self._send_server_action_request("/servers/1/action", body) self.assertEqual(200, response.status_int) - self.assertEqual("Widget Added.", response.body) + self.assertEqual("Tweedle Beetle Added.", response.body) - body = dict(delete_widget=dict(name="test")) + body = dict(delete_tweedle=dict(name="test")) response = self._send_server_action_request("/servers/1/action", body) self.assertEqual(200, response.status_int) - self.assertEqual("Widget Deleted.", response.body) + self.assertEqual("Tweedle Beetle Deleted.", response.body) def test_invalid_action_body(self): body = dict(blah=dict(name="test")) # Doesn't exist @@ -169,21 +197,21 @@ class ResponseExtensionTest(unittest.TestCase): def test_get_resources(self): - test_resp = "Buy more widgets!" + test_resp = "Gooey goo for chewy chewing!" def _resp_handler(res): # only handle JSON responses data = json.loads(res.body) - data['flavor']['widgets'] = test_resp + data['flavor']['googoose'] = test_resp return data - widgets = extensions.ResponseExtension('/v1.0/flavors/:(id)', 'GET', + resp_ext = extensions.ResponseExtension('/v1.0/flavors/:(id)', 'GET', _resp_handler) - manager = StubExtensionManager(None, None, widgets) + manager = StubExtensionManager(None, None, resp_ext) app = fakes.wsgi_app() ext_midware = extensions.ExtensionMiddleware(app, manager) request = webob.Request.blank("/v1.0/flavors/1") response = request.get_response(ext_midware) self.assertEqual(200, response.status_int) response_data = json.loads(response.body) - self.assertEqual(test_resp, response_data['flavor']['widgets']) + self.assertEqual(test_resp, response_data['flavor']['googoose']) -- cgit From b2456e983178b97ad94f48c77ef210000d6d6ca4 Mon Sep 17 00:00:00 2001 From: Dan Prince Date: Wed, 16 Mar 2011 14:03:38 -0400 Subject: Move mapper code into the _action_ext_controllers and _response_ext_controllers methods. --- nova/tests/api/openstack/extensions/foxinsocks.py | 2 +- nova/tests/api/openstack/test_extensions.py | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) (limited to 'nova/tests') diff --git a/nova/tests/api/openstack/extensions/foxinsocks.py b/nova/tests/api/openstack/extensions/foxinsocks.py index 09a328273..2e93d8a55 100644 --- a/nova/tests/api/openstack/extensions/foxinsocks.py +++ b/nova/tests/api/openstack/extensions/foxinsocks.py @@ -56,7 +56,7 @@ class Foxinsocks(object): data['flavor']['googoose'] = "Gooey goo for chewy chewing!" return data - resp_ext = extensions.ResponseExtension('/v1.0/flavors/:(id)', 'GET', + resp_ext = extensions.ResponseExtension('GET', '/flavors/:(id)', _resp_handler) response_exts.append(resp_ext) return response_exts diff --git a/nova/tests/api/openstack/test_extensions.py b/nova/tests/api/openstack/test_extensions.py index 0f99dec55..149f1973e 100644 --- a/nova/tests/api/openstack/test_extensions.py +++ b/nova/tests/api/openstack/test_extensions.py @@ -31,6 +31,8 @@ import nova.wsgi FLAGS = flags.FLAGS +response_body = "Try to say this Mr. Knox, sir..." + class StubController(nova.wsgi.Controller): @@ -92,11 +94,9 @@ class ExtensionControllerTest(unittest.TestCase): response = request.get_response(ext_midware) self.assertEqual(200, response.status_int) -response_body = "Try to say this Mr. Knox, sir..." class ResourceExtensionTest(unittest.TestCase): - def test_no_extension_present(self): manager = StubExtensionManager(None) app = openstack.APIRouter() @@ -205,7 +205,8 @@ class ResponseExtensionTest(unittest.TestCase): data['flavor']['googoose'] = test_resp return data - resp_ext = extensions.ResponseExtension('/v1.0/flavors/:(id)', 'GET', + resp_ext = extensions.ResponseExtension('GET', + '/v1.0/flavors/:(id)', _resp_handler) manager = StubExtensionManager(None, None, resp_ext) app = fakes.wsgi_app() -- cgit From abc6c82449dfc46a33dcd8190840e51f44b5b930 Mon Sep 17 00:00:00 2001 From: Sandy Walsh Date: Thu, 17 Mar 2011 07:30:22 -0700 Subject: Replaced capability flags with List --- nova/tests/api/openstack/test_zones.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'nova/tests') diff --git a/nova/tests/api/openstack/test_zones.py b/nova/tests/api/openstack/test_zones.py index 5e3aee4a7..12d39fd29 100644 --- a/nova/tests/api/openstack/test_zones.py +++ b/nova/tests/api/openstack/test_zones.py @@ -178,7 +178,7 @@ class ZonesTest(test.TestCase): def test_zone_info(self): FLAGS.zone_name = 'darksecret' - FLAGS.zone_capabilities = 'cap1:a,b;cap2:c,d' + FLAGS.zone_capabilities = ['cap1=a;b', 'cap2=c;d'] self.stubs.Set(api, '_call_scheduler', zone_caps) body = dict(zone=dict(username='zeb', password='sneaky')) @@ -188,5 +188,5 @@ class ZonesTest(test.TestCase): res_dict = json.loads(res.body) self.assertEqual(res.status_int, 200) self.assertEqual(res_dict['zone']['name'], 'darksecret') - self.assertEqual(res_dict['zone']['cap1'], 'a,b') - self.assertEqual(res_dict['zone']['cap2'], 'c,d') + self.assertEqual(res_dict['zone']['cap1'], 'a;b') + self.assertEqual(res_dict['zone']['cap2'], 'c;d') -- cgit From 41c097000c1eeb4f1532b22f136c383b8174e6cc Mon Sep 17 00:00:00 2001 From: Dan Prince Date: Thu, 17 Mar 2011 11:35:32 -0400 Subject: Add tests and code to handle multiple ResponseExtension objects. --- nova/tests/api/openstack/extensions/foxinsocks.py | 17 ++++++++++++++--- nova/tests/api/openstack/test_extensions.py | 17 ++++++++++++++++- 2 files changed, 30 insertions(+), 4 deletions(-) (limited to 'nova/tests') diff --git a/nova/tests/api/openstack/extensions/foxinsocks.py b/nova/tests/api/openstack/extensions/foxinsocks.py index 2e93d8a55..fa979c7b5 100644 --- a/nova/tests/api/openstack/extensions/foxinsocks.py +++ b/nova/tests/api/openstack/extensions/foxinsocks.py @@ -49,16 +49,27 @@ class Foxinsocks(object): def get_response_extensions(self): response_exts = [] - def _resp_handler(res): + def _goose_handler(res): #NOTE: This only handles JSON responses. # You can use content type header to test for XML. data = json.loads(res.body) data['flavor']['googoose'] = "Gooey goo for chewy chewing!" return data - resp_ext = extensions.ResponseExtension('GET', '/flavors/:(id)', - _resp_handler) + resp_ext = extensions.ResponseExtension('GET', '/v1.0/flavors/:(id)', + _goose_handler) response_exts.append(resp_ext) + + def _bands_handler(res): + #NOTE: This only handles JSON responses. + # You can use content type header to test for XML. + data = json.loads(res.body) + data['big_bands'] = 'Pig Bands!' + return data + + resp_ext2 = extensions.ResponseExtension('GET', '/v1.0/flavors/:(id)', + _bands_handler) + response_exts.append(resp_ext2) return response_exts def _add_tweedle(self, input_dict, req, id): diff --git a/nova/tests/api/openstack/test_extensions.py b/nova/tests/api/openstack/test_extensions.py index 149f1973e..11ed61e0d 100644 --- a/nova/tests/api/openstack/test_extensions.py +++ b/nova/tests/api/openstack/test_extensions.py @@ -195,7 +195,7 @@ class ResponseExtensionTest(unittest.TestCase): fakes.stub_out_auth(self.stubs) self.context = context.get_admin_context() - def test_get_resources(self): + def test_get_resources_with_stub_mgr(self): test_resp = "Gooey goo for chewy chewing!" @@ -208,6 +208,7 @@ class ResponseExtensionTest(unittest.TestCase): resp_ext = extensions.ResponseExtension('GET', '/v1.0/flavors/:(id)', _resp_handler) + manager = StubExtensionManager(None, None, resp_ext) app = fakes.wsgi_app() ext_midware = extensions.ExtensionMiddleware(app, manager) @@ -216,3 +217,17 @@ class ResponseExtensionTest(unittest.TestCase): self.assertEqual(200, response.status_int) response_data = json.loads(response.body) self.assertEqual(test_resp, response_data['flavor']['googoose']) + + def test_get_resources_with_mgr(self): + + test_resp = "Gooey goo for chewy chewing!" + + app = fakes.wsgi_app() + ext_midware = extensions.ExtensionMiddleware(app) + request = webob.Request.blank("/v1.0/flavors/1") + response = request.get_response(ext_midware) + self.assertEqual(200, response.status_int) + response_data = json.loads(response.body) + print response_data + self.assertEqual(test_resp, response_data['flavor']['googoose']) + self.assertEqual("Pig Bands!", response_data['big_bands']) -- cgit From 8f0b60f598c28b2f558f3ecdaa2f9604926393e6 Mon Sep 17 00:00:00 2001 From: Sandy Walsh Date: Mon, 21 Mar 2011 07:49:58 -0700 Subject: remove scheduler.api.API. naming changes. --- nova/tests/api/openstack/test_zones.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'nova/tests') diff --git a/nova/tests/api/openstack/test_zones.py b/nova/tests/api/openstack/test_zones.py index 12d39fd29..a3f191aaa 100644 --- a/nova/tests/api/openstack/test_zones.py +++ b/nova/tests/api/openstack/test_zones.py @@ -75,7 +75,7 @@ def zone_get_all_db(context): ] -def zone_caps(method, context, params): +def zone_capabilities(method, context, params): return dict() @@ -98,13 +98,13 @@ class ZonesTest(test.TestCase): self.stubs.Set(nova.db, 'zone_delete', zone_delete) self.old_zone_name = FLAGS.zone_name - self.old_zone_caps = FLAGS.zone_capabilities + self.old_zone_capabilities = FLAGS.zone_capabilities def tearDown(self): self.stubs.UnsetAll() FLAGS.allow_admin_api = self.allow_admin FLAGS.zone_name = self.old_zone_name - FLAGS.zone_capabilities = self.old_zone_caps + FLAGS.zone_capabilities = self.old_zone_capabilities super(ZonesTest, self).tearDown() def test_get_zone_list_scheduler(self): @@ -179,7 +179,7 @@ class ZonesTest(test.TestCase): def test_zone_info(self): FLAGS.zone_name = 'darksecret' FLAGS.zone_capabilities = ['cap1=a;b', 'cap2=c;d'] - self.stubs.Set(api, '_call_scheduler', zone_caps) + self.stubs.Set(api, '_call_scheduler', zone_capabilities) body = dict(zone=dict(username='zeb', password='sneaky')) req = webob.Request.blank('/v1.0/zones/info') -- cgit From 012c94e5304b9e00477409b92bf73f4316b19260 Mon Sep 17 00:00:00 2001 From: Dan Prince Date: Mon, 21 Mar 2011 13:56:55 -0400 Subject: Fix limit unit tests (reconciles w/ trunk changes). --- nova/tests/api/openstack/test_extensions.py | 2 -- 1 file changed, 2 deletions(-) (limited to 'nova/tests') diff --git a/nova/tests/api/openstack/test_extensions.py b/nova/tests/api/openstack/test_extensions.py index 11ed61e0d..d1f8c659e 100644 --- a/nova/tests/api/openstack/test_extensions.py +++ b/nova/tests/api/openstack/test_extensions.py @@ -190,8 +190,6 @@ class ResponseExtensionTest(unittest.TestCase): self.stubs = stubout.StubOutForTesting() fakes.FakeAuthManager.reset_fake_data() fakes.FakeAuthDatabase.data = {} - fakes.stub_out_networking(self.stubs) - fakes.stub_out_rate_limiting(self.stubs) fakes.stub_out_auth(self.stubs) self.context = context.get_admin_context() -- cgit From fbd94f236adaa906fcc9c90de94e491e3d75653b Mon Sep 17 00:00:00 2001 From: Dan Prince Date: Mon, 21 Mar 2011 13:59:26 -0400 Subject: Added copyright header. --- nova/tests/api/openstack/extensions/foxinsocks.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) (limited to 'nova/tests') diff --git a/nova/tests/api/openstack/extensions/foxinsocks.py b/nova/tests/api/openstack/extensions/foxinsocks.py index fa979c7b5..249dd81bf 100644 --- a/nova/tests/api/openstack/extensions/foxinsocks.py +++ b/nova/tests/api/openstack/extensions/foxinsocks.py @@ -1,3 +1,20 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2011 OpenStack LLC. +# All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + import json from nova import wsgi -- cgit From ffd2bc759af4f53019838bf20a4f016a566fbbd6 Mon Sep 17 00:00:00 2001 From: Josh Kearney Date: Mon, 21 Mar 2011 13:21:26 -0500 Subject: Added XenAPI rescue unit tests --- nova/tests/test_xenapi.py | 12 ++++++++++++ nova/tests/xenapi/stubs.py | 19 +++++++++++++++++++ 2 files changed, 31 insertions(+) (limited to 'nova/tests') diff --git a/nova/tests/test_xenapi.py b/nova/tests/test_xenapi.py index 66a973a78..e54ffe712 100644 --- a/nova/tests/test_xenapi.py +++ b/nova/tests/test_xenapi.py @@ -186,6 +186,7 @@ class XenAPIVMTestCase(test.TestCase): stubs.stubout_stream_disk(self.stubs) stubs.stubout_is_vdi_pv(self.stubs) self.stubs.Set(VMOps, 'reset_network', reset_network) + stubs.stub_out_vm_methods(self.stubs) glance_stubs.stubout_glance_client(self.stubs, glance_stubs.FakeGlance) self.conn = xenapi_conn.get_connection(False) @@ -369,6 +370,17 @@ class XenAPIVMTestCase(test.TestCase): self.assertEquals(vif_rec['qos_algorithm_params']['kbps'], str(4 * 1024)) + def test_rescue(self): + instance = self._create_instance() + conn = xenapi_conn.get_connection(False) + conn.rescue(instance, None) + + def test_unrescue(self): + instance = self._create_instance() + conn = xenapi_conn.get_connection(False) + # Ensure that it will not unrescue a non-rescued instance. + self.assertRaises(Exception, conn.unrescue, instance, None) + def tearDown(self): super(XenAPIVMTestCase, self).tearDown() self.manager.delete_project(self.project) diff --git a/nova/tests/xenapi/stubs.py b/nova/tests/xenapi/stubs.py index 70d46a1fb..a0370a2ec 100644 --- a/nova/tests/xenapi/stubs.py +++ b/nova/tests/xenapi/stubs.py @@ -185,6 +185,25 @@ class FakeSessionForVMTests(fake.SessionBase): pass +def stub_out_vm_methods(stubs): + def fake_shutdown(self, inst, vm, method="clean"): + pass + + def fake_acquire_bootlock(self, vm): + pass + + def fake_release_bootlock(self, vm): + pass + + def fake_spawn_rescue(self, inst): + pass + + stubs.Set(vmops.VMOps, "_shutdown", fake_shutdown) + stubs.Set(vmops.VMOps, "_acquire_bootlock", fake_acquire_bootlock) + stubs.Set(vmops.VMOps, "_release_bootlock", fake_release_bootlock) + stubs.Set(vmops.VMOps, "spawn_rescue", fake_spawn_rescue) + + class FakeSessionForVolumeTests(fake.SessionBase): """ Stubs out a XenAPISession for Volume tests """ def __init__(self, uri): -- cgit From 08d06d1219a00b90ae211fb44fc7e33ba71c7a76 Mon Sep 17 00:00:00 2001 From: Sandy Walsh Date: Mon, 21 Mar 2011 18:16:35 -0700 Subject: better comments. First redirect test --- nova/tests/test_scheduler.py | 70 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) (limited to 'nova/tests') diff --git a/nova/tests/test_scheduler.py b/nova/tests/test_scheduler.py index 244e43bd9..50e2429ba 100644 --- a/nova/tests/test_scheduler.py +++ b/nova/tests/test_scheduler.py @@ -21,6 +21,8 @@ Tests For Scheduler import datetime import mox +import stubout +import webob from mox import IgnoreArg from nova import context @@ -32,6 +34,7 @@ from nova import test from nova import rpc from nova import utils from nova.auth import manager as auth_manager +from nova.scheduler import api from nova.scheduler import manager from nova.scheduler import driver from nova.compute import power_state @@ -937,3 +940,70 @@ class SimpleDriverTestCase(test.TestCase): db.instance_destroy(self.context, instance_id) db.service_destroy(self.context, s_ref['id']) db.service_destroy(self.context, s_ref2['id']) + + +class FakeZone(object): + def __init__(self, api_url, username, password): + self.api_url = api_url + self.username = username + self.password = password + +def zone_get_all(context): + return [ + FakeZone('http://example.com', 'bob', 'xxx'), + ] + + +def go_boom(self, context, instance): + raise exception.InstanceNotFound("boom message", instance) + + +def fake_openstack_init(self, username, password, api): + servers=[] + + +def fake_auth(self): + pass + +class FakeServer: + def foo(self): + pass + +class FakeManager: + def get(self, id): + return FakeServer() + +class FakeOpenStack: + + def __init__(self, username, api, auth): + self.servers = FakeManager() + + def authenticate(self): + pass + + +class ZoneRedirectTest(test.TestCase): + def setUp(self): + super(ZoneRedirectTest, self).setUp() + self.stubs = stubout.StubOutForTesting() + + self.stubs.Set(api.novaclient, 'OpenStack', FakeOpenStack) + self.stubs.Set(db, 'zone_get_all', zone_get_all) + + self.enable_zone_routing = FLAGS.enable_zone_routing + FLAGS.enable_zone_routing = True + + def tearDown(self): + self.stubs.UnsetAll() + FLAGS.enable_zone_routing = self.enable_zone_routing + super(ZoneRedirectTest, self).tearDown() + + def test_trap_found_locally(self): + decorator = api.reroute_compute("foo") + try: + wrapper = decorator(go_boom) + result = wrapper(None, None, 1) # self, context, id + except api.RedirectResult, e: + pass + + -- cgit From 380731ce71e8909615da6138bb7d5e7226e375ac Mon Sep 17 00:00:00 2001 From: Sandy Walsh Date: Mon, 21 Mar 2011 18:56:59 -0700 Subject: better comments. First redirect test --- nova/tests/test_scheduler.py | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) (limited to 'nova/tests') diff --git a/nova/tests/test_scheduler.py b/nova/tests/test_scheduler.py index 50e2429ba..6d55cad04 100644 --- a/nova/tests/test_scheduler.py +++ b/nova/tests/test_scheduler.py @@ -958,23 +958,23 @@ def go_boom(self, context, instance): raise exception.InstanceNotFound("boom message", instance) -def fake_openstack_init(self, username, password, api): - servers=[] +class FakeServer(object): + def __init__(self): + self.name = 'myserver' + self.kvm = 'kvm' + self.manager = 100 + self._hidden = True - -def fake_auth(self): - pass - -class FakeServer: def foo(self): - pass + return None + -class FakeManager: +class FakeManager(object): def get(self, id): return FakeServer() -class FakeOpenStack: +class FakeOpenStack: def __init__(self, username, api, auth): self.servers = FakeManager() @@ -987,7 +987,6 @@ class ZoneRedirectTest(test.TestCase): super(ZoneRedirectTest, self).setUp() self.stubs = stubout.StubOutForTesting() - self.stubs.Set(api.novaclient, 'OpenStack', FakeOpenStack) self.stubs.Set(db, 'zone_get_all', zone_get_all) self.enable_zone_routing = FLAGS.enable_zone_routing @@ -999,11 +998,12 @@ class ZoneRedirectTest(test.TestCase): super(ZoneRedirectTest, self).tearDown() def test_trap_found_locally(self): + self.stubs.Set(api.novaclient, 'OpenStack', FakeOpenStack) decorator = api.reroute_compute("foo") try: wrapper = decorator(go_boom) result = wrapper(None, None, 1) # self, context, id except api.RedirectResult, e: - pass + self.assertTrue(e.results, {}) -- cgit From 8303d0f280a7bfbc5c5fb128465549b03badc1f1 Mon Sep 17 00:00:00 2001 From: Sandy Walsh Date: Mon, 21 Mar 2011 21:41:41 -0700 Subject: routing test coverage --- nova/tests/test_scheduler.py | 121 +++++++++++++++++++++++++++++++++++-------- 1 file changed, 98 insertions(+), 23 deletions(-) (limited to 'nova/tests') diff --git a/nova/tests/test_scheduler.py b/nova/tests/test_scheduler.py index 6d55cad04..0aebd0380 100644 --- a/nova/tests/test_scheduler.py +++ b/nova/tests/test_scheduler.py @@ -21,6 +21,7 @@ Tests For Scheduler import datetime import mox +import novaclient.exceptions import stubout import webob @@ -954,34 +955,33 @@ def zone_get_all(context): ] -def go_boom(self, context, instance): - raise exception.InstanceNotFound("boom message", instance) +class FakeRerouteCompute(api.reroute_compute): + def _call_child_zones(self, zones, function): + return [ ] + + def get_collection_context_and_id(self, args, kwargs): + return ("servers", None, 1) + def unmarshall_result(self, zone_responses): + return dict(magic="found me") -class FakeServer(object): - def __init__(self): - self.name = 'myserver' - self.kvm = 'kvm' - self.manager = 100 - self._hidden = True - def foo(self): - return None +def go_boom(self, context, instance): + raise exception.InstanceNotFound("boom message", instance) -class FakeManager(object): - def get(self, id): - return FakeServer() +def found_instance(self, context, instance): + return dict(name='myserver') -class FakeOpenStack: - def __init__(self, username, api, auth): - self.servers = FakeManager() +class FakeResource(object): + def __init__(self, attribute_dict): + for k, v in attribute_dict.iteritems(): + setattr(self, k, v) - def authenticate(self): + def pause(self): pass - class ZoneRedirectTest(test.TestCase): def setUp(self): super(ZoneRedirectTest, self).setUp() @@ -998,12 +998,87 @@ class ZoneRedirectTest(test.TestCase): super(ZoneRedirectTest, self).tearDown() def test_trap_found_locally(self): - self.stubs.Set(api.novaclient, 'OpenStack', FakeOpenStack) - decorator = api.reroute_compute("foo") + decorator = FakeRerouteCompute("foo") try: - wrapper = decorator(go_boom) - result = wrapper(None, None, 1) # self, context, id + result = decorator(found_instance)(None, None, 1) except api.RedirectResult, e: - self.assertTrue(e.results, {}) + self.fail(_("Successful database hit should succeed")) + def test_trap_not_found_locally(self): + decorator = FakeRerouteCompute("foo") + try: + result = decorator(go_boom)(None, None, 1) + except api.RedirectResult, e: + self.assertEquals(e.results['magic'], 'found me') + def test_get_collection_context_and_id(self): + decorator = api.reroute_compute("foo") + self.assertEquals(decorator.get_collection_context_and_id( + (None, 10, 20), {}), ("servers", 10, 20)) + self.assertEquals(decorator.get_collection_context_and_id( + (None, 11,), dict(instance_id=21)), ("servers", 11, 21)) + self.assertEquals(decorator.get_collection_context_and_id( + (None,), dict(context=12, instance_id=22)), ("servers", 12, 22)) + + def test_unmarshal_single_server(self): + decorator = api.reroute_compute("foo") + self.assertEquals(decorator.unmarshall_result([]), {}) + self.assertEquals(decorator.unmarshall_result( + [FakeResource(dict(a=1, b=2)),]), + dict(server=dict(a=1, b=2))) + self.assertEquals(decorator.unmarshall_result( + [FakeResource(dict(a=1, _b=2)),]), + dict(server=dict(a=1,))) + self.assertEquals(decorator.unmarshall_result( + [FakeResource(dict(a=1, manager=2)),]), + dict(server=dict(a=1,))) + self.assertEquals(decorator.unmarshall_result( + [FakeResource(dict(_a=1, manager=2)),]), + dict(server={})) + +class FakeServerCollection(object): + def get(self, instance_id): + return FakeResource(dict(a=10, b=20)) + + def find(self, name): + return FakeResource(dict(a=11, b=22)) + +class FakeEmptyServerCollection(object): + def get(self, f): + raise novaclient.NotFound(1) + + def find(self, name): + raise novaclient.NotFound(2) + +class FakeNovaClient(object): + def __init__(self, collection): + self.servers = collection + +class DynamicNovaClientTest(test.TestCase): + def test_issue_novaclient_command_found(self): + zone = FakeZone('http://example.com', 'bob', 'xxx') + self.assertEquals(api._issue_novaclient_command( + FakeNovaClient(FakeServerCollection()), + zone, "servers", "get", 100).a, 10) + + self.assertEquals(api._issue_novaclient_command( + FakeNovaClient(FakeServerCollection()), + zone, "servers", "find", "name").b, 22) + + self.assertEquals(api._issue_novaclient_command( + FakeNovaClient(FakeServerCollection()), + zone, "servers", "pause", 100), None) + + def test_issue_novaclient_command_not_found(self): + zone = FakeZone('http://example.com', 'bob', 'xxx') + self.assertEquals(api._issue_novaclient_command( + FakeNovaClient(FakeEmptyServerCollection()), + zone, "servers", "get", 100), None) + + self.assertEquals(api._issue_novaclient_command( + FakeNovaClient(FakeEmptyServerCollection()), + zone, "servers", "find", "name"), None) + + self.assertEquals(api._issue_novaclient_command( + FakeNovaClient(FakeEmptyServerCollection()), + zone, "servers", "any", "name"), None) -- cgit From e74482f30c602530313faf15e0d429acefee7bde Mon Sep 17 00:00:00 2001 From: Sandy Walsh Date: Mon, 21 Mar 2011 21:47:58 -0700 Subject: routing test coverage --- nova/tests/test_scheduler.py | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'nova/tests') diff --git a/nova/tests/test_scheduler.py b/nova/tests/test_scheduler.py index 0aebd0380..8434f5a43 100644 --- a/nova/tests/test_scheduler.py +++ b/nova/tests/test_scheduler.py @@ -1008,9 +1008,18 @@ class ZoneRedirectTest(test.TestCase): decorator = FakeRerouteCompute("foo") try: result = decorator(go_boom)(None, None, 1) + self.assertFail(_("Should have rerouted.")) except api.RedirectResult, e: self.assertEquals(e.results['magic'], 'found me') + def test_routing_flags(self): + FLAGS.enable_zone_routing = False + decorator = FakeRerouteCompute("foo") + try: + result = decorator(go_boom)(None, None, 1) + except exception.InstanceNotFound, e: + self.assertEquals(e.message, 'boom message') + def test_get_collection_context_and_id(self): decorator = api.reroute_compute("foo") self.assertEquals(decorator.get_collection_context_and_id( -- cgit From 65482f5d9513c3dda64171d0460001e299be9673 Mon Sep 17 00:00:00 2001 From: Sandy Walsh Date: Mon, 21 Mar 2011 21:51:14 -0700 Subject: added zone routing flag test --- nova/tests/test_scheduler.py | 1 + 1 file changed, 1 insertion(+) (limited to 'nova/tests') diff --git a/nova/tests/test_scheduler.py b/nova/tests/test_scheduler.py index 8434f5a43..277ffe367 100644 --- a/nova/tests/test_scheduler.py +++ b/nova/tests/test_scheduler.py @@ -1017,6 +1017,7 @@ class ZoneRedirectTest(test.TestCase): decorator = FakeRerouteCompute("foo") try: result = decorator(go_boom)(None, None, 1) + self.assertFail(_("Should have thrown exception.")) except exception.InstanceNotFound, e: self.assertEquals(e.message, 'boom message') -- cgit From 209da18033a49062bbcfaf7739db5959be87b142 Mon Sep 17 00:00:00 2001 From: Sandy Walsh Date: Tue, 22 Mar 2011 20:36:49 -0700 Subject: pep8 and fixed up zone-list --- nova/tests/test_scheduler.py | 40 +++++++++++++++++++++++----------------- 1 file changed, 23 insertions(+), 17 deletions(-) (limited to 'nova/tests') diff --git a/nova/tests/test_scheduler.py b/nova/tests/test_scheduler.py index 277ffe367..6df74dd61 100644 --- a/nova/tests/test_scheduler.py +++ b/nova/tests/test_scheduler.py @@ -949,6 +949,7 @@ class FakeZone(object): self.username = username self.password = password + def zone_get_all(context): return [ FakeZone('http://example.com', 'bob', 'xxx'), @@ -957,8 +958,8 @@ def zone_get_all(context): class FakeRerouteCompute(api.reroute_compute): def _call_child_zones(self, zones, function): - return [ ] - + return [] + def get_collection_context_and_id(self, args, kwargs): return ("servers", None, 1) @@ -982,6 +983,7 @@ class FakeResource(object): def pause(self): pass + class ZoneRedirectTest(test.TestCase): def setUp(self): super(ZoneRedirectTest, self).setUp() @@ -1024,27 +1026,28 @@ class ZoneRedirectTest(test.TestCase): def test_get_collection_context_and_id(self): decorator = api.reroute_compute("foo") self.assertEquals(decorator.get_collection_context_and_id( - (None, 10, 20), {}), ("servers", 10, 20)) + (None, 10, 20), {}), ("servers", 10, 20)) self.assertEquals(decorator.get_collection_context_and_id( - (None, 11,), dict(instance_id=21)), ("servers", 11, 21)) + (None, 11,), dict(instance_id=21)), ("servers", 11, 21)) self.assertEquals(decorator.get_collection_context_and_id( (None,), dict(context=12, instance_id=22)), ("servers", 12, 22)) def test_unmarshal_single_server(self): decorator = api.reroute_compute("foo") - self.assertEquals(decorator.unmarshall_result([]), {}) + self.assertEquals(decorator.unmarshall_result([]), {}) self.assertEquals(decorator.unmarshall_result( - [FakeResource(dict(a=1, b=2)),]), - dict(server=dict(a=1, b=2))) + [FakeResource(dict(a=1, b=2)), ]), + dict(server=dict(a=1, b=2))) self.assertEquals(decorator.unmarshall_result( - [FakeResource(dict(a=1, _b=2)),]), - dict(server=dict(a=1,))) + [FakeResource(dict(a=1, _b=2)), ]), + dict(server=dict(a=1,))) self.assertEquals(decorator.unmarshall_result( - [FakeResource(dict(a=1, manager=2)),]), - dict(server=dict(a=1,))) + [FakeResource(dict(a=1, manager=2)), ]), + dict(server=dict(a=1,))) self.assertEquals(decorator.unmarshall_result( - [FakeResource(dict(_a=1, manager=2)),]), - dict(server={})) + [FakeResource(dict(_a=1, manager=2)), ]), + dict(server={})) + class FakeServerCollection(object): def get(self, instance_id): @@ -1053,6 +1056,7 @@ class FakeServerCollection(object): def find(self, name): return FakeResource(dict(a=11, b=22)) + class FakeEmptyServerCollection(object): def get(self, f): raise novaclient.NotFound(1) @@ -1060,10 +1064,12 @@ class FakeEmptyServerCollection(object): def find(self, name): raise novaclient.NotFound(2) + class FakeNovaClient(object): def __init__(self, collection): self.servers = collection + class DynamicNovaClientTest(test.TestCase): def test_issue_novaclient_command_found(self): zone = FakeZone('http://example.com', 'bob', 'xxx') @@ -1078,17 +1084,17 @@ class DynamicNovaClientTest(test.TestCase): self.assertEquals(api._issue_novaclient_command( FakeNovaClient(FakeServerCollection()), zone, "servers", "pause", 100), None) - + def test_issue_novaclient_command_not_found(self): zone = FakeZone('http://example.com', 'bob', 'xxx') self.assertEquals(api._issue_novaclient_command( FakeNovaClient(FakeEmptyServerCollection()), - zone, "servers", "get", 100), None) + zone, "servers", "get", 100), None) self.assertEquals(api._issue_novaclient_command( FakeNovaClient(FakeEmptyServerCollection()), - zone, "servers", "find", "name"), None) + zone, "servers", "find", "name"), None) self.assertEquals(api._issue_novaclient_command( FakeNovaClient(FakeEmptyServerCollection()), - zone, "servers", "any", "name"), None) + zone, "servers", "any", "name"), None) -- cgit From 05e6f82aa971606f7d33fb1de8f2c1c170d030de Mon Sep 17 00:00:00 2001 From: Sandy Walsh Date: Wed, 23 Mar 2011 12:31:15 -0700 Subject: indenting cleanup --- nova/tests/test_zones.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'nova/tests') diff --git a/nova/tests/test_zones.py b/nova/tests/test_zones.py index 48e1442cf..688dc704d 100644 --- a/nova/tests/test_zones.py +++ b/nova/tests/test_zones.py @@ -96,7 +96,7 @@ class ZoneManagerTestCase(test.TestCase): zm.update_service_capabilities("svc10", "host1", dict(a=99, b=99)) caps = zm.get_zone_capabilities(self, None) self.assertEquals(caps, dict(svc1_a=(2, 20), svc1_b=(3, 30), - svc10_a=(99, 99), svc10_b=(99, 99))) + svc10_a=(99, 99), svc10_b=(99, 99))) zm.update_service_capabilities("svc1", "host3", dict(c=5)) caps = zm.get_zone_capabilities(self, None) -- cgit From 3c0fcc47be08ac4f3d508fd46f3b95036899aaad Mon Sep 17 00:00:00 2001 From: termie Date: Wed, 23 Mar 2011 13:39:01 -0700 Subject: fix utils.execute retries for osx also some minor misc cleanups --- nova/tests/test_volume.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'nova/tests') diff --git a/nova/tests/test_volume.py b/nova/tests/test_volume.py index 5d68ca2ae..d71b75f3f 100644 --- a/nova/tests/test_volume.py +++ b/nova/tests/test_volume.py @@ -356,8 +356,8 @@ class ISCSITestCase(DriverTestCase): tid = db.volume_get_iscsi_target_num(self.context, volume_id_list[0]) self.mox.StubOutWithMock(self.volume.driver, '_execute') self.volume.driver._execute("sudo", "ietadm", "--op", "show", - "--tid=%(tid)d" % locals() - ).AndRaise(exception.ProcessExecutionError()) + "--tid=%(tid)d" % locals()).AndRaise( + exception.ProcessExecutionError()) self.mox.ReplayAll() self.assertRaises(exception.ProcessExecutionError, -- cgit From 95fa499f1a7718694e37a747a6a5a0e309ce877d Mon Sep 17 00:00:00 2001 From: Eldar Nugaev Date: Thu, 24 Mar 2011 00:36:07 +0300 Subject: migration gateway_v6 to network_info --- nova/tests/test_virt.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'nova/tests') diff --git a/nova/tests/test_virt.py b/nova/tests/test_virt.py index b214f5ce7..98bb11526 100644 --- a/nova/tests/test_virt.py +++ b/nova/tests/test_virt.py @@ -785,7 +785,8 @@ class NWFilterTestCase(test.TestCase): instance_ref = db.instance_create(self.context, {'user_id': 'fake', - 'project_id': 'fake'}) + 'project_id': 'fake', + 'mac_address': '00:A0:C9:14:C8:29'}) inst_id = instance_ref['id'] ip = '10.11.12.13' -- cgit From 4e5b511b422501167161c3bbe4dd755c0370c93f Mon Sep 17 00:00:00 2001 From: Ilya Alekseyev Date: Thu, 24 Mar 2011 16:53:32 +0300 Subject: couple of bugs fixed --- nova/tests/test_virt.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'nova/tests') diff --git a/nova/tests/test_virt.py b/nova/tests/test_virt.py index 98bb11526..12f97383e 100644 --- a/nova/tests/test_virt.py +++ b/nova/tests/test_virt.py @@ -803,7 +803,8 @@ class NWFilterTestCase(test.TestCase): 'instance_id': instance_ref['id']}) def _ensure_all_called(): - instance_filter = 'nova-instance-%s' % instance_ref['name'] + instance_filter = 'nova-instance-%s-%s' % (instance_ref['name'], + '00A0C914C829') secgroup_filter = 'nova-secgroup-%s' % self.security_group['id'] for required in [secgroup_filter, 'allow-dhcp-server', 'no-arp-spoofing', 'no-ip-spoofing', -- cgit From 12184874da4369891b2eae49982623fc6c9315e3 Mon Sep 17 00:00:00 2001 From: Dan Prince Date: Thu, 24 Mar 2011 13:26:57 -0400 Subject: Updated to use new APIRouterV11 class in tests. --- nova/tests/api/openstack/test_extensions.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to 'nova/tests') diff --git a/nova/tests/api/openstack/test_extensions.py b/nova/tests/api/openstack/test_extensions.py index d1f8c659e..4bc823d15 100644 --- a/nova/tests/api/openstack/test_extensions.py +++ b/nova/tests/api/openstack/test_extensions.py @@ -81,14 +81,14 @@ class StubExtensionManager(object): class ExtensionControllerTest(unittest.TestCase): def test_index(self): - app = openstack.APIRouter() + app = openstack.APIRouterV11() ext_midware = extensions.ExtensionMiddleware(app) request = webob.Request.blank("/extensions") response = request.get_response(ext_midware) self.assertEqual(200, response.status_int) def test_get_by_alias(self): - app = openstack.APIRouter() + app = openstack.APIRouterV11() ext_midware = extensions.ExtensionMiddleware(app) request = webob.Request.blank("/extensions/FOXNSOX") response = request.get_response(ext_midware) @@ -99,7 +99,7 @@ class ResourceExtensionTest(unittest.TestCase): def test_no_extension_present(self): manager = StubExtensionManager(None) - app = openstack.APIRouter() + app = openstack.APIRouterV11() ext_midware = extensions.ExtensionMiddleware(app, manager) request = webob.Request.blank("/blah") response = request.get_response(ext_midware) @@ -109,7 +109,7 @@ class ResourceExtensionTest(unittest.TestCase): res_ext = extensions.ResourceExtension('tweedles', StubController(response_body)) manager = StubExtensionManager(res_ext) - app = openstack.APIRouter() + app = openstack.APIRouterV11() ext_midware = extensions.ExtensionMiddleware(app, manager) request = webob.Request.blank("/tweedles") response = request.get_response(ext_midware) @@ -120,7 +120,7 @@ class ResourceExtensionTest(unittest.TestCase): res_ext = extensions.ResourceExtension('tweedles', StubController(response_body)) manager = StubExtensionManager(res_ext) - app = openstack.APIRouter() + app = openstack.APIRouterV11() ext_midware = extensions.ExtensionMiddleware(app, manager) request = webob.Request.blank("/tweedles") response = request.get_response(ext_midware) @@ -137,7 +137,7 @@ class ExtensionManagerTest(unittest.TestCase): "extensions") def test_get_resources(self): - app = openstack.APIRouter() + app = openstack.APIRouterV11() ext_midware = extensions.ExtensionMiddleware(app) request = webob.Request.blank("/foxnsocks") response = request.get_response(ext_midware) @@ -152,7 +152,7 @@ class ActionExtensionTest(unittest.TestCase): "extensions") def _send_server_action_request(self, url, body): - app = openstack.APIRouter() + app = openstack.APIRouterV11() ext_midware = extensions.ExtensionMiddleware(app) request = webob.Request.blank(url) request.method = 'POST' -- cgit From e5069f27cd9e6551a6b035d6fff1b02a6bf0b492 Mon Sep 17 00:00:00 2001 From: Dan Prince Date: Thu, 24 Mar 2011 13:56:25 -0400 Subject: Reconcile tests with latest trunk merges. --- nova/tests/api/openstack/extensions/foxinsocks.py | 4 ++-- nova/tests/api/openstack/test_extensions.py | 13 +++++++++---- 2 files changed, 11 insertions(+), 6 deletions(-) (limited to 'nova/tests') diff --git a/nova/tests/api/openstack/extensions/foxinsocks.py b/nova/tests/api/openstack/extensions/foxinsocks.py index 249dd81bf..0860b51ac 100644 --- a/nova/tests/api/openstack/extensions/foxinsocks.py +++ b/nova/tests/api/openstack/extensions/foxinsocks.py @@ -73,7 +73,7 @@ class Foxinsocks(object): data['flavor']['googoose'] = "Gooey goo for chewy chewing!" return data - resp_ext = extensions.ResponseExtension('GET', '/v1.0/flavors/:(id)', + resp_ext = extensions.ResponseExtension('GET', '/v1.1/flavors/:(id)', _goose_handler) response_exts.append(resp_ext) @@ -84,7 +84,7 @@ class Foxinsocks(object): data['big_bands'] = 'Pig Bands!' return data - resp_ext2 = extensions.ResponseExtension('GET', '/v1.0/flavors/:(id)', + resp_ext2 = extensions.ResponseExtension('GET', '/v1.1/flavors/:(id)', _bands_handler) response_exts.append(resp_ext2) return response_exts diff --git a/nova/tests/api/openstack/test_extensions.py b/nova/tests/api/openstack/test_extensions.py index 4bc823d15..481d34ed1 100644 --- a/nova/tests/api/openstack/test_extensions.py +++ b/nova/tests/api/openstack/test_extensions.py @@ -193,6 +193,10 @@ class ResponseExtensionTest(unittest.TestCase): fakes.stub_out_auth(self.stubs) self.context = context.get_admin_context() + def tearDown(self): + self.stubs.UnsetAll() + super(ResponseExtensionTest, self).tearDown() + def test_get_resources_with_stub_mgr(self): test_resp = "Gooey goo for chewy chewing!" @@ -204,13 +208,14 @@ class ResponseExtensionTest(unittest.TestCase): return data resp_ext = extensions.ResponseExtension('GET', - '/v1.0/flavors/:(id)', + '/v1.1/flavors/:(id)', _resp_handler) manager = StubExtensionManager(None, None, resp_ext) app = fakes.wsgi_app() ext_midware = extensions.ExtensionMiddleware(app, manager) - request = webob.Request.blank("/v1.0/flavors/1") + request = webob.Request.blank("/v1.1/flavors/1") + request.environ['api.version'] = '1.1' response = request.get_response(ext_midware) self.assertEqual(200, response.status_int) response_data = json.loads(response.body) @@ -222,10 +227,10 @@ class ResponseExtensionTest(unittest.TestCase): app = fakes.wsgi_app() ext_midware = extensions.ExtensionMiddleware(app) - request = webob.Request.blank("/v1.0/flavors/1") + request = webob.Request.blank("/v1.1/flavors/1") + request.environ['api.version'] = '1.1' response = request.get_response(ext_midware) self.assertEqual(200, response.status_int) response_data = json.loads(response.body) - print response_data self.assertEqual(test_resp, response_data['flavor']['googoose']) self.assertEqual("Pig Bands!", response_data['big_bands']) -- cgit From c7ccbd7a16a546cbd0717427772691ce7d8b4da6 Mon Sep 17 00:00:00 2001 From: termie Date: Thu, 24 Mar 2011 12:42:46 -0700 Subject: support volume and network in the direct api --- nova/tests/test_direct.py | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) (limited to 'nova/tests') diff --git a/nova/tests/test_direct.py b/nova/tests/test_direct.py index 80e4d2e1f..001246fc4 100644 --- a/nova/tests/test_direct.py +++ b/nova/tests/test_direct.py @@ -25,7 +25,9 @@ import webob from nova import compute from nova import context from nova import exception +from nova import network from nova import test +from nova import volume from nova import utils from nova.api import direct from nova.tests import test_cloud @@ -93,12 +95,20 @@ class DirectTestCase(test.TestCase): class DirectCloudTestCase(test_cloud.CloudTestCase): def setUp(self): super(DirectCloudTestCase, self).setUp() - compute_handle = compute.API(network_api=self.cloud.network_api, - volume_api=self.cloud.volume_api) + compute_handle = compute.API(image_service=self.cloud.image_service) + volume_handle = volume.API() + network_handle = network.API() direct.register_service('compute', compute_handle) + direct.register_service('volume', volume_handle) + direct.register_service('network', network_handle) + self.router = direct.JsonParamsMiddleware(direct.Router()) proxy = direct.Proxy(self.router) self.cloud.compute_api = proxy.compute + self.cloud.volume_api = proxy.volume + self.cloud.network_api = proxy.network + compute_handle.volume_api = proxy.volume + compute_handle.network_api = proxy.network def tearDown(self): super(DirectCloudTestCase, self).tearDown() -- cgit From 4a6db815b01c71076bae96c155396e5adbe8af90 Mon Sep 17 00:00:00 2001 From: termie Date: Thu, 24 Mar 2011 12:42:47 -0700 Subject: better error handling and serialization --- nova/tests/test_direct.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'nova/tests') diff --git a/nova/tests/test_direct.py b/nova/tests/test_direct.py index 001246fc4..383840234 100644 --- a/nova/tests/test_direct.py +++ b/nova/tests/test_direct.py @@ -33,6 +33,9 @@ from nova.api import direct from nova.tests import test_cloud +class ArbitraryObject(object): + pass + class FakeService(object): def echo(self, context, data): return {'data': data} @@ -41,6 +44,9 @@ class FakeService(object): return {'user': context.user_id, 'project': context.project_id} + def invalid_return(self, context): + return ArbitraryObject() + class DirectTestCase(test.TestCase): def setUp(self): @@ -86,6 +92,12 @@ class DirectTestCase(test.TestCase): resp_parsed = json.loads(resp.body) self.assertEqual(resp_parsed['data'], 'foo') + def test_invalid(self): + req = webob.Request.blank('/fake/invalid_return') + req.environ['openstack.context'] = self.context + req.method = 'POST' + self.assertRaises(exception.Error, req.get_response, self.router) + def test_proxy(self): proxy = direct.Proxy(self.router) rv = proxy.fake.echo(self.context, data='baz') -- cgit From c5cbec20d2785d3060d57b55a264fbf936709500 Mon Sep 17 00:00:00 2001 From: termie Date: Thu, 24 Mar 2011 13:20:15 -0700 Subject: pep8 cleanups --- nova/tests/test_direct.py | 1 + 1 file changed, 1 insertion(+) (limited to 'nova/tests') diff --git a/nova/tests/test_direct.py b/nova/tests/test_direct.py index 383840234..588a24b35 100644 --- a/nova/tests/test_direct.py +++ b/nova/tests/test_direct.py @@ -36,6 +36,7 @@ from nova.tests import test_cloud class ArbitraryObject(object): pass + class FakeService(object): def echo(self, context, data): return {'data': data} -- cgit