Merge "Fix TypeError exception during cancel stack update"

This commit is contained in:
Jenkins 2015-04-30 09:15:39 +00:00 committed by Gerrit Code Review
commit 37fc86fb42
2 changed files with 27 additions and 3 deletions

View File

@ -806,7 +806,7 @@ class EngineService(service.Service):
elif stack_lock.StackLock.engine_alive(cnxt, engine_id): elif stack_lock.StackLock.engine_alive(cnxt, engine_id):
cancel_result = self._remote_call( cancel_result = self._remote_call(
cnxt, engine_id, self.listener.SEND, cnxt, engine_id, self.listener.SEND,
stack_identity, rpc_api.THREAD_CANCEL) stack_identity=stack_identity, message=rpc_api.THREAD_CANCEL)
if cancel_result is None: if cancel_result is None:
LOG.debug("Successfully sent %(msg)s message " LOG.debug("Successfully sent %(msg)s message "
"to remote task on engine %(eng)s" % { "to remote task on engine %(eng)s" % {
@ -902,7 +902,7 @@ class EngineService(service.Service):
return s.raw_template.template return s.raw_template.template
return None return None
def _remote_call(self, cnxt, lock_engine_id, call, *args, **kwargs): def _remote_call(self, cnxt, lock_engine_id, call, **kwargs):
timeout = cfg.CONF.engine_life_check_timeout timeout = cfg.CONF.engine_life_check_timeout
self.cctxt = self._client.prepare( self.cctxt = self._client.prepare(
version='1.0', version='1.0',
@ -910,7 +910,7 @@ class EngineService(service.Service):
topic=rpc_api.LISTENER_TOPIC, topic=rpc_api.LISTENER_TOPIC,
server=lock_engine_id) server=lock_engine_id)
try: try:
self.cctxt.call(cnxt, call, *args, **kwargs) self.cctxt.call(cnxt, call, **kwargs)
except messaging.MessagingTimeout: except messaging.MessagingTimeout:
return False return False

View File

@ -27,6 +27,7 @@ import six
from heat.common import context from heat.common import context
from heat.common import exception from heat.common import exception
from heat.common import identifier from heat.common import identifier
from heat.common import messaging
from heat.common import service_utils from heat.common import service_utils
from heat.common import template_format from heat.common import template_format
from heat.engine.clients.os import swift from heat.engine.clients.os import swift
@ -986,6 +987,29 @@ class StackServiceCreateUpdateDeleteTest(common.HeatTestCase):
self.man.thread_group_mgr.send.assert_called_once_with(old_stack.id, self.man.thread_group_mgr.send.assert_called_once_with(old_stack.id,
'cancel') 'cancel')
def test_stack_cancel_update_different_engine(self):
stack_name = 'service_update_cancel_test_stack'
old_stack = tools.get_stack(stack_name, self.ctx)
old_stack.state_set(old_stack.UPDATE, old_stack.IN_PROGRESS,
'test_override')
old_stack.disable_rollback = False
old_stack.store()
load_mock = self.patchobject(parser.Stack, 'load')
load_mock.return_value = old_stack
lock_mock = self.patchobject(stack_lock.StackLock, 'try_acquire')
another_engine_has_lock = str(uuid.uuid4())
lock_mock.return_value = another_engine_has_lock
self.patchobject(stack_lock.StackLock,
'engine_alive').return_value(True)
self.man.listener = mock.Mock()
self.man.listener.SEND = 'send'
self.man._client = messaging.get_rpc_client(
version=self.man.RPC_API_VERSION)
# In fact the another engine is not alive, so the call will timeout
self.assertRaises(dispatcher.ExpectedException,
self.man.stack_cancel_update,
self.ctx, old_stack.identifier())
def test_stack_cancel_update_wrong_state_fails(self): def test_stack_cancel_update_wrong_state_fails(self):
stack_name = 'service_update_cancel_test_stack' stack_name = 'service_update_cancel_test_stack'
old_stack = tools.get_stack(stack_name, self.ctx) old_stack = tools.get_stack(stack_name, self.ctx)