Merge "Rollback stack with correct tags"

This commit is contained in:
Jenkins 2017-08-21 10:20:37 +00:00 committed by Gerrit Code Review
commit c423e5d202
3 changed files with 31 additions and 16 deletions

View File

@ -592,7 +592,8 @@ class Stack(collections.Mapping):
nested_depth=stack.nested_depth, nested_depth=stack.nested_depth,
deleted_time=stack.deleted_at) deleted_time=stack.deleted_at)
def get_kwargs_for_cloning(self, keep_status=False, only_db=False): def get_kwargs_for_cloning(self, keep_status=False, only_db=False,
keep_tags=False):
"""Get common kwargs for calling Stack() for cloning. """Get common kwargs for calling Stack() for cloning.
The point of this method is to reduce the number of places that we The point of this method is to reduce the number of places that we
@ -633,6 +634,8 @@ class Stack(collections.Mapping):
stack['tenant_id'] = self.tenant_id stack['tenant_id'] = self.tenant_id
stack['timeout_mins'] = self.timeout_mins stack['timeout_mins'] = self.timeout_mins
stack['strict_validate'] = self.strict_validate stack['strict_validate'] = self.strict_validate
if keep_tags:
stack['tags'] = self.tags
return stack return stack
@ -1196,7 +1199,7 @@ class Stack(collections.Mapping):
LOG.debug('Loaded existing backup stack') LOG.debug('Loaded existing backup stack')
return self.load(self.context, stack=s) return self.load(self.context, stack=s)
elif create_if_missing: elif create_if_missing:
kwargs = self.get_kwargs_for_cloning() kwargs = self.get_kwargs_for_cloning(keep_tags=True)
kwargs['owner_id'] = self.id kwargs['owner_id'] = self.id
del(kwargs['prev_raw_template_id']) del(kwargs['prev_raw_template_id'])
prev = type(self)(self.context, self._backup_name(), prev = type(self)(self.context, self._backup_name(),
@ -1512,7 +1515,7 @@ class Stack(collections.Mapping):
if action == self.UPDATE: if action == self.UPDATE:
# Oldstack is useless when the action is not UPDATE , so we don't # Oldstack is useless when the action is not UPDATE , so we don't
# need to build it, this can avoid some unexpected errors. # need to build it, this can avoid some unexpected errors.
kwargs = self.get_kwargs_for_cloning() kwargs = self.get_kwargs_for_cloning(keep_tags=True)
self._ensure_encrypted_param_names_valid() self._ensure_encrypted_param_names_valid()
oldstack = Stack(self.context, self.name, copy.deepcopy(self.t), oldstack = Stack(self.context, self.name, copy.deepcopy(self.t),
**kwargs) **kwargs)

View File

@ -2924,15 +2924,18 @@ class StackTest(common.HeatTestCase):
class StackKwargsForCloningTest(common.HeatTestCase): class StackKwargsForCloningTest(common.HeatTestCase):
scenarios = [ scenarios = [
('default', dict(keep_status=False, only_db=False, ('default', dict(keep_status=False, only_db=False, keep_tags=False,
not_included=['action', 'status', 'status_reason'])),
('only_db', dict(keep_status=False, only_db=True,
not_included=['action', 'status', 'status_reason', not_included=['action', 'status', 'status_reason',
'strict_validate'])), 'tags'])),
('keep_status', dict(keep_status=True, only_db=False, ('only_db', dict(keep_status=False, only_db=True, keep_tags=False,
not_included=[])), not_included=['action', 'status', 'status_reason',
('status_db', dict(keep_status=True, only_db=True, 'strict_validate', 'tags'])),
not_included=['strict_validate'])), ('keep_status', dict(keep_status=True, only_db=False, keep_tags=False,
not_included=['tags'])),
('status_db', dict(keep_status=True, only_db=True, keep_tags=False,
not_included=['strict_validate', 'tags'])),
('keep_tags', dict(keep_status=False, only_db=False, keep_tags=True,
not_included=['action', 'status', 'status_reason']))
] ]
def test_kwargs(self): def test_kwargs(self):
@ -2945,7 +2948,8 @@ class StackKwargsForCloningTest(common.HeatTestCase):
user_creds_id=123, tenant_id='some-uuid', user_creds_id=123, tenant_id='some-uuid',
username='jo', nested_depth=3, username='jo', nested_depth=3,
strict_validate=True, convergence=False, strict_validate=True, convergence=False,
current_traversal=45) current_traversal=45,
tags=['tag1', 'tag2'])
db_map = {'parent_resource': 'parent_resource_name', db_map = {'parent_resource': 'parent_resource_name',
'tenant_id': 'tenant', 'timeout_mins': 'timeout'} 'tenant_id': 'tenant', 'timeout_mins': 'timeout'}
test_db_data = {} test_db_data = {}
@ -2956,7 +2960,8 @@ class StackKwargsForCloningTest(common.HeatTestCase):
self.stack = stack.Stack(ctx, utils.random_name(), tmpl, self.stack = stack.Stack(ctx, utils.random_name(), tmpl,
**test_data) **test_data)
res = self.stack.get_kwargs_for_cloning(keep_status=self.keep_status, res = self.stack.get_kwargs_for_cloning(keep_status=self.keep_status,
only_db=self.only_db) only_db=self.only_db,
keep_tags=self.keep_tags)
for key in self.not_included: for key in self.not_included:
self.assertNotIn(key, res) self.assertNotIn(key, res)

View File

@ -856,21 +856,24 @@ class StackUpdateTest(common.HeatTestCase):
cancel_message=rpc_api.THREAD_CANCEL): cancel_message=rpc_api.THREAD_CANCEL):
tmpl = {'HeatTemplateFormatVersion': '2012-12-12', tmpl = {'HeatTemplateFormatVersion': '2012-12-12',
'Resources': {'AResource': {'Type': 'GenericResourceType'}}} 'Resources': {'AResource': {'Type': 'GenericResourceType'}}}
old_tags = ['tag1', 'tag2']
self.stack = stack.Stack(self.ctx, 'update_test_stack', self.stack = stack.Stack(self.ctx, 'update_test_stack',
template.Template(tmpl)) template.Template(tmpl), tags=old_tags)
self.stack.store() self.stack.store()
self.stack.create() self.stack.create()
self.assertEqual((stack.Stack.CREATE, stack.Stack.COMPLETE), self.assertEqual((stack.Stack.CREATE, stack.Stack.COMPLETE),
self.stack.state) self.stack.state)
self.assertEqual(old_tags, self.stack.tags)
tmpl2 = {'HeatTemplateFormatVersion': '2012-12-12', tmpl2 = {'HeatTemplateFormatVersion': '2012-12-12',
'Resources': { 'Resources': {
'AResource': {'Type': 'GenericResourceType'}, 'AResource': {'Type': 'GenericResourceType'},
'BResource': {'Type': 'MultiStepResourceType'}}} 'BResource': {'Type': 'MultiStepResourceType'}}}
new_tags = ['tag3', 'tag4']
updated_stack = stack.Stack(self.ctx, 'updated_stack', updated_stack = stack.Stack(self.ctx, 'updated_stack',
template.Template(tmpl2), template.Template(tmpl2),
disable_rollback=disable_rollback) disable_rollback=disable_rollback,
tags=new_tags)
msgq_mock = mock.MagicMock() msgq_mock = mock.MagicMock()
msgq_mock.get_nowait.return_value = cancel_message msgq_mock.get_nowait.return_value = cancel_message
@ -878,6 +881,10 @@ class StackUpdateTest(common.HeatTestCase):
self.stack.update(updated_stack, msg_queue=msgq_mock) self.stack.update(updated_stack, msg_queue=msgq_mock)
self.assertEqual(state, self.stack.state) self.assertEqual(state, self.stack.state)
if disable_rollback:
self.assertEqual(new_tags, self.stack.tags)
else:
self.assertEqual(old_tags, self.stack.tags)
msgq_mock.get_nowait.assert_called_once_with() msgq_mock.get_nowait.assert_called_once_with()
def test_update_force_cancel_no_rollback(self): def test_update_force_cancel_no_rollback(self):