Convergence: clarify what "data" is
Mostly in worker we have arguments called "data", it is not clear if these are serialized or not (and if they have adopt data in them). 1. split adopt data out (add RPC support for the new argument) 2. name arguments "resource_data" for deserialized data 3. name arguments "rpc_data" for serialized data 4. make sure all data into client.check_resource() is serialized Change-Id: Ie6bd0e45d2857d3a23235776c2b96cce02cb711a
This commit is contained in:
parent
14897230fb
commit
d23ebb6065
|
@ -273,8 +273,6 @@ class Resource(object):
|
||||||
def special_stack(tmpl, swap_template):
|
def special_stack(tmpl, swap_template):
|
||||||
# TODO(sirushtim): Load stack from cache
|
# TODO(sirushtim): Load stack from cache
|
||||||
stk = stack_mod.Stack.load(context, db_res.stack_id)
|
stk = stack_mod.Stack.load(context, db_res.stack_id)
|
||||||
stk.adopt_stack_data = data.get('adopt_stack_data')
|
|
||||||
|
|
||||||
# NOTE(sirushtim): Because on delete/cleanup operations, we simply
|
# NOTE(sirushtim): Because on delete/cleanup operations, we simply
|
||||||
# update with another template, the stack object won't have the
|
# update with another template, the stack object won't have the
|
||||||
# template of the previous stack-run.
|
# template of the previous stack-run.
|
||||||
|
|
|
@ -999,11 +999,11 @@ class Stack(collections.Mapping):
|
||||||
LOG.info(_LI("Triggering resource %(rsrc_id)s "
|
LOG.info(_LI("Triggering resource %(rsrc_id)s "
|
||||||
"for %(is_update)s update"),
|
"for %(is_update)s update"),
|
||||||
{'rsrc_id': rsrc_id, 'is_update': is_update})
|
{'rsrc_id': rsrc_id, 'is_update': is_update})
|
||||||
input_data = {'input_data': {},
|
input_data = sync_point.serialize_input_data({})
|
||||||
'adopt_stack_data': self.adopt_stack_data}
|
|
||||||
self.worker_client.check_resource(self.context, rsrc_id,
|
self.worker_client.check_resource(self.context, rsrc_id,
|
||||||
self.current_traversal,
|
self.current_traversal,
|
||||||
input_data, is_update)
|
input_data, is_update,
|
||||||
|
self.adopt_stack_data)
|
||||||
|
|
||||||
def rollback(self):
|
def rollback(self):
|
||||||
old_tmpl_id = self.prev_raw_template_id
|
old_tmpl_id = self.prev_raw_template_id
|
||||||
|
|
|
@ -45,7 +45,7 @@ class WorkerService(service.Service):
|
||||||
or expect replies from these messages.
|
or expect replies from these messages.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
RPC_API_VERSION = '1.1'
|
RPC_API_VERSION = '1.2'
|
||||||
|
|
||||||
def __init__(self,
|
def __init__(self,
|
||||||
host,
|
host,
|
||||||
|
@ -60,12 +60,14 @@ class WorkerService(service.Service):
|
||||||
|
|
||||||
self._rpc_client = rpc_client.WorkerClient()
|
self._rpc_client = rpc_client.WorkerClient()
|
||||||
self._rpc_server = None
|
self._rpc_server = None
|
||||||
|
self.target = None
|
||||||
|
|
||||||
def start(self):
|
def start(self):
|
||||||
target = oslo_messaging.Target(
|
target = oslo_messaging.Target(
|
||||||
version=self.RPC_API_VERSION,
|
version=self.RPC_API_VERSION,
|
||||||
server=self.host,
|
server=self.host,
|
||||||
topic=self.topic)
|
topic=self.topic)
|
||||||
|
self.target = target
|
||||||
LOG.info(_LI("Starting %(topic)s (%(version)s) in engine %(engine)s."),
|
LOG.info(_LI("Starting %(topic)s (%(version)s) in engine %(engine)s."),
|
||||||
{'topic': self.topic,
|
{'topic': self.topic,
|
||||||
'version': self.RPC_API_VERSION,
|
'version': self.RPC_API_VERSION,
|
||||||
|
@ -121,19 +123,15 @@ class WorkerService(service.Service):
|
||||||
else:
|
else:
|
||||||
stack.purge_db()
|
stack.purge_db()
|
||||||
|
|
||||||
def _load_resource(self, cnxt, resource_id, data, is_update):
|
def _load_resource(self, cnxt, resource_id, resource_data, is_update):
|
||||||
adopt_data = data.get('adopt_stack_data')
|
|
||||||
data = dict(sync_point.deserialize_input_data(data))
|
|
||||||
|
|
||||||
if is_update:
|
if is_update:
|
||||||
cache_data = {in_data.get(
|
cache_data = {in_data.get(
|
||||||
'name'): in_data for in_data in data.values()
|
'name'): in_data for in_data in resource_data.values()
|
||||||
if in_data is not None}
|
if in_data is not None}
|
||||||
else:
|
else:
|
||||||
# no data to resolve in cleanup phase
|
# no data to resolve in cleanup phase
|
||||||
cache_data = {}
|
cache_data = {}
|
||||||
|
|
||||||
cache_data['adopt_stack_data'] = adopt_data
|
|
||||||
rsrc, stack = None, None
|
rsrc, stack = None, None
|
||||||
try:
|
try:
|
||||||
rsrc, stack = resource.Resource.load(cnxt, resource_id, is_update,
|
rsrc, stack = resource.Resource.load(cnxt, resource_id, is_update,
|
||||||
|
@ -143,32 +141,37 @@ class WorkerService(service.Service):
|
||||||
|
|
||||||
return rsrc, stack
|
return rsrc, stack
|
||||||
|
|
||||||
def _do_check_resource(self, cnxt, current_traversal, tmpl, data,
|
def _do_check_resource(self, cnxt, current_traversal, tmpl, resource_data,
|
||||||
is_update, rsrc, stack_id):
|
is_update, rsrc, stack_id, adopt_stack_data):
|
||||||
try:
|
try:
|
||||||
if is_update:
|
if is_update:
|
||||||
try:
|
try:
|
||||||
check_resource_update(rsrc, tmpl.id, data, self.engine_id)
|
check_resource_update(rsrc, tmpl.id, resource_data,
|
||||||
|
self.engine_id)
|
||||||
except resource.UpdateReplace:
|
except resource.UpdateReplace:
|
||||||
new_res_id = rsrc.make_replacement(tmpl.id)
|
new_res_id = rsrc.make_replacement(tmpl.id)
|
||||||
LOG.info("Replacing resource with new id %s", new_res_id)
|
LOG.info("Replacing resource with new id %s", new_res_id)
|
||||||
data = sync_point.serialize_input_data(data)
|
rpc_data = sync_point.serialize_input_data(resource_data)
|
||||||
self._rpc_client.check_resource(cnxt,
|
self._rpc_client.check_resource(cnxt,
|
||||||
new_res_id,
|
new_res_id,
|
||||||
current_traversal,
|
current_traversal,
|
||||||
data, is_update)
|
rpc_data, is_update,
|
||||||
|
adopt_stack_data)
|
||||||
return False
|
return False
|
||||||
|
|
||||||
else:
|
else:
|
||||||
check_resource_cleanup(rsrc, tmpl.id, data, self.engine_id)
|
check_resource_cleanup(rsrc, tmpl.id, resource_data,
|
||||||
|
self.engine_id)
|
||||||
|
|
||||||
return True
|
return True
|
||||||
except resource.UpdateInProgress:
|
except resource.UpdateInProgress:
|
||||||
if self._try_steal_engine_lock(cnxt, rsrc.id):
|
if self._try_steal_engine_lock(cnxt, rsrc.id):
|
||||||
|
rpc_data = sync_point.serialize_input_data(resource_data)
|
||||||
self._rpc_client.check_resource(cnxt,
|
self._rpc_client.check_resource(cnxt,
|
||||||
rsrc.id,
|
rsrc.id,
|
||||||
current_traversal,
|
current_traversal,
|
||||||
data, is_update)
|
rpc_data, is_update,
|
||||||
|
adopt_stack_data)
|
||||||
except exception.ResourceFailure as ex:
|
except exception.ResourceFailure as ex:
|
||||||
reason = 'Resource %s failed: %s' % (rsrc.action,
|
reason = 'Resource %s failed: %s' % (rsrc.action,
|
||||||
six.text_type(ex))
|
six.text_type(ex))
|
||||||
|
@ -232,7 +235,8 @@ class WorkerService(service.Service):
|
||||||
input_data = _get_input_data(req, fwd)
|
input_data = _get_input_data(req, fwd)
|
||||||
propagate_check_resource(
|
propagate_check_resource(
|
||||||
cnxt, self._rpc_client, req, current_traversal,
|
cnxt, self._rpc_client, req, current_traversal,
|
||||||
set(graph[(req, fwd)]), graph_key, input_data, fwd)
|
set(graph[(req, fwd)]), graph_key, input_data, fwd,
|
||||||
|
stack.adopt_stack_data)
|
||||||
|
|
||||||
check_stack_complete(cnxt, stack, current_traversal,
|
check_stack_complete(cnxt, stack, current_traversal,
|
||||||
resource_id, deps, is_update)
|
resource_id, deps, is_update)
|
||||||
|
@ -251,14 +255,16 @@ class WorkerService(service.Service):
|
||||||
|
|
||||||
@context.request_context
|
@context.request_context
|
||||||
def check_resource(self, cnxt, resource_id, current_traversal, data,
|
def check_resource(self, cnxt, resource_id, current_traversal, data,
|
||||||
is_update):
|
is_update, adopt_stack_data):
|
||||||
'''
|
'''
|
||||||
Process a node in the dependency graph.
|
Process a node in the dependency graph.
|
||||||
|
|
||||||
The node may be associated with either an update or a cleanup of its
|
The node may be associated with either an update or a cleanup of its
|
||||||
associated resource.
|
associated resource.
|
||||||
'''
|
'''
|
||||||
rsrc, stack = self._load_resource(cnxt, resource_id, data, is_update)
|
resource_data = dict(sync_point.deserialize_input_data(data))
|
||||||
|
rsrc, stack = self._load_resource(cnxt, resource_id, resource_data,
|
||||||
|
is_update)
|
||||||
|
|
||||||
if rsrc is None:
|
if rsrc is None:
|
||||||
return
|
return
|
||||||
|
@ -268,6 +274,7 @@ class WorkerService(service.Service):
|
||||||
return
|
return
|
||||||
|
|
||||||
tmpl = stack.t
|
tmpl = stack.t
|
||||||
|
stack.adopt_stack_data = adopt_stack_data
|
||||||
|
|
||||||
if is_update:
|
if is_update:
|
||||||
if (rsrc.replaced_by is not None and
|
if (rsrc.replaced_by is not None and
|
||||||
|
@ -275,8 +282,10 @@ class WorkerService(service.Service):
|
||||||
return
|
return
|
||||||
|
|
||||||
check_resource_done = self._do_check_resource(cnxt, current_traversal,
|
check_resource_done = self._do_check_resource(cnxt, current_traversal,
|
||||||
tmpl, data, is_update,
|
tmpl, resource_data,
|
||||||
rsrc, stack.id)
|
is_update,
|
||||||
|
rsrc, stack.id,
|
||||||
|
adopt_stack_data)
|
||||||
|
|
||||||
if check_resource_done:
|
if check_resource_done:
|
||||||
# initiate check on next set of resources from graph
|
# initiate check on next set of resources from graph
|
||||||
|
@ -327,20 +336,20 @@ def check_stack_complete(cnxt, stack, current_traversal, sender_id, deps,
|
||||||
|
|
||||||
def propagate_check_resource(cnxt, rpc_client, next_res_id,
|
def propagate_check_resource(cnxt, rpc_client, next_res_id,
|
||||||
current_traversal, predecessors, sender_key,
|
current_traversal, predecessors, sender_key,
|
||||||
sender_data, is_update):
|
sender_data, is_update, adopt_stack_data):
|
||||||
'''
|
'''
|
||||||
Trigger processing of a node if all of its dependencies are satisfied.
|
Trigger processing of a node if all of its dependencies are satisfied.
|
||||||
'''
|
'''
|
||||||
def do_check(entity_id, data):
|
def do_check(entity_id, data):
|
||||||
rpc_client.check_resource(cnxt, entity_id, current_traversal,
|
rpc_client.check_resource(cnxt, entity_id, current_traversal,
|
||||||
data, is_update)
|
data, is_update, adopt_stack_data)
|
||||||
|
|
||||||
sync_point.sync(cnxt, next_res_id, current_traversal,
|
sync_point.sync(cnxt, next_res_id, current_traversal,
|
||||||
is_update, do_check, predecessors,
|
is_update, do_check, predecessors,
|
||||||
{sender_key: sender_data})
|
{sender_key: sender_data})
|
||||||
|
|
||||||
|
|
||||||
def check_resource_update(rsrc, template_id, data, engine_id):
|
def check_resource_update(rsrc, template_id, resource_data, engine_id):
|
||||||
'''
|
'''
|
||||||
Create or update the Resource if appropriate.
|
Create or update the Resource if appropriate.
|
||||||
'''
|
'''
|
||||||
|
@ -350,13 +359,13 @@ def check_resource_update(rsrc, template_id, data, engine_id):
|
||||||
resource.Resource.COMPLETE,
|
resource.Resource.COMPLETE,
|
||||||
resource.Resource.FAILED
|
resource.Resource.FAILED
|
||||||
])):
|
])):
|
||||||
rsrc.create_convergence(template_id, data, engine_id)
|
rsrc.create_convergence(template_id, resource_data, engine_id)
|
||||||
else:
|
else:
|
||||||
rsrc.update_convergence(template_id, data, engine_id)
|
rsrc.update_convergence(template_id, resource_data, engine_id)
|
||||||
|
|
||||||
|
|
||||||
def check_resource_cleanup(rsrc, template_id, data, engine_id):
|
def check_resource_cleanup(rsrc, template_id, resource_data, engine_id):
|
||||||
'''
|
'''
|
||||||
Delete the Resource if appropriate.
|
Delete the Resource if appropriate.
|
||||||
'''
|
'''
|
||||||
rsrc.delete_convergence(template_id, data, engine_id)
|
rsrc.delete_convergence(template_id, resource_data, engine_id)
|
||||||
|
|
|
@ -28,6 +28,7 @@ class WorkerClient(object):
|
||||||
|
|
||||||
1.0 - Initial version.
|
1.0 - Initial version.
|
||||||
1.1 - Added check_resource.
|
1.1 - Added check_resource.
|
||||||
|
1.2 - Add adopt data argument to check_resource.
|
||||||
'''
|
'''
|
||||||
|
|
||||||
BASE_RPC_API_VERSION = '1.0'
|
BASE_RPC_API_VERSION = '1.0'
|
||||||
|
@ -50,8 +51,10 @@ class WorkerClient(object):
|
||||||
client.cast(ctxt, method, **kwargs)
|
client.cast(ctxt, method, **kwargs)
|
||||||
|
|
||||||
def check_resource(self, ctxt, resource_id,
|
def check_resource(self, ctxt, resource_id,
|
||||||
current_traversal, data, is_update):
|
current_traversal, data, is_update, adopt_stack_data):
|
||||||
self.cast(ctxt, self.make_msg(
|
self.cast(ctxt,
|
||||||
'check_resource', resource_id=resource_id,
|
self.make_msg(
|
||||||
current_traversal=current_traversal, data=data,
|
'check_resource', resource_id=resource_id,
|
||||||
is_update=is_update))
|
current_traversal=current_traversal, data=data,
|
||||||
|
is_update=is_update, adopt_stack_data=adopt_stack_data),
|
||||||
|
version='1.2')
|
||||||
|
|
|
@ -32,7 +32,7 @@ class WorkerServiceTest(common.HeatTestCase):
|
||||||
|
|
||||||
def test_make_sure_rpc_version(self):
|
def test_make_sure_rpc_version(self):
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
'1.1',
|
'1.2',
|
||||||
worker.WorkerService.RPC_API_VERSION,
|
worker.WorkerService.RPC_API_VERSION,
|
||||||
('RPC version is changed, please update this test to new version '
|
('RPC version is changed, please update this test to new version '
|
||||||
'and make sure additional test cases are added for RPC APIs '
|
'and make sure additional test cases are added for RPC APIs '
|
||||||
|
@ -128,14 +128,14 @@ class CheckWorkflowUpdateTest(common.HeatTestCase):
|
||||||
self, mock_cru, mock_crc, mock_pcr, mock_csc, mock_cid):
|
self, mock_cru, mock_crc, mock_pcr, mock_csc, mock_cid):
|
||||||
self.worker.check_resource(
|
self.worker.check_resource(
|
||||||
self.ctx, 'non-existant-id', self.stack.current_traversal, {},
|
self.ctx, 'non-existant-id', self.stack.current_traversal, {},
|
||||||
True)
|
True, None)
|
||||||
for mocked in [mock_cru, mock_crc, mock_pcr, mock_csc, mock_cid]:
|
for mocked in [mock_cru, mock_crc, mock_pcr, mock_csc, mock_cid]:
|
||||||
self.assertFalse(mocked.called)
|
self.assertFalse(mocked.called)
|
||||||
|
|
||||||
def test_stale_traversal(
|
def test_stale_traversal(
|
||||||
self, mock_cru, mock_crc, mock_pcr, mock_csc, mock_cid):
|
self, mock_cru, mock_crc, mock_pcr, mock_csc, mock_cid):
|
||||||
self.worker.check_resource(self.ctx, self.resource.id,
|
self.worker.check_resource(self.ctx, self.resource.id,
|
||||||
'stale-traversal', {}, True)
|
'stale-traversal', {}, True, None)
|
||||||
for mocked in [mock_cru, mock_crc, mock_pcr, mock_csc, mock_cid]:
|
for mocked in [mock_cru, mock_crc, mock_pcr, mock_csc, mock_cid]:
|
||||||
self.assertFalse(mocked.called)
|
self.assertFalse(mocked.called)
|
||||||
|
|
||||||
|
@ -143,7 +143,7 @@ class CheckWorkflowUpdateTest(common.HeatTestCase):
|
||||||
self, mock_cru, mock_crc, mock_pcr, mock_csc, mock_cid):
|
self, mock_cru, mock_crc, mock_pcr, mock_csc, mock_cid):
|
||||||
self.worker.check_resource(
|
self.worker.check_resource(
|
||||||
self.ctx, self.resource.id, self.stack.current_traversal, {},
|
self.ctx, self.resource.id, self.stack.current_traversal, {},
|
||||||
self.is_update)
|
self.is_update, None)
|
||||||
mock_cru.assert_called_once_with(self.resource,
|
mock_cru.assert_called_once_with(self.resource,
|
||||||
self.resource.stack.t.id,
|
self.resource.stack.t.id,
|
||||||
{}, self.worker.engine_id)
|
{}, self.worker.engine_id)
|
||||||
|
@ -168,7 +168,7 @@ class CheckWorkflowUpdateTest(common.HeatTestCase):
|
||||||
mock_cru.side_effect = resource.UpdateReplace
|
mock_cru.side_effect = resource.UpdateReplace
|
||||||
self.worker.check_resource(
|
self.worker.check_resource(
|
||||||
self.ctx, self.resource.id, self.stack.current_traversal, {},
|
self.ctx, self.resource.id, self.stack.current_traversal, {},
|
||||||
self.is_update)
|
self.is_update, None)
|
||||||
mock_cru.assert_called_once_with(self.resource,
|
mock_cru.assert_called_once_with(self.resource,
|
||||||
self.resource.stack.t.id,
|
self.resource.stack.t.id,
|
||||||
{}, self.worker.engine_id)
|
{}, self.worker.engine_id)
|
||||||
|
@ -185,7 +185,7 @@ class CheckWorkflowUpdateTest(common.HeatTestCase):
|
||||||
mock_tsl.return_value = True
|
mock_tsl.return_value = True
|
||||||
self.worker.check_resource(
|
self.worker.check_resource(
|
||||||
self.ctx, self.resource.id, self.stack.current_traversal, {},
|
self.ctx, self.resource.id, self.stack.current_traversal, {},
|
||||||
self.is_update)
|
self.is_update, None)
|
||||||
mock_cru.assert_called_once_with(self.resource,
|
mock_cru.assert_called_once_with(self.resource,
|
||||||
self.resource.stack.t.id,
|
self.resource.stack.t.id,
|
||||||
{}, self.worker.engine_id)
|
{}, self.worker.engine_id)
|
||||||
|
@ -237,7 +237,7 @@ class CheckWorkflowUpdateTest(common.HeatTestCase):
|
||||||
dummy_ex, self.resource, action=self.resource.UPDATE)
|
dummy_ex, self.resource, action=self.resource.UPDATE)
|
||||||
self.worker.check_resource(self.ctx, self.resource.id,
|
self.worker.check_resource(self.ctx, self.resource.id,
|
||||||
self.stack.current_traversal, {},
|
self.stack.current_traversal, {},
|
||||||
self.is_update)
|
self.is_update, None)
|
||||||
s = self.stack.load(self.ctx, stack_id=self.stack.id)
|
s = self.stack.load(self.ctx, stack_id=self.stack.id)
|
||||||
self.assertEqual((s.UPDATE, s.FAILED), (s.action, s.status))
|
self.assertEqual((s.UPDATE, s.FAILED), (s.action, s.status))
|
||||||
self.assertEqual('Resource UPDATE failed: '
|
self.assertEqual('Resource UPDATE failed: '
|
||||||
|
@ -257,7 +257,7 @@ class CheckWorkflowUpdateTest(common.HeatTestCase):
|
||||||
dummy_ex, self.resource, action=self.resource.UPDATE)
|
dummy_ex, self.resource, action=self.resource.UPDATE)
|
||||||
self.worker.check_resource(self.ctx, self.resource.id,
|
self.worker.check_resource(self.ctx, self.resource.id,
|
||||||
self.stack.current_traversal, {},
|
self.stack.current_traversal, {},
|
||||||
self.is_update)
|
self.is_update, None)
|
||||||
s = self.stack.load(self.ctx, stack_id=self.stack.id)
|
s = self.stack.load(self.ctx, stack_id=self.stack.id)
|
||||||
self.assertEqual((s.UPDATE, s.FAILED), (s.action, s.status))
|
self.assertEqual((s.UPDATE, s.FAILED), (s.action, s.status))
|
||||||
self.assertEqual('Resource UPDATE failed: '
|
self.assertEqual('Resource UPDATE failed: '
|
||||||
|
@ -275,7 +275,7 @@ class CheckWorkflowUpdateTest(common.HeatTestCase):
|
||||||
dummy_ex, self.resource, action=self.resource.UPDATE)
|
dummy_ex, self.resource, action=self.resource.UPDATE)
|
||||||
self.worker.check_resource(self.ctx, self.resource.id,
|
self.worker.check_resource(self.ctx, self.resource.id,
|
||||||
self.stack.current_traversal, {},
|
self.stack.current_traversal, {},
|
||||||
self.is_update)
|
self.is_update, None)
|
||||||
self.assertTrue(self.worker._trigger_rollback.called)
|
self.assertTrue(self.worker._trigger_rollback.called)
|
||||||
# make sure the rollback is called on given stack
|
# make sure the rollback is called on given stack
|
||||||
call_args, call_kwargs = self.worker._trigger_rollback.call_args
|
call_args, call_kwargs = self.worker._trigger_rollback.call_args
|
||||||
|
@ -294,7 +294,7 @@ class CheckWorkflowUpdateTest(common.HeatTestCase):
|
||||||
dummy_ex, self.resource, action=self.resource.UPDATE)
|
dummy_ex, self.resource, action=self.resource.UPDATE)
|
||||||
self.worker.check_resource(self.ctx, self.resource.id,
|
self.worker.check_resource(self.ctx, self.resource.id,
|
||||||
self.stack.current_traversal, {},
|
self.stack.current_traversal, {},
|
||||||
self.is_update)
|
self.is_update, None)
|
||||||
self.assertTrue(self.worker._trigger_rollback.called)
|
self.assertTrue(self.worker._trigger_rollback.called)
|
||||||
# make sure the rollback is called on given stack
|
# make sure the rollback is called on given stack
|
||||||
call_args, call_kwargs = self.worker._trigger_rollback.call_args
|
call_args, call_kwargs = self.worker._trigger_rollback.call_args
|
||||||
|
@ -312,7 +312,7 @@ class CheckWorkflowUpdateTest(common.HeatTestCase):
|
||||||
dummy_ex, self.resource, action=self.stack.CREATE)
|
dummy_ex, self.resource, action=self.stack.CREATE)
|
||||||
self.worker.check_resource(self.ctx, self.resource.id,
|
self.worker.check_resource(self.ctx, self.resource.id,
|
||||||
self.stack.current_traversal, {},
|
self.stack.current_traversal, {},
|
||||||
self.is_update)
|
self.is_update, None)
|
||||||
self.assertFalse(self.worker._trigger_rollback.called)
|
self.assertFalse(self.worker._trigger_rollback.called)
|
||||||
|
|
||||||
def test_rollback_not_re_triggered_for_a_rolling_back_stack(
|
def test_rollback_not_re_triggered_for_a_rolling_back_stack(
|
||||||
|
@ -328,7 +328,7 @@ class CheckWorkflowUpdateTest(common.HeatTestCase):
|
||||||
dummy_ex, self.resource, action=self.stack.CREATE)
|
dummy_ex, self.resource, action=self.stack.CREATE)
|
||||||
self.worker.check_resource(self.ctx, self.resource.id,
|
self.worker.check_resource(self.ctx, self.resource.id,
|
||||||
self.stack.current_traversal, {},
|
self.stack.current_traversal, {},
|
||||||
self.is_update)
|
self.is_update, None)
|
||||||
self.assertFalse(self.worker._trigger_rollback.called)
|
self.assertFalse(self.worker._trigger_rollback.called)
|
||||||
|
|
||||||
def test_resource_update_failure_purges_db_for_stack_failure(
|
def test_resource_update_failure_purges_db_for_stack_failure(
|
||||||
|
@ -342,7 +342,7 @@ class CheckWorkflowUpdateTest(common.HeatTestCase):
|
||||||
dummy_ex, self.resource, action=self.resource.UPDATE)
|
dummy_ex, self.resource, action=self.resource.UPDATE)
|
||||||
self.worker.check_resource(self.ctx, self.resource.id,
|
self.worker.check_resource(self.ctx, self.resource.id,
|
||||||
self.stack.current_traversal, {},
|
self.stack.current_traversal, {},
|
||||||
self.is_update)
|
self.is_update, None)
|
||||||
self.assertTrue(self.stack.purge_db.called)
|
self.assertTrue(self.stack.purge_db.called)
|
||||||
|
|
||||||
def test_resource_cleanup_failure_purges_db_for_stack_failure(
|
def test_resource_cleanup_failure_purges_db_for_stack_failure(
|
||||||
|
@ -357,7 +357,7 @@ class CheckWorkflowUpdateTest(common.HeatTestCase):
|
||||||
dummy_ex, self.resource, action=self.resource.UPDATE)
|
dummy_ex, self.resource, action=self.resource.UPDATE)
|
||||||
self.worker.check_resource(self.ctx, self.resource.id,
|
self.worker.check_resource(self.ctx, self.resource.id,
|
||||||
self.stack.current_traversal, {},
|
self.stack.current_traversal, {},
|
||||||
self.is_update)
|
self.is_update, None)
|
||||||
self.assertTrue(self.stack.purge_db.called)
|
self.assertTrue(self.stack.purge_db.called)
|
||||||
|
|
||||||
@mock.patch.object(worker.WorkerService, '_retrigger_check_resource')
|
@mock.patch.object(worker.WorkerService, '_retrigger_check_resource')
|
||||||
|
@ -432,7 +432,7 @@ class CheckWorkflowCleanupTest(common.HeatTestCase):
|
||||||
self, mock_cru, mock_crc, mock_pcr, mock_csc, mock_cid):
|
self, mock_cru, mock_crc, mock_pcr, mock_csc, mock_cid):
|
||||||
self.worker.check_resource(
|
self.worker.check_resource(
|
||||||
self.ctx, self.resource.id, self.stack.current_traversal, {},
|
self.ctx, self.resource.id, self.stack.current_traversal, {},
|
||||||
self.is_update)
|
self.is_update, None)
|
||||||
self.assertFalse(mock_cru.called)
|
self.assertFalse(mock_cru.called)
|
||||||
mock_crc.assert_called_once_with(
|
mock_crc.assert_called_once_with(
|
||||||
self.resource, self.resource.stack.t.id,
|
self.resource, self.resource.stack.t.id,
|
||||||
|
@ -443,7 +443,7 @@ class CheckWorkflowCleanupTest(common.HeatTestCase):
|
||||||
mock_crc.side_effect = resource.UpdateInProgress
|
mock_crc.side_effect = resource.UpdateInProgress
|
||||||
self.worker.check_resource(
|
self.worker.check_resource(
|
||||||
self.ctx, self.resource.id, self.stack.current_traversal, {},
|
self.ctx, self.resource.id, self.stack.current_traversal, {},
|
||||||
self.is_update)
|
self.is_update, None)
|
||||||
mock_crc.assert_called_once_with(self.resource,
|
mock_crc.assert_called_once_with(self.resource,
|
||||||
self.resource.stack.t.id,
|
self.resource.stack.t.id,
|
||||||
{}, self.worker.engine_id)
|
{}, self.worker.engine_id)
|
||||||
|
@ -504,7 +504,7 @@ class MiscMethodsTest(common.HeatTestCase):
|
||||||
worker.propagate_check_resource(
|
worker.propagate_check_resource(
|
||||||
self.ctx, mock.ANY, mock.ANY,
|
self.ctx, mock.ANY, mock.ANY,
|
||||||
self.stack.current_traversal, mock.ANY,
|
self.stack.current_traversal, mock.ANY,
|
||||||
mock.ANY, {}, True)
|
mock.ANY, {}, True, None)
|
||||||
self.assertTrue(mock_sync.called)
|
self.assertTrue(mock_sync.called)
|
||||||
|
|
||||||
@mock.patch.object(resource.Resource, 'create_convergence')
|
@mock.patch.object(resource.Resource, 'create_convergence')
|
||||||
|
|
|
@ -222,8 +222,8 @@ class StackConvergenceCreateUpdateDeleteTest(common.HeatTestCase):
|
||||||
expected_calls.append(
|
expected_calls.append(
|
||||||
mock.call.worker_client.WorkerClient.check_resource(
|
mock.call.worker_client.WorkerClient.check_resource(
|
||||||
stack.context, rsrc_id, stack.current_traversal,
|
stack.context, rsrc_id, stack.current_traversal,
|
||||||
{'input_data': {}, 'adopt_stack_data': None},
|
{'input_data': []},
|
||||||
is_update))
|
is_update, None))
|
||||||
self.assertEqual(expected_calls, mock_cr.mock_calls)
|
self.assertEqual(expected_calls, mock_cr.mock_calls)
|
||||||
|
|
||||||
def test_conv_string_five_instance_stack_create(self, mock_cr):
|
def test_conv_string_five_instance_stack_create(self, mock_cr):
|
||||||
|
@ -279,8 +279,8 @@ class StackConvergenceCreateUpdateDeleteTest(common.HeatTestCase):
|
||||||
expected_calls.append(
|
expected_calls.append(
|
||||||
mock.call.worker_client.WorkerClient.check_resource(
|
mock.call.worker_client.WorkerClient.check_resource(
|
||||||
stack.context, rsrc_id, stack.current_traversal,
|
stack.context, rsrc_id, stack.current_traversal,
|
||||||
{'input_data': {}, 'adopt_stack_data': None},
|
{'input_data': []},
|
||||||
is_update))
|
is_update, None))
|
||||||
self.assertEqual(expected_calls, mock_cr.mock_calls)
|
self.assertEqual(expected_calls, mock_cr.mock_calls)
|
||||||
|
|
||||||
def _mock_conv_update_requires(self, stack, conv_deps):
|
def _mock_conv_update_requires(self, stack, conv_deps):
|
||||||
|
@ -415,16 +415,16 @@ class StackConvergenceCreateUpdateDeleteTest(common.HeatTestCase):
|
||||||
expected_calls.append(
|
expected_calls.append(
|
||||||
mock.call.worker_client.WorkerClient.check_resource(
|
mock.call.worker_client.WorkerClient.check_resource(
|
||||||
stack.context, rsrc_id, stack.current_traversal,
|
stack.context, rsrc_id, stack.current_traversal,
|
||||||
{'input_data': {}, 'adopt_stack_data': None},
|
{'input_data': []},
|
||||||
is_update))
|
is_update, None))
|
||||||
|
|
||||||
leaves = curr_stack.convergence_dependencies.leaves()
|
leaves = curr_stack.convergence_dependencies.leaves()
|
||||||
for rsrc_id, is_update in leaves:
|
for rsrc_id, is_update in leaves:
|
||||||
expected_calls.append(
|
expected_calls.append(
|
||||||
mock.call.worker_client.WorkerClient.check_resource(
|
mock.call.worker_client.WorkerClient.check_resource(
|
||||||
curr_stack.context, rsrc_id, curr_stack.current_traversal,
|
curr_stack.context, rsrc_id, curr_stack.current_traversal,
|
||||||
{'input_data': {}, 'adopt_stack_data': None},
|
{'input_data': []},
|
||||||
is_update))
|
is_update, None))
|
||||||
self.assertEqual(expected_calls, mock_cr.mock_calls)
|
self.assertEqual(expected_calls, mock_cr.mock_calls)
|
||||||
|
|
||||||
def test_conv_empty_template_stack_update_delete(self, mock_cr):
|
def test_conv_empty_template_stack_update_delete(self, mock_cr):
|
||||||
|
@ -496,16 +496,16 @@ class StackConvergenceCreateUpdateDeleteTest(common.HeatTestCase):
|
||||||
expected_calls.append(
|
expected_calls.append(
|
||||||
mock.call.worker_client.WorkerClient.check_resource(
|
mock.call.worker_client.WorkerClient.check_resource(
|
||||||
stack.context, rsrc_id, stack.current_traversal,
|
stack.context, rsrc_id, stack.current_traversal,
|
||||||
{'input_data': {}, 'adopt_stack_data': None},
|
{'input_data': []},
|
||||||
is_update))
|
is_update, None))
|
||||||
|
|
||||||
leaves = curr_stack.convergence_dependencies.leaves()
|
leaves = curr_stack.convergence_dependencies.leaves()
|
||||||
for rsrc_id, is_update in leaves:
|
for rsrc_id, is_update in leaves:
|
||||||
expected_calls.append(
|
expected_calls.append(
|
||||||
mock.call.worker_client.WorkerClient.check_resource(
|
mock.call.worker_client.WorkerClient.check_resource(
|
||||||
curr_stack.context, rsrc_id, curr_stack.current_traversal,
|
curr_stack.context, rsrc_id, curr_stack.current_traversal,
|
||||||
{'input_data': {}, 'adopt_stack_data': None},
|
{'input_data': []},
|
||||||
is_update))
|
is_update, None))
|
||||||
self.assertEqual(expected_calls, mock_cr.mock_calls)
|
self.assertEqual(expected_calls, mock_cr.mock_calls)
|
||||||
|
|
||||||
def test_mark_complete_purges_db(self, mock_cr):
|
def test_mark_complete_purges_db(self, mock_cr):
|
||||||
|
|
Loading…
Reference in New Issue