From 6aa997b40b656fec4060380f7b80952e99cf9e88 Mon Sep 17 00:00:00 2001 From: James Combs Date: Mon, 31 Aug 2015 20:50:51 +0000 Subject: [PATCH] Adding basic test to exercise the heat event APIs. Change-Id: I8ff9554b38e3a72fbf6bb09ca074191e13585bd8 --- .../functional/test_stack_events.py | 112 ++++++++++++++++++ 1 file changed, 112 insertions(+) create mode 100644 heat_integrationtests/functional/test_stack_events.py diff --git a/heat_integrationtests/functional/test_stack_events.py b/heat_integrationtests/functional/test_stack_events.py new file mode 100644 index 000000000..b1b233928 --- /dev/null +++ b/heat_integrationtests/functional/test_stack_events.py @@ -0,0 +1,112 @@ +# 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 + + +class StackEventsTest(functional_base.FunctionalTestsBase): + + template = ''' +heat_template_version: 2014-10-16 +parameters: +resources: + test_resource: + type: OS::Heat::TestResource + properties: + value: 'test1' + fail: False + update_replace: False + wait_secs: 0 +outputs: + resource_id: + description: 'ID of resource' + value: { get_resource: test_resource } +''' + + def setUp(self): + super(StackEventsTest, self).setUp() + + def _verify_event_fields(self, event, event_characteristics): + self.assertIsNotNone(event_characteristics) + self.assertIsNotNone(event.event_time) + self.assertIsNotNone(event.links) + self.assertIsNotNone(event.logical_resource_id) + self.assertIsNotNone(event.resource_status) + self.assertIn(event.resource_status, event_characteristics[1]) + self.assertIsNotNone(event.resource_status_reason) + self.assertIsNotNone(event.id) + + def test_event(self): + parameters = {} + + test_stack_name = self._stack_rand_name() + stack_identifier = self.stack_create( + stack_name=test_stack_name, + template=self.template, + parameters=parameters + ) + + expected_status = ['CREATE_IN_PROGRESS', 'CREATE_COMPLETE'] + event_characteristics = { + test_stack_name: ('OS::Heat::Stack', expected_status), + 'test_resource': ('OS::Heat::TestResource', expected_status)} + + # List stack events + # API: GET /v1/{tenant_id}/stacks/{stack_name}/{stack_id}/events + stack_events = self.client.events.list(stack_identifier) + + for stack_event in stack_events: + # Key on an expected/valid resource name + self._verify_event_fields( + stack_event, + event_characteristics[stack_event.resource_name]) + + # Test the event filtering API based on this resource_name + # /v1/{tenant_id}/stacks/{stack_name}/{stack_id}/resources/{resource_name}/events + resource_events = self.client.events.list( + stack_identifier, + stack_event.resource_name) + + # Resource events are a subset of the original stack event list + self.assertTrue(len(resource_events) < len(stack_events)) + + # Get the event details for each resource event + for resource_event in resource_events: + # A resource_event should be in the original stack event list + self.assertIn(resource_event, stack_events) + # Given a filtered list, the resource names should be identical + self.assertEqual( + resource_event.resource_name, + stack_event.resource_name) + # Verify all fields, keying off the resource_name + self._verify_event_fields( + resource_event, + event_characteristics[resource_event.resource_name]) + + # Exercise the event details API + # /v1/{tenant_id}/stacks/{stack_name}/{stack_id}/resources/{resource_name}/events/{event_id} + event_details = self.client.events.get( + stack_identifier, + resource_event.resource_name, + resource_event.id) + self._verify_event_fields( + event_details, + event_characteristics[event_details.resource_name]) + # The names should be identical to the non-detailed event + self.assertEqual( + resource_event.resource_name, + event_details.resource_name) + # Verify the extra field in the detail results + self.assertIsNotNone(event_details.resource_type) + self.assertEqual( + event_characteristics[event_details.resource_name][0], + event_details.resource_type)