Merge "Calculate the requires list in check_resource"

This commit is contained in:
Zuul 2018-05-14 13:10:57 +00:00 committed by Gerrit Code Review
commit 99eb84d3a3
4 changed files with 46 additions and 66 deletions

View File

@ -162,8 +162,10 @@ class CheckResource(object):
prev_template_id = rsrc.current_template_id prev_template_id = rsrc.current_template_id
try: try:
if is_update: if is_update:
requires = set(d.primary_key for d in resource_data.values()
if d is not None)
try: try:
check_resource_update(rsrc, tmpl.id, resource_data, check_resource_update(rsrc, tmpl.id, requires,
self.engine_id, self.engine_id,
stack, self.msg_queue) stack, self.msg_queue)
except resource.UpdateReplace: except resource.UpdateReplace:
@ -406,15 +408,15 @@ def _check_for_message(msg_queue):
LOG.error('Unknown message "%s" received', message) LOG.error('Unknown message "%s" received', message)
def check_resource_update(rsrc, template_id, resource_data, engine_id, def check_resource_update(rsrc, template_id, requires, engine_id,
stack, msg_queue): stack, msg_queue):
"""Create or update the Resource if appropriate.""" """Create or update the Resource if appropriate."""
check_message = functools.partial(_check_for_message, msg_queue) check_message = functools.partial(_check_for_message, msg_queue)
if rsrc.action == resource.Resource.INIT: if rsrc.action == resource.Resource.INIT:
rsrc.create_convergence(template_id, resource_data, engine_id, rsrc.create_convergence(template_id, requires, engine_id,
stack.time_remaining(), check_message) stack.time_remaining(), check_message)
else: else:
rsrc.update_convergence(template_id, resource_data, engine_id, rsrc.update_convergence(template_id, requires, engine_id,
stack.time_remaining(), stack, stack.time_remaining(), stack,
check_message) check_message)

View File

@ -1154,14 +1154,11 @@ class Resource(status.ResourceStatus):
""" """
return self return self
def create_convergence(self, template_id, resource_data, engine_id, def create_convergence(self, template_id, requires, engine_id,
timeout, progress_callback=None): timeout, progress_callback=None):
"""Creates the resource by invoking the scheduler TaskRunner.""" """Creates the resource by invoking the scheduler TaskRunner."""
self._calling_engine_id = engine_id self._calling_engine_id = engine_id
self.requires = list( self.requires = list(requires)
set(data.primary_key for data in resource_data.values()
if data is not None)
)
self.current_template_id = template_id self.current_template_id = template_id
if self.stack.adopt_stack_data is None: if self.stack.adopt_stack_data is None:
runner = scheduler.TaskRunner(self.create) runner = scheduler.TaskRunner(self.create)
@ -1412,7 +1409,7 @@ class Resource(status.ResourceStatus):
else: else:
raise UpdateReplace(self.name) raise UpdateReplace(self.name)
def update_convergence(self, template_id, resource_data, engine_id, def update_convergence(self, template_id, new_requires, engine_id,
timeout, new_stack, progress_callback=None): timeout, new_stack, progress_callback=None):
"""Update the resource synchronously. """Update the resource synchronously.
@ -1422,8 +1419,6 @@ class Resource(status.ResourceStatus):
resource by invoking the scheduler TaskRunner. resource by invoking the scheduler TaskRunner.
""" """
self._calling_engine_id = engine_id self._calling_engine_id = engine_id
new_requires = set(data.primary_key for data in resource_data.values()
if data is not None)
# Check that the resource type matches. If the type has changed by a # Check that the resource type matches. If the type has changed by a
# legitimate substitution, the load()ed resource will already be of # legitimate substitution, the load()ed resource will already be of

View File

@ -91,7 +91,7 @@ class CheckWorkflowUpdateTest(common.HeatTestCase):
self.is_update, None) 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, set(), self.worker.engine_id,
mock.ANY, mock.ANY) mock.ANY, mock.ANY)
self.assertFalse(mock_crc.called) self.assertFalse(mock_crc.called)
@ -122,7 +122,7 @@ class CheckWorkflowUpdateTest(common.HeatTestCase):
self.is_update, None) 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, set(), self.worker.engine_id,
mock.ANY, mock.ANY) mock.ANY, mock.ANY)
self.assertTrue(mock_mr.called) self.assertTrue(mock_mr.called)
self.assertFalse(mock_crc.called) self.assertFalse(mock_crc.called)
@ -144,7 +144,7 @@ class CheckWorkflowUpdateTest(common.HeatTestCase):
self.is_update, None) 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, set(), self.worker.engine_id,
mock.ANY, mock.ANY) mock.ANY, mock.ANY)
self.assertFalse(mock_crc.called) self.assertFalse(mock_crc.called)
self.assertFalse(mock_pcr.called) self.assertFalse(mock_pcr.called)
@ -545,6 +545,20 @@ class CheckWorkflowUpdateTest(common.HeatTestCase):
self.assertFalse(mock_pcr.called) self.assertFalse(mock_pcr.called)
self.assertFalse(mock_csc.called) self.assertFalse(mock_csc.called)
@mock.patch.object(resource.Resource, 'load')
def test_requires(self, mock_load, mock_cru, mock_crc, mock_pcr, mock_csc):
mock_load.return_value = self.resource, self.stack, self.stack
res_data = {(1, True): {u'id': 5, u'name': 'A', 'attrs': {}},
(2, True): {u'id': 3, u'name': 'B', 'attrs': {}}}
self.worker.check_resource(self.ctx, self.resource.id,
self.stack.current_traversal,
sync_point.serialize_input_data(res_data),
self.is_update, {})
mock_cru.assert_called_once_with(
self.resource, self.resource.stack.t.id,
{5, 3}, self.worker.engine_id,
self.stack, mock.ANY)
@mock.patch.object(check_resource, 'check_stack_complete') @mock.patch.object(check_resource, 'check_stack_complete')
@mock.patch.object(check_resource, 'propagate_check_resource') @mock.patch.object(check_resource, 'propagate_check_resource')
@ -699,7 +713,7 @@ class MiscMethodsTest(common.HeatTestCase):
def test_check_resource_update_init_action(self, mock_update, mock_create): def test_check_resource_update_init_action(self, mock_update, mock_create):
self.resource.action = 'INIT' self.resource.action = 'INIT'
check_resource.check_resource_update( check_resource.check_resource_update(
self.resource, self.resource.stack.t.id, {}, 'engine-id', self.resource, self.resource.stack.t.id, set(), 'engine-id',
self.stack, None) self.stack, None)
self.assertTrue(mock_create.called) self.assertTrue(mock_create.called)
self.assertFalse(mock_update.called) self.assertFalse(mock_update.called)
@ -710,7 +724,7 @@ class MiscMethodsTest(common.HeatTestCase):
self, mock_update, mock_create): self, mock_update, mock_create):
self.resource.action = 'CREATE' self.resource.action = 'CREATE'
check_resource.check_resource_update( check_resource.check_resource_update(
self.resource, self.resource.stack.t.id, {}, 'engine-id', self.resource, self.resource.stack.t.id, set(), 'engine-id',
self.stack, None) self.stack, None)
self.assertFalse(mock_create.called) self.assertFalse(mock_create.called)
self.assertTrue(mock_update.called) self.assertTrue(mock_update.called)
@ -721,7 +735,7 @@ class MiscMethodsTest(common.HeatTestCase):
self, mock_update, mock_create): self, mock_update, mock_create):
self.resource.action = 'UPDATE' self.resource.action = 'UPDATE'
check_resource.check_resource_update( check_resource.check_resource_update(
self.resource, self.resource.stack.t.id, {}, 'engine-id', self.resource, self.resource.stack.t.id, set(), 'engine-id',
self.stack, None) self.stack, None)
self.assertFalse(mock_create.called) self.assertFalse(mock_create.called)
self.assertTrue(mock_update.called) self.assertTrue(mock_update.called)

View File

@ -2046,13 +2046,10 @@ class ResourceTest(common.HeatTestCase):
res.action = res.CREATE res.action = res.CREATE
res.store() res.store()
self._assert_resource_lock(res.id, None, None) self._assert_resource_lock(res.id, None, None)
res_data = {(1, True): {u'id': 1, u'name': 'A', 'attrs': {}},
(2, True): {u'id': 3, u'name': 'B', 'attrs': {}}}
res_data = node_data.load_resources_data(res_data)
pcb = mock.Mock() pcb = mock.Mock()
with mock.patch.object(resource.Resource, 'create') as mock_create: with mock.patch.object(resource.Resource, 'create') as mock_create:
res.create_convergence(self.stack.t.id, res_data, 'engine-007', res.create_convergence(self.stack.t.id, {1, 3}, 'engine-007',
-1, pcb) -1, pcb)
self.assertTrue(mock_create.called) self.assertTrue(mock_create.called)
@ -2064,13 +2061,10 @@ class ResourceTest(common.HeatTestCase):
res = generic_rsrc.GenericResource('test_res', tmpl, self.stack) res = generic_rsrc.GenericResource('test_res', tmpl, self.stack)
res.action = res.CREATE res.action = res.CREATE
res.store() res.store()
res_data = {(1, True): {u'id': 1, u'name': 'A', 'attrs': {}},
(2, True): {u'id': 3, u'name': 'B', 'attrs': {}}}
res_data = node_data.load_resources_data(res_data)
pcb = mock.Mock() pcb = mock.Mock()
self.assertRaises(scheduler.Timeout, res.create_convergence, self.assertRaises(scheduler.Timeout, res.create_convergence,
self.stack.t.id, res_data, 'engine-007', -1, pcb) self.stack.t.id, {1, 3}, 'engine-007', -1, pcb)
def test_create_convergence_sets_requires_for_failure(self): def test_create_convergence_sets_requires_for_failure(self):
"""Ensure that requires are computed correctly. """Ensure that requires are computed correctly.
@ -2084,11 +2078,8 @@ class ResourceTest(common.HeatTestCase):
dummy_ex = exception.ResourceNotAvailable(resource_name=res.name) dummy_ex = exception.ResourceNotAvailable(resource_name=res.name)
res.create = mock.Mock(side_effect=dummy_ex) res.create = mock.Mock(side_effect=dummy_ex)
self._assert_resource_lock(res.id, None, None) self._assert_resource_lock(res.id, None, None)
res_data = {(1, True): {u'id': 5, u'name': 'A', 'attrs': {}},
(2, True): {u'id': 3, u'name': 'B', 'attrs': {}}}
res_data = node_data.load_resources_data(res_data)
self.assertRaises(exception.ResourceNotAvailable, self.assertRaises(exception.ResourceNotAvailable,
res.create_convergence, self.stack.t.id, res_data, res.create_convergence, self.stack.t.id, {5, 3},
'engine-007', self.dummy_timeout, self.dummy_event) 'engine-007', self.dummy_timeout, self.dummy_event)
self.assertItemsEqual([5, 3], res.requires) self.assertItemsEqual([5, 3], res.requires)
# The locking happens in create which we mocked out # The locking happens in create which we mocked out
@ -2103,11 +2094,8 @@ class ResourceTest(common.HeatTestCase):
self.stack.adopt_stack_data = {'resources': {'test_res': { self.stack.adopt_stack_data = {'resources': {'test_res': {
'resource_id': 'fluffy'}}} 'resource_id': 'fluffy'}}}
self._assert_resource_lock(res.id, None, None) self._assert_resource_lock(res.id, None, None)
res_data = {(1, True): {u'id': 5, u'name': 'A', 'attrs': {}},
(2, True): {u'id': 3, u'name': 'B', 'attrs': {}}}
res_data = node_data.load_resources_data(res_data)
tr = scheduler.TaskRunner(res.create_convergence, self.stack.t.id, tr = scheduler.TaskRunner(res.create_convergence, self.stack.t.id,
res_data, 'engine-007', self.dummy_timeout, {5, 3}, 'engine-007', self.dummy_timeout,
self.dummy_event) self.dummy_event)
tr() tr()
mock_adopt.assert_called_once_with( mock_adopt.assert_called_once_with(
@ -2122,11 +2110,8 @@ class ResourceTest(common.HeatTestCase):
res.store() res.store()
self.stack.adopt_stack_data = {'resources': {}} self.stack.adopt_stack_data = {'resources': {}}
self._assert_resource_lock(res.id, None, None) self._assert_resource_lock(res.id, None, None)
res_data = {(1, True): {u'id': 5, u'name': 'A', 'attrs': {}},
(2, True): {u'id': 3, u'name': 'B', 'attrs': {}}}
res_data = node_data.load_resources_data(res_data)
tr = scheduler.TaskRunner(res.create_convergence, self.stack.t.id, tr = scheduler.TaskRunner(res.create_convergence, self.stack.t.id,
res_data, 'engine-007', self.dummy_timeout, {5, 3}, 'engine-007', self.dummy_timeout,
self.dummy_event) self.dummy_event)
exc = self.assertRaises(exception.ResourceFailure, tr) exc = self.assertRaises(exception.ResourceFailure, tr)
self.assertIn('Resource ID was not provided', six.text_type(exc)) self.assertIn('Resource ID was not provided', six.text_type(exc))
@ -2160,11 +2145,8 @@ class ResourceTest(common.HeatTestCase):
new_temp, stack_id=self.stack.id) new_temp, stack_id=self.stack.id)
res.stack.convergence = True res.stack.convergence = True
res_data = {(1, True): {u'id': 4, u'name': 'A', 'attrs': {}},
(2, True): {u'id': 3, u'name': 'B', 'attrs': {}}}
res_data = node_data.load_resources_data(res_data)
tr = scheduler.TaskRunner(res.update_convergence, new_temp.id, tr = scheduler.TaskRunner(res.update_convergence, new_temp.id,
res_data, 'engine-007', 120, new_stack) {4, 3}, 'engine-007', 120, new_stack)
tr() tr()
self.assertItemsEqual([3, 4], res.requires) self.assertItemsEqual([3, 4], res.requires)
@ -2195,9 +2177,8 @@ class ResourceTest(common.HeatTestCase):
new_stack = parser.Stack(utils.dummy_context(), 'test_stack', new_stack = parser.Stack(utils.dummy_context(), 'test_stack',
new_temp, stack_id=self.stack.id) new_temp, stack_id=self.stack.id)
res_data = {}
tr = scheduler.TaskRunner(res.update_convergence, new_temp.id, tr = scheduler.TaskRunner(res.update_convergence, new_temp.id,
res_data, 'engine-007', -1, new_stack, set(), 'engine-007', -1, new_stack,
self.dummy_event) self.dummy_event)
self.assertRaises(scheduler.Timeout, tr) self.assertRaises(scheduler.Timeout, tr)
@ -2217,9 +2198,8 @@ class ResourceTest(common.HeatTestCase):
new_stack = parser.Stack(utils.dummy_context(), 'test_stack', new_stack = parser.Stack(utils.dummy_context(), 'test_stack',
new_temp, stack_id=self.stack.id) new_temp, stack_id=self.stack.id)
res_data = {}
self.assertRaises(resource.UpdateReplace, res.update_convergence, self.assertRaises(resource.UpdateReplace, res.update_convergence,
new_temp.id, res_data, 'engine-007', new_temp.id, set(), 'engine-007',
-1, new_stack) -1, new_stack)
def test_update_convergence_checks_resource_class(self): def test_update_convergence_checks_resource_class(self):
@ -2239,9 +2219,8 @@ class ResourceTest(common.HeatTestCase):
new_stack = parser.Stack(ctx, 'test_stack', new_stack = parser.Stack(ctx, 'test_stack',
new_temp, stack_id=self.stack.id) new_temp, stack_id=self.stack.id)
res_data = {}
tr = scheduler.TaskRunner(res.update_convergence, new_temp.id, tr = scheduler.TaskRunner(res.update_convergence, new_temp.id,
res_data, 'engine-007', -1, new_stack, set(), 'engine-007', -1, new_stack,
self.dummy_event) self.dummy_event)
self.assertRaises(resource.UpdateReplace, tr) self.assertRaises(resource.UpdateReplace, tr)
@ -2258,9 +2237,6 @@ class ResourceTest(common.HeatTestCase):
res.stack.convergence = True res.stack.convergence = True
res_data = {(1, True): {u'id': 4, u'name': 'A', 'attrs': {}},
(2, True): {u'id': 3, u'name': 'B', 'attrs': {}}}
res_data = node_data.load_resources_data(res_data)
tmpl = template.Template({ tmpl = template.Template({
'HeatTemplateFormatVersion': '2012-12-12', 'HeatTemplateFormatVersion': '2012-12-12',
'Resources': { 'Resources': {
@ -2269,7 +2245,7 @@ class ResourceTest(common.HeatTestCase):
new_stack = parser.Stack(utils.dummy_context(), 'test_stack', new_stack = parser.Stack(utils.dummy_context(), 'test_stack',
tmpl, stack_id=self.stack.id) tmpl, stack_id=self.stack.id)
tr = scheduler.TaskRunner(res.update_convergence, 'template_key', tr = scheduler.TaskRunner(res.update_convergence, 'template_key',
res_data, 'engine-007', self.dummy_timeout, {4, 3}, 'engine-007', self.dummy_timeout,
new_stack) new_stack)
ex = self.assertRaises(exception.UpdateInProgress, tr) ex = self.assertRaises(exception.UpdateInProgress, tr)
msg = ("The resource %s is already being updated." % msg = ("The resource %s is already being updated." %
@ -2306,9 +2282,6 @@ class ResourceTest(common.HeatTestCase):
}}, env=self.env) }}, env=self.env)
new_temp.store(stack.context) new_temp.store(stack.context)
res_data = {(1, True): {u'id': 4, u'name': 'A', 'attrs': {}},
(2, True): {u'id': 3, u'name': 'B', 'attrs': {}}}
res_data = node_data.load_resources_data(res_data)
new_stack = parser.Stack(utils.dummy_context(), 'test_stack', new_stack = parser.Stack(utils.dummy_context(), 'test_stack',
new_temp, stack_id=self.stack.id) new_temp, stack_id=self.stack.id)
@ -2316,7 +2289,7 @@ class ResourceTest(common.HeatTestCase):
res._calling_engine_id = 'engine-9' res._calling_engine_id = 'engine-9'
tr = scheduler.TaskRunner(res.update_convergence, new_temp.id, tr = scheduler.TaskRunner(res.update_convergence, new_temp.id,
res_data, 'engine-007', 120, new_stack, {4, 3}, 'engine-007', 120, new_stack,
self.dummy_event) self.dummy_event)
self.assertRaises(exception.ResourceFailure, tr) self.assertRaises(exception.ResourceFailure, tr)
@ -2352,13 +2325,10 @@ class ResourceTest(common.HeatTestCase):
res.stack.convergence = True res.stack.convergence = True
res_data = {(1, True): {u'id': 4, u'name': 'A', 'attrs': {}},
(2, True): {u'id': 3, u'name': 'B', 'attrs': {}}}
res_data = node_data.load_resources_data(res_data)
new_stack = parser.Stack(utils.dummy_context(), 'test_stack', new_stack = parser.Stack(utils.dummy_context(), 'test_stack',
new_temp, stack_id=self.stack.id) new_temp, stack_id=self.stack.id)
tr = scheduler.TaskRunner(res.update_convergence, new_temp.id, tr = scheduler.TaskRunner(res.update_convergence, new_temp.id,
res_data, 'engine-007', 120, new_stack, {4, 3}, 'engine-007', 120, new_stack,
self.dummy_event) self.dummy_event)
self.assertRaises(resource.UpdateReplace, tr) self.assertRaises(resource.UpdateReplace, tr)
@ -2386,7 +2356,7 @@ class ResourceTest(common.HeatTestCase):
self.stack.state_set(self.stack.ROLLBACK, self.stack.IN_PROGRESS, self.stack.state_set(self.stack.ROLLBACK, self.stack.IN_PROGRESS,
'Simulate rollback') 'Simulate rollback')
res.restore_prev_rsrc = mock.Mock() res.restore_prev_rsrc = mock.Mock()
tr = scheduler.TaskRunner(res.update_convergence, 'new_tmpl_id', {}, tr = scheduler.TaskRunner(res.update_convergence, 'new_tmpl_id', set(),
'engine-007', self.dummy_timeout, 'engine-007', self.dummy_timeout,
new_stack, self.dummy_event) new_stack, self.dummy_event)
self.assertRaises(resource.UpdateReplace, tr) self.assertRaises(resource.UpdateReplace, tr)
@ -2410,7 +2380,7 @@ class ResourceTest(common.HeatTestCase):
self.stack.state_set(self.stack.ROLLBACK, self.stack.IN_PROGRESS, self.stack.state_set(self.stack.ROLLBACK, self.stack.IN_PROGRESS,
'Simulate rollback') 'Simulate rollback')
res.restore_prev_rsrc = mock.Mock(side_effect=Exception) res.restore_prev_rsrc = mock.Mock(side_effect=Exception)
tr = scheduler.TaskRunner(res.update_convergence, 'new_tmpl_id', {}, tr = scheduler.TaskRunner(res.update_convergence, 'new_tmpl_id', set(),
'engine-007', self.dummy_timeout, new_stack, 'engine-007', self.dummy_timeout, new_stack,
self.dummy_event) self.dummy_event)
self.assertRaises(exception.ResourceFailure, tr) self.assertRaises(exception.ResourceFailure, tr)
@ -4273,11 +4243,10 @@ class ResourceUpdateRestrictionTest(common.HeatTestCase):
self.stack = parser.Stack(utils.dummy_context(), 'test_stack', self.stack = parser.Stack(utils.dummy_context(), 'test_stack',
template.Template(self.tmpl, env=self.env), template.Template(self.tmpl, env=self.env),
stack_id=str(uuid.uuid4())) stack_id=str(uuid.uuid4()))
res_data = {}
res = self.stack['bar'] res = self.stack['bar']
pcb = mock.Mock() pcb = mock.Mock()
self.patchobject(res, 'lock') self.patchobject(res, 'lock')
res.create_convergence(self.stack.t.id, res_data, 'engine-007', res.create_convergence(self.stack.t.id, set(), 'engine-007',
self.dummy_timeout, pcb) self.dummy_timeout, pcb)
return res return res
@ -4399,7 +4368,7 @@ class ResourceUpdateRestrictionTest(common.HeatTestCase):
error = self.assertRaises(exception.ResourceFailure, error = self.assertRaises(exception.ResourceFailure,
scheduler.TaskRunner(res.update_convergence, scheduler.TaskRunner(res.update_convergence,
self.stack.t.id, self.stack.t.id,
{}, set(),
'engine-007', 'engine-007',
self.dummy_timeout, self.dummy_timeout,
self.new_stack, self.new_stack,
@ -4431,7 +4400,7 @@ class ResourceUpdateRestrictionTest(common.HeatTestCase):
error = self.assertRaises(resource.UpdateReplace, error = self.assertRaises(resource.UpdateReplace,
scheduler.TaskRunner(res.update_convergence, scheduler.TaskRunner(res.update_convergence,
self.stack.t.id, self.stack.t.id,
{}, set(),
'engine-007', 'engine-007',
self.dummy_timeout, self.dummy_timeout,
self.new_stack, self.new_stack,