Merge "Add functional tests for update restrict"
diff --git a/common/test.py b/common/test.py
index 3339bf6..4eaa2b7 100644
--- a/common/test.py
+++ b/common/test.py
@@ -318,7 +318,8 @@
while timeutils.delta_seconds(start,
timeutils.utcnow()) < build_timeout:
try:
- stack = self.client.stacks.get(stack_identifier)
+ stack = self.client.stacks.get(stack_identifier,
+ resolve_outputs=False)
except heat_exceptions.HTTPNotFound:
if success_on_not_found:
return
@@ -375,7 +376,7 @@
stack_name = stack_identifier.split('/')[0]
self.updated_time[stack_identifier] = self.client.stacks.get(
- stack_identifier).updated_time
+ stack_identifier, resolve_outputs=False).updated_time
self._handle_in_progress(
self.client.stacks.update,
@@ -447,7 +448,7 @@
nested_identifier = '/'.join(nested_href.split('/')[-2:])
self.assertEqual(rsrc.physical_resource_id, nested_id)
- nested_stack = self.client.stacks.get(nested_id)
+ nested_stack = self.client.stacks.get(nested_id, resolve_outputs=False)
nested_identifier2 = '%s/%s' % (nested_stack.stack_name,
nested_stack.id)
self.assertEqual(nested_identifier, nested_identifier2)
@@ -461,7 +462,8 @@
rsrc = self.client.resources.get(stack_identifier, group_name)
physical_resource_id = rsrc.physical_resource_id
- nested_stack = self.client.stacks.get(physical_resource_id)
+ nested_stack = self.client.stacks.get(physical_resource_id,
+ resolve_outputs=False)
nested_identifier = '%s/%s' % (nested_stack.stack_name,
nested_stack.id)
parent_id = stack_identifier.split("/")[-1]
@@ -503,7 +505,7 @@
if expected_status not in ['ROLLBACK_COMPLETE'] and enable_cleanup:
self.addCleanup(self._stack_delete, name)
- stack = self.client.stacks.get(name)
+ stack = self.client.stacks.get(name, resolve_outputs=False)
stack_identifier = '%s/%s' % (name, stack.id)
kwargs = {'stack_identifier': stack_identifier,
'status': expected_status}
@@ -534,8 +536,7 @@
adopt_stack_data=adopt_data,
)
self.addCleanup(self._stack_delete, name)
-
- stack = self.client.stacks.get(name)
+ stack = self.client.stacks.get(name, resolve_outputs=False)
stack_identifier = '%s/%s' % (name, stack.id)
self._wait_for_stack_status(stack_identifier, wait_for_status)
return stack_identifier
diff --git a/functional/test_default_parameters.py b/functional/test_default_parameters.py
index a33823f..7201969 100644
--- a/functional/test_default_parameters.py
+++ b/functional/test_default_parameters.py
@@ -77,7 +77,7 @@
# remove the default from the parameter in the nested template.
ntempl = yaml.safe_load(self.nested_template)
del ntempl['parameters']['length']['default']
- nested_template = yaml.dump(ntempl)
+ nested_template = yaml.safe_dump(ntempl)
else:
nested_template = self.nested_template
diff --git a/functional/test_event_sinks.py b/functional/test_event_sinks.py
new file mode 100644
index 0000000..e4a23ff
--- /dev/null
+++ b/functional/test_event_sinks.py
@@ -0,0 +1,66 @@
+# 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.
+
+import uuid
+
+from zaqarclient.queues.v1 import client as zaqarclient
+
+from heat_integrationtests.functional import functional_base
+
+
+class ZaqarEventSinkTest(functional_base.FunctionalTestsBase):
+ template = '''
+heat_template_version: "2013-05-23"
+resources:
+ test_resource:
+ type: OS::Heat::TestResource
+ properties:
+ value: ok
+'''
+
+ def test_events(self):
+ queue_id = str(uuid.uuid4())
+ environment = {'event_sinks': [{'type': 'zaqar-queue',
+ 'target': queue_id,
+ 'ttl': 120}]}
+ stack_identifier = self.stack_create(
+ template=self.template,
+ environment=environment)
+ stack_name, stack_id = stack_identifier.split('/')
+ conf = {
+ 'auth_opts': {
+ 'backend': 'keystone',
+ 'options': {
+ 'os_username': self.conf.username,
+ 'os_password': self.conf.password,
+ 'os_project_name': self.conf.tenant_name,
+ 'os_auth_url': self.conf.auth_url
+ }
+ }
+ }
+
+ zaqar = zaqarclient.Client(conf=conf, version=1.1)
+ queue = zaqar.queue(queue_id)
+ messages = list(queue.messages())
+ self.assertEqual(4, len(messages))
+ types = [m.body['type'] for m in messages]
+ self.assertEqual(['os.heat.event'] * 4, types)
+ resources = set([m.body['payload']['resource_name'] for m in messages])
+ self.assertEqual(set([stack_name, 'test_resource']), resources)
+ stack_ids = [m.body['payload']['stack_id'] for m in messages]
+ self.assertEqual([stack_id] * 4, stack_ids)
+ statuses = [m.body['payload']['resource_status'] for m in messages]
+ statuses.sort()
+ self.assertEqual(
+ ['COMPLETE', 'COMPLETE', 'IN_PROGRESS', 'IN_PROGRESS'], statuses)
+ actions = [m.body['payload']['resource_action'] for m in messages]
+ self.assertEqual(['CREATE'] * 4, actions)
diff --git a/functional/test_hooks.py b/functional/test_hooks.py
index d9ebd44..bafb0ef 100644
--- a/functional/test_hooks.py
+++ b/functional/test_hooks.py
@@ -191,7 +191,7 @@
res_after.physical_resource_id)
def test_hook_pre_create_nested(self):
- files = {'nested.yaml': yaml.dump(self.template)}
+ files = {'nested.yaml': yaml.safe_dump(self.template)}
env = {'resource_registry':
{'resources':
{'nested':
diff --git a/functional/test_template_resource.py b/functional/test_template_resource.py
index fa34e2e..9a3e833 100644
--- a/functional/test_template_resource.py
+++ b/functional/test_template_resource.py
@@ -848,3 +848,90 @@
exp = ('ERROR: Attribute here-it-is for facade '
'OS::Thingy missing in provider')
self.assertEqual(exp, six.text_type(exc))
+
+
+class TemplateResourceNewParamTest(functional_base.FunctionalTestsBase):
+
+ main_template = '''
+heat_template_version: 2013-05-23
+resources:
+ my_resource:
+ type: resource.yaml
+ properties:
+ value1: foo
+'''
+ nested_templ = '''
+heat_template_version: 2013-05-23
+parameters:
+ value1:
+ type: string
+resources:
+ test:
+ type: OS::Heat::TestResource
+ properties:
+ value: {get_param: value1}
+'''
+ main_template_update = '''
+heat_template_version: 2013-05-23
+resources:
+ my_resource:
+ type: resource.yaml
+ properties:
+ value1: foo
+ value2: foo
+'''
+ nested_templ_update_fail = '''
+heat_template_version: 2013-05-23
+parameters:
+ value1:
+ type: string
+ value2:
+ type: string
+resources:
+ test:
+ type: OS::Heat::TestResource
+ properties:
+ fail: True
+ value:
+ str_replace:
+ template: VAL1-VAL2
+ params:
+ VAL1: {get_param: value1}
+ VAL2: {get_param: value2}
+'''
+ nested_templ_update = '''
+heat_template_version: 2013-05-23
+parameters:
+ value1:
+ type: string
+ value2:
+ type: string
+resources:
+ test:
+ type: OS::Heat::TestResource
+ properties:
+ value:
+ str_replace:
+ template: VAL1-VAL2
+ params:
+ VAL1: {get_param: value1}
+ VAL2: {get_param: value2}
+'''
+
+ def test_update(self):
+ stack_identifier = self.stack_create(
+ template=self.main_template,
+ files={'resource.yaml': self.nested_templ})
+
+ # Make the update fails with the new parameter inserted.
+ self.update_stack(
+ stack_identifier,
+ self.main_template_update,
+ files={'resource.yaml': self.nested_templ_update_fail},
+ expected_status='UPDATE_FAILED')
+
+ # Fix the update, it should succeed now.
+ self.update_stack(
+ stack_identifier,
+ self.main_template_update,
+ files={'resource.yaml': self.nested_templ_update})