summaryrefslogtreecommitdiffstats
path: root/nova
diff options
context:
space:
mode:
authorChris Behrens <cbehrens@codestud.com>2013-06-17 22:33:40 +0000
committerChris Behrens <cbehrens@codestud.com>2013-06-21 18:44:44 +0000
commit3689771504df2e1c4b403613793ea88eea4bf820 (patch)
tree0a87162a6f5cf57b7cada9f79a831f15c084ac34 /nova
parent022bd8d6c16a1a06a3996f1fa827bc17b4272af7 (diff)
downloadnova-3689771504df2e1c4b403613793ea88eea4bf820.tar.gz
nova-3689771504df2e1c4b403613793ea88eea4bf820.tar.xz
nova-3689771504df2e1c4b403613793ea88eea4bf820.zip
Cells: Pass object for start/stop
The compute_api start/stop methods expect an Instance object, but cells is still passing the dict or sqlalchemy form. Fixes bug 1191040 Change-Id: I21e0f0b5d7e3160e23c7a84f59ae3899538c7327
Diffstat (limited to 'nova')
-rw-r--r--nova/cells/messaging.py8
-rw-r--r--nova/tests/cells/test_cells_messaging.py55
2 files changed, 63 insertions, 0 deletions
diff --git a/nova/cells/messaging.py b/nova/cells/messaging.py
index 319067836..31b6865a1 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 d4d9b052e..9044fda2f 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.