161 lines
5.6 KiB
Python
161 lines
5.6 KiB
Python
# 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)
|