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:
parent
5748507573
commit
1628f65e6a
|
@ -130,7 +130,7 @@ class CfnTemplate(template.Template):
|
||||||
'list or string', allowed_keys, name, data)
|
'list or string', allowed_keys, name, data)
|
||||||
self.validate_resource_key_type(
|
self.validate_resource_key_type(
|
||||||
RES_DELETION_POLICY,
|
RES_DELETION_POLICY,
|
||||||
six.string_types,
|
(six.string_types, function.Function),
|
||||||
'string', allowed_keys, name, data)
|
'string', allowed_keys, name, data)
|
||||||
self.validate_resource_key_type(
|
self.validate_resource_key_type(
|
||||||
RES_UPDATE_POLICY,
|
RES_UPDATE_POLICY,
|
||||||
|
@ -153,9 +153,10 @@ class CfnTemplate(template.Template):
|
||||||
if isinstance(depends, six.string_types):
|
if isinstance(depends, six.string_types):
|
||||||
depends = [depends]
|
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 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
|
msg = _('Invalid deletion policy "%s"') % deletion_policy
|
||||||
raise exception.StackValidationFailed(message=msg)
|
raise exception.StackValidationFailed(message=msg)
|
||||||
else:
|
else:
|
||||||
|
|
|
@ -235,7 +235,7 @@ class HOTemplate20130523(template.Template):
|
||||||
'list or string', allowed_keys, name, data)
|
'list or string', allowed_keys, name, data)
|
||||||
self.validate_resource_key_type(
|
self.validate_resource_key_type(
|
||||||
RES_DELETION_POLICY,
|
RES_DELETION_POLICY,
|
||||||
six.string_types,
|
(six.string_types, function.Function),
|
||||||
'string', allowed_keys, name, data)
|
'string', allowed_keys, name, data)
|
||||||
self.validate_resource_key_type(
|
self.validate_resource_key_type(
|
||||||
RES_UPDATE_POLICY,
|
RES_UPDATE_POLICY,
|
||||||
|
@ -256,9 +256,10 @@ class HOTemplate20130523(template.Template):
|
||||||
if isinstance(depends, six.string_types):
|
if isinstance(depends, six.string_types):
|
||||||
depends = [depends]
|
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 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
|
msg = _('Invalid deletion policy "%s"') % deletion_policy
|
||||||
raise exception.StackValidationFailed(message=msg)
|
raise exception.StackValidationFailed(message=msg)
|
||||||
else:
|
else:
|
||||||
|
|
|
@ -1977,29 +1977,85 @@ class StackTest(common.HeatTestCase):
|
||||||
def test_incorrect_deletion_policy(self):
|
def test_incorrect_deletion_policy(self):
|
||||||
tmpl = template_format.parse("""
|
tmpl = template_format.parse("""
|
||||||
HeatTemplateFormatVersion: '2012-12-12'
|
HeatTemplateFormatVersion: '2012-12-12'
|
||||||
|
Parameters:
|
||||||
|
Deletion_Policy:
|
||||||
|
Type: String
|
||||||
|
Default: [1, 2]
|
||||||
Resources:
|
Resources:
|
||||||
AResource:
|
AResource:
|
||||||
Type: ResourceWithPropsType
|
Type: ResourceWithPropsType
|
||||||
DeletionPolicy: wibble
|
DeletionPolicy: {Ref: Deletion_Policy}
|
||||||
Properties:
|
Properties:
|
||||||
Foo: abc
|
Foo: abc
|
||||||
""")
|
""")
|
||||||
|
|
||||||
self.stack = stack.Stack(self.ctx, 'stack_bad_delpol',
|
self.stack = stack.Stack(self.ctx, 'stack_bad_delpol',
|
||||||
template.Template(tmpl))
|
template.Template(tmpl))
|
||||||
|
|
||||||
ex = self.assertRaises(exception.StackValidationFailed,
|
ex = self.assertRaises(exception.StackValidationFailed,
|
||||||
self.stack.validate)
|
self.stack.validate)
|
||||||
|
|
||||||
self.assertIn('Invalid deletion policy "wibble"',
|
self.assertIn('Invalid deletion policy "[1, 2]"',
|
||||||
six.text_type(ex))
|
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):
|
def test_incorrect_deletion_policy_hot(self):
|
||||||
tmpl = template_format.parse("""
|
tmpl = template_format.parse("""
|
||||||
heat_template_version: 2013-05-23
|
heat_template_version: 2013-05-23
|
||||||
|
parameters:
|
||||||
|
deletion_policy:
|
||||||
|
type: string
|
||||||
|
default: [1, 2]
|
||||||
resources:
|
resources:
|
||||||
AResource:
|
AResource:
|
||||||
type: ResourceWithPropsType
|
type: ResourceWithPropsType
|
||||||
deletion_policy: wibble
|
deletion_policy: {get_param: deletion_policy}
|
||||||
properties:
|
properties:
|
||||||
Foo: abc
|
Foo: abc
|
||||||
""")
|
""")
|
||||||
|
@ -2009,7 +2065,7 @@ class StackTest(common.HeatTestCase):
|
||||||
ex = self.assertRaises(exception.StackValidationFailed,
|
ex = self.assertRaises(exception.StackValidationFailed,
|
||||||
self.stack.validate)
|
self.stack.validate)
|
||||||
|
|
||||||
self.assertIn('Invalid deletion policy "wibble"',
|
self.assertIn('Invalid deletion policy "[1, 2]',
|
||||||
six.text_type(ex))
|
six.text_type(ex))
|
||||||
|
|
||||||
def test_incorrect_outputs_hot_get_attr(self):
|
def test_incorrect_outputs_hot_get_attr(self):
|
||||||
|
|
Loading…
Reference in New Issue