# # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. from heat_integrationtests.functional import functional_base TEMPLATE_SIMPLE = ''' heat_template_version: 2016-04-08 parameters: string-length: type: number resources: my-chain: type: OS::Heat::ResourceChain properties: resources: ['OS::Heat::RandomString', 'OS::Heat::RandomString'] resource_properties: length: { get_param: string-length } outputs: resource-ids: value: { get_attr: [my-chain, refs] } resource-0-value: value: { get_attr: [my-chain, resource.0, value] } all-resource-attrs: value: { get_attr: [my-chain, attributes, value] } ''' TEMPLATE_PARAM_DRIVEN = ''' heat_template_version: 2016-04-08 parameters: chain-types: type: comma_delimited_list resources: my-chain: type: OS::Heat::ResourceChain properties: resources: { get_param: chain-types } ''' class ResourceChainTests(functional_base.FunctionalTestsBase): def test_create(self): # Test params = {'string-length': 8} stack_id = self.stack_create(template=TEMPLATE_SIMPLE, parameters=params) # Verify stack = self.client.stacks.get(stack_id) self.assertIsNotNone(stack) # Top-level resource for chain expected = {'my-chain': 'OS::Heat::ResourceChain'} found = self.list_resources(stack_id) self.assertEqual(expected, found) # Nested stack exists and has two resources nested_id = self.group_nested_identifier(stack_id, 'my-chain') expected = {'0': 'OS::Heat::RandomString', '1': 'OS::Heat::RandomString'} found = self.list_resources(nested_id) self.assertEqual(expected, found) # Outputs resource_ids = self._stack_output(stack, 'resource-ids') self.assertIsNotNone(resource_ids) self.assertEqual(2, len(resource_ids)) resource_value = self._stack_output(stack, 'resource-0-value') self.assertIsNotNone(resource_value) self.assertEqual(8, len(resource_value)) # from parameter resource_attrs = self._stack_output(stack, 'all-resource-attrs') self.assertIsNotNone(resource_attrs) self.assertIsInstance(resource_attrs, dict) self.assertEqual(2, len(resource_attrs)) self.assertEqual(8, len(resource_attrs['0'])) self.assertEqual(8, len(resource_attrs['1'])) def test_update(self): # Setup params = {'string-length': 8} stack_id = self.stack_create(template=TEMPLATE_SIMPLE, parameters=params) update_tmpl = ''' heat_template_version: 2016-04-08 parameters: string-length: type: number resources: my-chain: type: OS::Heat::ResourceChain properties: resources: ['OS::Heat::None'] ''' # Test self.update_stack(stack_id, template=update_tmpl, parameters=params) # Verify # Nested stack only has the None resource nested_id = self.group_nested_identifier(stack_id, 'my-chain') expected = {'0': 'OS::Heat::None'} found = self.list_resources(nested_id) self.assertEqual(expected, found) def test_update_resources(self): params = {'chain-types': 'OS::Heat::None'} stack_id = self.stack_create(template=TEMPLATE_PARAM_DRIVEN, parameters=params) nested_id = self.group_nested_identifier(stack_id, 'my-chain') expected = {'0': 'OS::Heat::None'} found = self.list_resources(nested_id) self.assertEqual(expected, found) params = {'chain-types': 'OS::Heat::None,OS::Heat::None'} self.update_stack(stack_id, template=TEMPLATE_PARAM_DRIVEN, parameters=params) expected = {'0': 'OS::Heat::None', '1': 'OS::Heat::None'} found = self.list_resources(nested_id) self.assertEqual(expected, found) def test_resources_param_driven(self): # Setup params = {'chain-types': 'OS::Heat::None,OS::Heat::RandomString,OS::Heat::None'} # Test stack_id = self.stack_create(template=TEMPLATE_PARAM_DRIVEN, parameters=params) # Verify nested_id = self.group_nested_identifier(stack_id, 'my-chain') expected = {'0': 'OS::Heat::None', '1': 'OS::Heat::RandomString', '2': 'OS::Heat::None'} found = self.list_resources(nested_id) self.assertEqual(expected, found) def test_resources_env_defined(self): # Setup env = {'parameters': {'chain-types': 'OS::Heat::None'}} # Test stack_id = self.stack_create(template=TEMPLATE_PARAM_DRIVEN, environment=env) # Verify nested_id = self.group_nested_identifier(stack_id, 'my-chain') expected = {'0': 'OS::Heat::None'} found = self.list_resources(nested_id) self.assertEqual(expected, found)