Merge "Cells: Pass object for start/stop"
This commit is contained in:
@@ -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'])
|
||||
|
||||
|
||||
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user