From 5999adfa0d8cd69269238b1ea7bb8eac500c16af Mon Sep 17 00:00:00 2001 From: Andrew Melton Date: Wed, 28 Jan 2015 08:36:29 -0800 Subject: [PATCH] Pull RequestContext Patching Into Test Base The new patching only ensures that auth_token_info is properly set up by default. A real RequestContext is returned, and it is passed through to_dict and from_dict to ensure there are no assumptions made that will not work through RPC. If necessary, tests can still return a mock context by setting a return_value or side_effect on self.mock_make_ctxt. Change-Id: I6369e0bd89d83a5ea3ddde2b35423233fee18327 --- magnum/api/hooks.py | 2 +- magnum/common/context.py | 4 +++ magnum/tests/api/controllers/v1/test_bay.py | 27 +------------------ .../tests/api/controllers/v1/test_baymodel.py | 7 ----- .../api/controllers/v1/test_container.py | 7 +---- magnum/tests/api/controllers/v1/test_node.py | 8 +----- magnum/tests/api/controllers/v1/test_pod.py | 6 +---- .../v1/test_replicationcontroller.py | 6 +---- .../tests/api/controllers/v1/test_service.py | 6 +---- magnum/tests/base.py | 17 +++++++++++- 10 files changed, 27 insertions(+), 63 deletions(-) diff --git a/magnum/api/hooks.py b/magnum/api/hooks.py index 1df33f51ea..77ab16c210 100644 --- a/magnum/api/hooks.py +++ b/magnum/api/hooks.py @@ -58,7 +58,7 @@ class ContextHook(hooks.PecanHook): importutils.import_module('keystonemiddleware.auth_token') auth_url = cfg.CONF.keystone_authtoken.auth_uri - state.request.context = context.RequestContext( + state.request.context = context.make_context( auth_token=auth_token, auth_url=auth_url, auth_token_info=auth_token_info, diff --git a/magnum/common/context.py b/magnum/common/context.py index e5e1639c28..a5bedd36df 100644 --- a/magnum/common/context.py +++ b/magnum/common/context.py @@ -62,3 +62,7 @@ class RequestContext(context.RequestContext): values.pop('user', None) values.pop('tenant', None) return cls(**values) + + +def make_context(*args, **kwargs): + return RequestContext(*args, **kwargs) diff --git a/magnum/tests/api/controllers/v1/test_bay.py b/magnum/tests/api/controllers/v1/test_bay.py index db2ef3f83b..42d03f231d 100644 --- a/magnum/tests/api/controllers/v1/test_bay.py +++ b/magnum/tests/api/controllers/v1/test_bay.py @@ -19,7 +19,6 @@ from six.moves.urllib import parse as urlparse from wsme import types as wtypes from magnum.api.controllers.v1 import bay as api_bay -from magnum.common import context from magnum.common import utils from magnum.conductor import api as rpcapi from magnum import objects @@ -43,12 +42,6 @@ class TestListBay(api_base.FunctionalTest): def setUp(self): super(TestListBay, self).setUp() obj_utils.create_test_baymodel(self.context) - p = mock.patch.object(context, 'RequestContext') - self.mock_request_context = p.start() - mock_auth_token = self.mock_request_context.auth_token_info['token'] - mock_auth_token['project']['id'].return_value = 'fake_project' - mock_auth_token['user']['id'].return_value = 'fake_user' - self.addCleanup(p.stop) def test_empty(self): response = self.get_json('/bays') @@ -136,12 +129,6 @@ class TestPatch(api_base.FunctionalTest): self.bay = obj_utils.create_test_bay(self.context, name='bay_example_A', node_count=3) - p = mock.patch.object(context, 'RequestContext') - self.mock_request_context = p.start() - mock_auth_token = self.mock_request_context.auth_token_info['token'] - mock_auth_token['project']['id'].return_value = 'fake_project' - mock_auth_token['user']['id'].return_value = 'fake_user' - self.addCleanup(p.stop) @mock.patch.object(timeutils, 'utcnow') def test_replace_ok(self, mock_utcnow): @@ -303,12 +290,6 @@ class TestPost(api_base.FunctionalTest): self.mock_bay_create = p.start() self.mock_bay_create.side_effect = self._simulate_rpc_bay_create self.addCleanup(p.stop) - p = mock.patch.object(context, 'RequestContext') - self.mock_request_context = p.start() - mock_auth_token = self.mock_request_context.auth_token_info['token'] - mock_auth_token['project']['id'].return_value = 'fake_project' - mock_auth_token['user']['id'].return_value = 'fake_user' - self.addCleanup(p.stop) def _simulate_rpc_bay_create(self, bay): bay.create() @@ -384,15 +365,9 @@ class TestDelete(api_base.FunctionalTest): self.mock_bay_delete = p.start() self.mock_bay_delete.side_effect = self._simulate_rpc_bay_delete self.addCleanup(p.stop) - p = mock.patch.object(context, 'RequestContext') - self.mock_request_context = p.start() - mock_auth_token = self.mock_request_context.auth_token_info['token'] - mock_auth_token['project']['id'].return_value = 'fake_project' - mock_auth_token['user']['id'].return_value = 'fake_user' - self.addCleanup(p.stop) def _simulate_rpc_bay_delete(self, bay_uuid): - bay = objects.Bay.get_by_uuid(self.mock_request_context, bay_uuid) + bay = objects.Bay.get_by_uuid(self.context, bay_uuid) bay.destroy() def test_delete_bay(self): diff --git a/magnum/tests/api/controllers/v1/test_baymodel.py b/magnum/tests/api/controllers/v1/test_baymodel.py index be3f807a91..4e65c59f12 100644 --- a/magnum/tests/api/controllers/v1/test_baymodel.py +++ b/magnum/tests/api/controllers/v1/test_baymodel.py @@ -19,7 +19,6 @@ from six.moves.urllib import parse as urlparse from wsme import types as wtypes from magnum.api.controllers.v1 import baymodel as api_baymodel -from magnum.common import context from magnum.common import utils from magnum.tests.api import base as api_base from magnum.tests.api import utils as apiutils @@ -249,12 +248,6 @@ class TestPost(api_base.FunctionalTest): def setUp(self): super(TestPost, self).setUp() - p = mock.patch.object(context, 'RequestContext') - self.mock_request_context = p.start() - mock_auth_token = self.mock_request_context.auth_token_info['token'] - mock_auth_token['project']['id'].return_value = 'fake_project' - mock_auth_token['user']['id'].return_value = 'fake_user' - self.addCleanup(p.stop) @mock.patch.object(timeutils, 'utcnow') def test_create_baymodel(self, mock_utcnow): diff --git a/magnum/tests/api/controllers/v1/test_container.py b/magnum/tests/api/controllers/v1/test_container.py index df6da2e48b..a63f685d67 100644 --- a/magnum/tests/api/controllers/v1/test_container.py +++ b/magnum/tests/api/controllers/v1/test_container.py @@ -15,7 +15,6 @@ from mock import patch class TestContainerController(db_base.DbTestCase): - @patch('magnum.common.context.RequestContext') @patch('magnum.conductor.api.API.container_create') @patch('magnum.conductor.api.API.container_delete') @patch('magnum.conductor.api.API.container_start') @@ -34,8 +33,7 @@ class TestContainerController(db_base.DbTestCase): mock_container_stop, mock_container_start, mock_container_delete, - mock_container_create, - mock_RequestContext): + mock_container_create): mock_container_create.side_effect = lambda x, y, z: z mock_container_start.return_value = None mock_container_stop.return_value = None @@ -44,9 +42,6 @@ class TestContainerController(db_base.DbTestCase): mock_container_reboot.return_value = None mock_container_logs.return_value = None mock_container_execute.return_value = None - mock_auth_token = mock_RequestContext.auth_token_info['token'] - mock_auth_token['project']['id'].return_value = 'fake_project' - mock_auth_token['user']['id'].return_value = 'fake_user' # Create a container params = '{"name": "My Docker", "image_id": "ubuntu"}' diff --git a/magnum/tests/api/controllers/v1/test_node.py b/magnum/tests/api/controllers/v1/test_node.py index dc6febff0d..f6ba19e8a3 100644 --- a/magnum/tests/api/controllers/v1/test_node.py +++ b/magnum/tests/api/controllers/v1/test_node.py @@ -9,19 +9,13 @@ # 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. -from mock import patch - from magnum.tests.db import base as db_base class TestNodeController(db_base.DbTestCase): - @patch('magnum.common.context.RequestContext') - def test_node_api(self, mock_RequestContext): + def test_node_api(self): # Create a node params = '{"type": "bare", "image_id": "Fedora"}' - mock_auth_token = mock_RequestContext.auth_token_info['token'] - mock_auth_token['project']['id'].return_value = 'fake_project' - mock_auth_token['user']['id'].return_value = 'fake_user' response = self.app.post('/v1/nodes', params=params, content_type='application/json') diff --git a/magnum/tests/api/controllers/v1/test_pod.py b/magnum/tests/api/controllers/v1/test_pod.py index cf5e7b4836..8d7487cdb1 100644 --- a/magnum/tests/api/controllers/v1/test_pod.py +++ b/magnum/tests/api/controllers/v1/test_pod.py @@ -26,13 +26,9 @@ class TestPodController(db_base.DbTestCase): pod = objects.Pod.get_by_uuid({}, pod_uuid) pod.destroy() - @patch('magnum.common.context.RequestContext') - def test_pod_api(self, mock_RequestContext): + def test_pod_api(self): with patch.object(api.API, 'pod_create') as mock_method: mock_method.side_effect = self.mock_pod_create - mock_auth_token = mock_RequestContext.auth_token_info['token'] - mock_auth_token['project']['id'].return_value = 'fake_project' - mock_auth_token['user']['id'].return_value = 'fake_user' # Create a bay bay = db_utils.create_test_bay() diff --git a/magnum/tests/api/controllers/v1/test_replicationcontroller.py b/magnum/tests/api/controllers/v1/test_replicationcontroller.py index 3638872317..02acb77135 100644 --- a/magnum/tests/api/controllers/v1/test_replicationcontroller.py +++ b/magnum/tests/api/controllers/v1/test_replicationcontroller.py @@ -26,13 +26,9 @@ class TestRCController(db_base.DbTestCase): rc = objects.ReplicationController.get_by_uuid({}, uuid) rc.destroy() - @patch('magnum.common.context.RequestContext') - def test_rc_api(self, mock_RequestContext): + def test_rc_api(self): with patch.object(api.API, 'rc_create') as mock_method: mock_method.side_effect = self.mock_rc_create - mock_auth_token = mock_RequestContext.auth_token_info['token'] - mock_auth_token['project']['id'].return_value = 'fake_project' - mock_auth_token['user']['id'].return_value = 'fake_user' # Create a bay bay = db_utils.create_test_bay() diff --git a/magnum/tests/api/controllers/v1/test_service.py b/magnum/tests/api/controllers/v1/test_service.py index ddf583a367..1a0b829386 100644 --- a/magnum/tests/api/controllers/v1/test_service.py +++ b/magnum/tests/api/controllers/v1/test_service.py @@ -27,13 +27,9 @@ class TestServiceController(db_base.DbTestCase): service = objects.Service.get_by_uuid({}, uuid) service.destroy() - @patch('magnum.common.context.RequestContext') - def test_service_api(self, mock_RequestContext): + def test_service_api(self): with patch.object(api.API, 'service_create') as mock_method: mock_method.side_effect = self.mock_service_create - mock_auth_token = mock_RequestContext.auth_token_info['token'] - mock_auth_token['project']['id'].return_value = 'fake_project' - mock_auth_token['user']['id'].return_value = 'fake_user' # Create a bay bay = db_utils.create_test_bay() diff --git a/magnum/tests/base.py b/magnum/tests/base.py index 56c1e15c02..23744ab891 100644 --- a/magnum/tests/base.py +++ b/magnum/tests/base.py @@ -18,6 +18,7 @@ import copy import os +import mock from oslo.config import cfg from oslotest import base import pecan @@ -61,7 +62,21 @@ class TestCase(base.BaseTestCase): } } self.context = magnum_context.RequestContext( - auth_token_info=token_info) + auth_token_info=token_info) + + def make_context(*args, **kwargs): + # If context hasn't been constructed with token_info + if not kwargs.get('auth_token_info'): + kwargs['auth_token_info'] = copy.deepcopy(token_info) + + ctxt = magnum_context.RequestContext(*args, **kwargs) + return magnum_context.RequestContext.from_dict(ctxt.to_dict()) + + p = mock.patch.object(magnum_context, 'make_context', + side_effect=make_context) + self.mock_make_ctxt = p.start() + self.addCleanup(p.stop) + self.useFixture(conf_fixture.ConfFixture(cfg.CONF)) self._base_test_obj_backup = copy.copy(