dfcb265ae8
Instead of assertTrue and assertFalse use more specific asserts. They are compatible with Python 2.7[1] and 3.4[2] [1]: https://docs.python.org/2.7/library/unittest.html [2]: https://docs.python.org/3.4/library/unittest.html Change-Id: Ifee66714db561fb329911395b2cfdd90c689b609
168 lines
5.6 KiB
Python
168 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 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)
|