Merge "Cells: Pass object for start/stop"

This commit is contained in:
Jenkins
2013-06-26 21:50:48 +00:00
committed by Gerrit Code Review
2 changed files with 63 additions and 0 deletions

View File

@@ -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'])

View File

@@ -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.