Provide 'and' function
Provides condition function 'and' for templates:
AWSTemplateFormatVersion.2010-09-09
heat_template_version.2016-10-14
Blueprint: support-conditions-function
Change-Id: I7a9a10b871f50a5a2885adc72d60d626f960557c
diff --git a/functional/test_conditions.py b/functional/test_conditions.py
index aefd9e8..6ac01e1 100644
--- a/functional/test_conditions.py
+++ b/functional/test_conditions.py
@@ -20,6 +20,9 @@
Default: test
Type: String
AllowedValues: [prod, test]
+ zone:
+ Type: String
+ Default: beijing
Conditions:
Prod: {"Fn::Equals" : [{Ref: env_type}, "prod"]}
Test:
@@ -27,6 +30,14 @@
- Fn::Equals:
- Ref: env_type
- prod
+ Beijing_Prod:
+ Fn::And:
+ - Fn::Equals:
+ - Ref: env_type
+ - prod
+ - Fn::Equals:
+ - Ref: zone
+ - beijing
Resources:
test_res:
Type: OS::Heat::TestResource
@@ -42,6 +53,11 @@
Properties:
value: just in test env
Condition: Test
+ beijing_prod_res:
+ Type: OS::Heat::TestResource
+ Properties:
+ value: beijing_prod_res
+ Condition: Beijing_Prod
Outputs:
res_value:
Value: {"Fn::GetAtt": [prod_res, output]}
@@ -53,6 +69,8 @@
test_res1_value:
Value: {"Fn::If": [Test, {"Fn::GetAtt": [test_res1, output]},
'no_test_res1']}
+ beijing_prod_res:
+ Value: {"Fn::If": [Beijing_Prod, {Ref: beijing_prod_res}, 'no_prod_res']}
'''
hot_template = '''
@@ -63,6 +81,9 @@
type: string
constraints:
- allowed_values: [prod, test]
+ zone:
+ type: string
+ default: beijing
conditions:
prod: {equals : [{get_param: env_type}, "prod"]}
test:
@@ -70,6 +91,14 @@
equals:
- get_param: env_type
- prod
+ beijing_prod:
+ and:
+ - equals:
+ - get_param: zone
+ - beijing
+ - equals:
+ - get_param: env_type
+ - prod
resources:
test_res:
type: OS::Heat::TestResource
@@ -85,6 +114,11 @@
properties:
value: just in test env
condition: test
+ beijing_prod_res:
+ type: OS::Heat::TestResource
+ properties:
+ value: beijing_prod_res
+ condition: beijing_prod
outputs:
res_value:
value: {get_attr: [prod_res, output]}
@@ -95,6 +129,9 @@
value: {if: [prod, {get_resource: prod_res}, 'no_prod_res']}
test_res1_value:
value: {if: [test, {get_attr: [test_res1, output]}, 'no_test_res1']}
+ beijing_prod_res:
+ value: {if: [beijing_prod, {get_resource: beijing_prod_res},
+ 'no_prod_res']}
'''
@@ -103,9 +140,13 @@
def setUp(self):
super(CreateUpdateResConditionTest, self).setUp()
- def res_assert_for_prod(self, resources):
- self.assertEqual(2, len(resources))
+ def res_assert_for_prod(self, resources, bj_prod=True):
res_names = [res.resource_name for res in resources]
+ if bj_prod:
+ self.assertEqual(3, len(resources))
+ self.assertIn('beijing_prod_res', res_names)
+ else:
+ self.assertEqual(2, len(resources))
self.assertIn('prod_res', res_names)
self.assertIn('test_res', res_names)
@@ -116,7 +157,7 @@
self.assertIn('test_res1', res_names)
self.assertNotIn('prod_res', res_names)
- def output_assert_for_prod(self, stack_id):
+ def output_assert_for_prod(self, stack_id, bj_prod=True):
output = self.client.stacks.output_show(stack_id,
'res_value')['output']
self.assertEqual('prod_res', output['output_value'])
@@ -133,6 +174,14 @@
stack_id, 'test_res1_value')['output']
self.assertEqual('no_test_res1', test_res_output['output_value'])
+ beijing_prod_res = self.client.stacks.output_show(
+ stack_id, 'beijing_prod_res')['output']
+ if bj_prod:
+ self.assertNotEqual('no_prod_res',
+ beijing_prod_res['output_value'])
+ else:
+ self.assertEqual('no_prod_res', beijing_prod_res['output_value'])
+
def output_assert_for_test(self, stack_id):
output = self.client.stacks.output_show(stack_id,
'res_value')['output']
@@ -151,6 +200,10 @@
self.assertEqual('just in test env',
test_res_output['output_value'])
+ beijing_prod_res = self.client.stacks.output_show(
+ stack_id, 'beijing_prod_res')['output']
+ self.assertEqual('no_prod_res', beijing_prod_res['output_value'])
+
def test_stack_create_update_cfn_template_test_to_prod(self):
stack_identifier = self.stack_create(template=cfn_template)
resources = self.client.resources.list(stack_identifier)
@@ -166,6 +219,16 @@
self.res_assert_for_prod(resources)
self.output_assert_for_prod(stack_identifier)
+ parms = {'env_type': 'prod',
+ 'zone': 'shanghai'}
+ self.update_stack(stack_identifier,
+ template=cfn_template,
+ parameters=parms)
+
+ resources = self.client.resources.list(stack_identifier)
+ self.res_assert_for_prod(resources, False)
+ self.output_assert_for_prod(stack_identifier, False)
+
def test_stack_create_update_cfn_template_prod_to_test(self):
parms = {'env_type': 'prod'}
stack_identifier = self.stack_create(template=cfn_template,
@@ -198,6 +261,16 @@
self.res_assert_for_prod(resources)
self.output_assert_for_prod(stack_identifier)
+ parms = {'env_type': 'prod',
+ 'zone': 'shanghai'}
+ self.update_stack(stack_identifier,
+ template=hot_template,
+ parameters=parms)
+
+ resources = self.client.resources.list(stack_identifier)
+ self.res_assert_for_prod(resources, False)
+ self.output_assert_for_prod(stack_identifier, False)
+
def test_stack_create_update_hot_template_prod_to_test(self):
parms = {'env_type': 'prod'}
stack_identifier = self.stack_create(template=hot_template,