Allow using 'get_param' for 'deletion_policy' section

Make sure to create stack successful if 'deletion_policy'
section using function 'get_param':
1. Allow Function as valid type when 'deletion_policy'
section validation.
2. Resolve 'deletion_policy' data before deletion_policy
checking when rsrc_defn init.

Change-Id: Idee0ed90c34cfbfb09546969b144496d757195d8
Closes-Bug: #1556790
This commit is contained in:
huangtianhua 2016-03-14 17:11:45 +08:00
parent 5748507573
commit 1628f65e6a
3 changed files with 68 additions and 10 deletions

View File

@ -130,7 +130,7 @@ class CfnTemplate(template.Template):
'list or string', allowed_keys, name, data)
self.validate_resource_key_type(
RES_DELETION_POLICY,
six.string_types,
(six.string_types, function.Function),
'string', allowed_keys, name, data)
self.validate_resource_key_type(
RES_UPDATE_POLICY,
@ -153,9 +153,10 @@ class CfnTemplate(template.Template):
if isinstance(depends, six.string_types):
depends = [depends]
deletion_policy = data.get(RES_DELETION_POLICY)
deletion_policy = function.resolve(data.get(RES_DELETION_POLICY))
if deletion_policy is not None:
if deletion_policy not in self.deletion_policies:
if deletion_policy not in six.iterkeys(
self.deletion_policies):
msg = _('Invalid deletion policy "%s"') % deletion_policy
raise exception.StackValidationFailed(message=msg)
else:

View File

@ -235,7 +235,7 @@ class HOTemplate20130523(template.Template):
'list or string', allowed_keys, name, data)
self.validate_resource_key_type(
RES_DELETION_POLICY,
six.string_types,
(six.string_types, function.Function),
'string', allowed_keys, name, data)
self.validate_resource_key_type(
RES_UPDATE_POLICY,
@ -256,9 +256,10 @@ class HOTemplate20130523(template.Template):
if isinstance(depends, six.string_types):
depends = [depends]
deletion_policy = data.get(RES_DELETION_POLICY)
deletion_policy = function.resolve(data.get(RES_DELETION_POLICY))
if deletion_policy is not None:
if deletion_policy not in HOTemplate20130523.deletion_policies:
if deletion_policy not in six.iterkeys(
HOTemplate20130523.deletion_policies):
msg = _('Invalid deletion policy "%s"') % deletion_policy
raise exception.StackValidationFailed(message=msg)
else:

View File

@ -1977,29 +1977,85 @@ class StackTest(common.HeatTestCase):
def test_incorrect_deletion_policy(self):
tmpl = template_format.parse("""
HeatTemplateFormatVersion: '2012-12-12'
Parameters:
Deletion_Policy:
Type: String
Default: [1, 2]
Resources:
AResource:
Type: ResourceWithPropsType
DeletionPolicy: wibble
DeletionPolicy: {Ref: Deletion_Policy}
Properties:
Foo: abc
""")
self.stack = stack.Stack(self.ctx, 'stack_bad_delpol',
template.Template(tmpl))
ex = self.assertRaises(exception.StackValidationFailed,
self.stack.validate)
self.assertIn('Invalid deletion policy "wibble"',
self.assertIn('Invalid deletion policy "[1, 2]"',
six.text_type(ex))
def test_deletion_policy_apply_ref(self):
tmpl = template_format.parse("""
HeatTemplateFormatVersion: '2012-12-12'
Parameters:
Deletion_Policy:
Type: String
Default: Delete
Resources:
AResource:
Type: ResourceWithPropsType
DeletionPolicy: wibble
Properties:
Foo: abc
DeletionPolicy: {Ref: Deletion_Policy}
""")
self.stack = stack.Stack(self.ctx, 'stack_delpol_get_param',
template.Template(tmpl))
self.stack.validate()
self.stack.store()
self.stack.create()
self.assertEqual((self.stack.CREATE, self.stack.COMPLETE),
self.stack.state)
def test_deletion_policy_apply_get_param(self):
tmpl = template_format.parse("""
heat_template_version: 2016-04-08
parameters:
deletion_policy:
type: string
default: Delete
resources:
AResource:
type: ResourceWithPropsType
deletion_policy: {get_param: deletion_policy}
properties:
Foo: abc
""")
self.stack = stack.Stack(self.ctx, 'stack_delpol_get_param',
template.Template(tmpl))
self.stack.validate()
self.stack.store()
self.stack.create()
self.assertEqual((self.stack.CREATE, self.stack.COMPLETE),
self.stack.state)
def test_incorrect_deletion_policy_hot(self):
tmpl = template_format.parse("""
heat_template_version: 2013-05-23
parameters:
deletion_policy:
type: string
default: [1, 2]
resources:
AResource:
type: ResourceWithPropsType
deletion_policy: wibble
deletion_policy: {get_param: deletion_policy}
properties:
Foo: abc
""")
@ -2009,7 +2065,7 @@ class StackTest(common.HeatTestCase):
ex = self.assertRaises(exception.StackValidationFailed,
self.stack.validate)
self.assertIn('Invalid deletion policy "wibble"',
self.assertIn('Invalid deletion policy "[1, 2]',
six.text_type(ex))
def test_incorrect_outputs_hot_get_attr(self):