diff options
| author | Jenkins <jenkins@review.openstack.org> | 2013-06-26 21:50:48 +0000 |
|---|---|---|
| committer | Gerrit Code Review <review@openstack.org> | 2013-06-26 21:50:48 +0000 |
| commit | e95dfc03fdb1e7018d8b4f76f299642001017001 (patch) | |
| tree | 0be46e02ed619c74a5bade6c28ccd14e14325d03 /nova | |
| parent | cda758f89910f5299eceff033acc491dd656b013 (diff) | |
| parent | 3689771504df2e1c4b403613793ea88eea4bf820 (diff) | |
| download | nova-e95dfc03fdb1e7018d8b4f76f299642001017001.tar.gz nova-e95dfc03fdb1e7018d8b4f76f299642001017001.tar.xz nova-e95dfc03fdb1e7018d8b4f76f299642001017001.zip | |
Merge "Cells: Pass object for start/stop"
Diffstat (limited to 'nova')
| -rw-r--r-- | nova/cells/messaging.py | 8 | ||||
| -rw-r--r-- | nova/tests/cells/test_cells_messaging.py | 55 |
2 files changed, 63 insertions, 0 deletions
diff --git a/nova/cells/messaging.py b/nova/cells/messaging.py index 24ad29e08..cacb4b8e3 100644 --- a/nova/cells/messaging.py +++ b/nova/cells/messaging.py @@ -36,6 +36,7 @@ from nova.consoleauth import rpcapi as consoleauth_rpcapi from nova import context from nova.db import base from nova import exception +from nova.objects import instance as instance_obj from nova.openstack.common import excutils from nova.openstack.common import importutils from nova.openstack.common import jsonutils @@ -678,6 +679,13 @@ class _TargetedMessageMethods(_BaseMessageMethods): instance = {'uuid': instance_uuid} self.msg_runner.instance_destroy_at_top(message.ctxt, instance) + # FIXME(comstud): This is temporary/transitional until I can + # work out a better way to pass full objects down. + EXPECTS_OBJECTS = ['start', 'stop'] + if method in EXPECTS_OBJECTS: + inst_obj = instance_obj.Instance() + inst_obj._from_db_object(inst_obj, instance) + instance = inst_obj args[0] = instance return fn(message.ctxt, *args, **method_info['method_kwargs']) diff --git a/nova/tests/cells/test_cells_messaging.py b/nova/tests/cells/test_cells_messaging.py index f9e97d717..734fecf0e 100644 --- a/nova/tests/cells/test_cells_messaging.py +++ b/nova/tests/cells/test_cells_messaging.py @@ -23,6 +23,7 @@ from nova.compute import vm_states from nova import context from nova import db from nova import exception +from nova.objects import instance as instance_obj from nova.openstack.common import rpc from nova.openstack.common import timeutils from nova import test @@ -641,6 +642,60 @@ class CellsTargetedMethodsTestCase(test.TestCase): result = response.value_or_raise() self.assertEqual('fake_result', result) + def test_run_compute_api_method_expects_obj(self): + instance_uuid = 'fake_instance_uuid' + method_info = {'method': 'start', + 'method_args': (instance_uuid, 2, 3), + 'method_kwargs': {'arg1': 'val1', 'arg2': 'val2'}} + self.mox.StubOutWithMock(self.tgt_compute_api, 'start') + self.mox.StubOutWithMock(self.tgt_db_inst, 'instance_get_by_uuid') + + self.tgt_db_inst.instance_get_by_uuid(self.ctxt, + instance_uuid).AndReturn('fake_instance') + + def get_instance_mock(): + # NOTE(comstud): This block of code simulates the following + # mox code: + # + # self.mox.StubOutWithMock(instance_obj, 'Instance', + # use_mock_anything=True) + # self.mox.StubOutWithMock(instance_obj.Instance, + # '_from_db_object') + # instance_mock = self.mox.CreateMock(instance_obj.Instance) + # instance_obj.Instance().AndReturn(instance_mock) + # + # Unfortunately, the above code fails on py27 do to some + # issue with the Mock object do to similar issue as this: + # https://code.google.com/p/pymox/issues/detail?id=35 + # + class FakeInstance(object): + def _from_db_object(obj, db_obj): + pass + + instance_mock = FakeInstance() + + def fake_instance(): + return instance_mock + + self.stubs.Set(instance_obj, 'Instance', fake_instance) + self.mox.StubOutWithMock(instance_mock, '_from_db_object') + return instance_mock + + instance = get_instance_mock() + instance._from_db_object( + instance, 'fake_instance').AndReturn(instance) + self.tgt_compute_api.start(self.ctxt, instance, 2, 3, + arg1='val1', arg2='val2').AndReturn('fake_result') + self.mox.ReplayAll() + + response = self.src_msg_runner.run_compute_api_method( + self.ctxt, + self.tgt_cell_name, + method_info, + True) + result = response.value_or_raise() + self.assertEqual('fake_result', result) + def test_run_compute_api_method_unknown_instance(self): # Unknown instance should send a broadcast up that instance # is gone. |
