# 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 tempest.lib import decorators from heat_tempest_plugin.tests.functional import functional_base class StackOutputsTest(functional_base.FunctionalTestsBase): template = ''' heat_template_version: 2015-10-15 resources: test_resource_a: type: OS::Heat::TestResource properties: value: 'a' test_resource_b: type: OS::Heat::TestResource properties: value: 'b' outputs: resource_output_a: description: 'Output of resource a' value: { get_attr: [test_resource_a, output] } resource_output_b: description: 'Output of resource b' value: { get_attr: [test_resource_b, output] } ''' @decorators.idempotent_id('a886dd67-4506-4a37-82ae-43f0a7d83f35') def test_outputs(self): stack_identifier = self.stack_create( template=self.template ) expected_list = [{u'output_key': u'resource_output_a', u'description': u'Output of resource a'}, {u'output_key': u'resource_output_b', u'description': u'Output of resource b'}] actual_list = self.client.stacks.output_list( stack_identifier)['outputs'] sorted_actual_list = sorted(actual_list, key=lambda x: x['output_key']) self.assertEqual(expected_list, sorted_actual_list) expected_output_a = { u'output_value': u'a', u'output_key': u'resource_output_a', u'description': u'Output of resource a'} expected_output_b = { u'output_value': u'b', u'output_key': u'resource_output_b', u'description': u'Output of resource b'} actual_output_a = self.client.stacks.output_show( stack_identifier, 'resource_output_a')['output'] actual_output_b = self.client.stacks.output_show( stack_identifier, 'resource_output_b')['output'] self.assertEqual(expected_output_a, actual_output_a) self.assertEqual(expected_output_b, actual_output_b) before_template = ''' heat_template_version: 2015-10-15 resources: test_resource_a: type: OS::Heat::TestResource properties: value: 'foo' outputs: ''' after_template = ''' heat_template_version: 2015-10-15 resources: test_resource_a: type: OS::Heat::TestResource properties: value: 'foo' test_resource_b: type: OS::Heat::TestResource properties: value: {get_attr: [test_resource_a, output]} outputs: output_value: description: 'Output of resource b' value: {get_attr: [test_resource_b, output]} ''' @decorators.idempotent_id('aea0e495-4c77-4033-8c43-3351e9cb7b48') def test_outputs_update_new_resource(self): stack_identifier = self.stack_create(template=self.before_template) self.update_stack(stack_identifier, template=self.after_template) expected_output_value = { u'output_value': u'foo', u'output_key': u'output_value', u'description': u'Output of resource b'} actual_output_value = self.client.stacks.output_show( stack_identifier, 'output_value')['output'] self.assertEqual(expected_output_value, actual_output_value) nested_template = ''' heat_template_version: 2015-10-15 resources: parent: type: 1.yaml outputs: resource_output_a: value: { get_attr: [parent, resource_output_a] } description: 'parent a' resource_output_b: value: { get_attr: [parent, resource_output_b] } description: 'parent b' ''' error_template = ''' heat_template_version: 2015-10-15 resources: test_resource_a: type: OS::Heat::TestResource properties: value: 'a' test_resource_b: type: OS::Heat::TestResource properties: value: 'b' outputs: resource_output_a: description: 'Output of resource a' value: { get_attr: [test_resource_a, output] } resource_output_b: description: 'Output of resource b' value: { get_param: foo } ''' @decorators.idempotent_id('993a403c-c6e2-475d-a65d-a82b8c9e0c22') def test_output_error_nested(self): stack_identifier = self.stack_create( template=self.nested_template, files={'1.yaml': self.error_template} ) self.update_stack(stack_identifier, template=self.nested_template, files={'1.yaml': self.error_template}) expected_list = [{u'output_key': u'resource_output_a', u'output_value': u'a', u'description': u'parent a'}, {u'output_key': u'resource_output_b', u'output_value': None, u'output_error': u'Error in parent output ' u'resource_output_b: The Parameter' u' (foo) was not provided.', u'description': u'parent b'}] actual_list = self.client.stacks.get(stack_identifier).outputs sorted_actual_list = sorted(actual_list, key=lambda x: x['output_key']) self.assertEqual(expected_list, sorted_actual_list)