Add basic admin tests for Aodh
Change-Id: I6bd23111288aa16068cda0246bd0ce50e2e864cd
diff --git a/telemetry_tempest_plugin/aodh/api/admin/__init__.py b/telemetry_tempest_plugin/aodh/api/admin/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/telemetry_tempest_plugin/aodh/api/admin/__init__.py
diff --git a/telemetry_tempest_plugin/aodh/api/admin/test_alarming_api_admin.py b/telemetry_tempest_plugin/aodh/api/admin/test_alarming_api_admin.py
new file mode 100644
index 0000000..a612716
--- /dev/null
+++ b/telemetry_tempest_plugin/aodh/api/admin/test_alarming_api_admin.py
@@ -0,0 +1,115 @@
+# 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 import config
+from tempest.lib.common.utils import data_utils
+from tempest.lib import decorators
+from tempest.lib import exceptions as lib_exc
+
+from telemetry_tempest_plugin.aodh.api import base
+
+CONF = config.CONF
+
+
+class TelemetryAlarmingAPIAdminTest(base.BaseAlarmingAdminTest):
+
+ @classmethod
+ def resource_setup(cls):
+ super(TelemetryAlarmingAPIAdminTest, cls).resource_setup()
+
+ if CONF.alarming_plugin.create_alarms:
+ cls.rule = {
+ "event_type": "compute.instance.*",
+ "query": [
+ {"field": "traits.name",
+ "type": "string",
+ "op": "eq",
+ "value": "test"}]
+ }
+ for i in range(2):
+ cls.create_alarm(event_rule=cls.rule)
+
+ @decorators.idempotent_id('1c918e06-210b-41eb-bd45-14676dd77cd7')
+ def test_alarm_list(self):
+ # List alarms
+ alarm_list = self.admin_client.list_alarms(query=['all_projects',
+ 'eq',
+ 'true'])
+
+ # Verify created alarm in the list
+ fetched_ids = [a['alarm_id'] for a in alarm_list]
+ missing_alarms = [a for a in self.alarm_ids if a not in fetched_ids]
+ self.assertEqual(0, len(missing_alarms),
+ "Failed to find the following created alarm(s)"
+ " in a fetched list: %s" %
+ ', '.join(str(a) for a in missing_alarms))
+
+ @decorators.idempotent_id('f9966992-405d-475c-aa41-47213cecdf94')
+ def test_alarm_create_set_log_test_actions(self):
+ # Create an alarm
+ alarm_name = data_utils.rand_name('telemetry_alarm')
+ alarm_actions = ['test://', 'log://']
+ body = self.admin_client.create_alarm(
+ name=alarm_name, type='event',
+ event_rule=self.rule,
+ alarm_actions=alarm_actions)
+ self.assertEqual(alarm_name, body['name'])
+ alarm_id = body['alarm_id']
+ self.assertDictContainsSubset(self.rule, body['event_rule'])
+ self.assertEqual(['test:', 'log:'], body['alarm_actions'])
+
+ # Verify not seen by non-admin
+ self.assertRaises(lib_exc.NotFound,
+ self.alarming_client.show_alarm, alarm_id)
+
+ # Delete alarm and verify if deleted
+ self.admin_client.delete_alarm(alarm_id)
+ self.assertRaises(lib_exc.NotFound,
+ self.admin_client.show_alarm, alarm_id)
+
+ @decorators.idempotent_id('5d9f41d4-febc-47a8-a9cb-29ef77229e7b')
+ def test_alarm_update_and_delete(self):
+ # Create an alarm as normal user
+ alarm_name = data_utils.rand_name('telemetry_alarm')
+ body = self.alarming_client.create_alarm(
+ name=alarm_name, type='event',
+ event_rule=self.rule)
+ self.assertEqual(alarm_name, body['name'])
+ alarm_id = body['alarm_id']
+ self.assertDictContainsSubset(self.rule, body['event_rule'])
+
+ # Verify initial state as non-admin
+ body = self.alarming_client.show_alarm(alarm_id)
+ self.assertEqual("insufficient data", body['state'])
+ self.assertEqual("Not evaluated yet", body['state_reason'])
+
+ # Verify initial state as admin
+ body = self.admin_client.show_alarm(alarm_id)
+ self.assertEqual("insufficient data", body['state'])
+ self.assertEqual("Not evaluated yet", body['state_reason'])
+
+ # Update state and verify as admin
+ self.admin_client.alarm_set_state(alarm_id, state='ok')
+ body = self.admin_client.show_alarm(alarm_id)
+ self.assertEqual('ok', body['state'])
+ self.assertEqual('Manually set via API', body['state_reason'])
+
+ # Verify state as non-admin
+ body = self.alarming_client.show_alarm(alarm_id)
+ self.assertEqual('ok', body['state'])
+ self.assertEqual('Manually set via API', body['state_reason'])
+
+ # Delete alarm as admin and verify if deleted
+ self.admin_client.delete_alarm(alarm_id)
+ self.assertRaises(lib_exc.NotFound,
+ self.alarming_client.show_alarm, alarm_id)
+ self.assertRaises(lib_exc.NotFound,
+ self.admin_client.show_alarm, alarm_id)
diff --git a/telemetry_tempest_plugin/aodh/api/base.py b/telemetry_tempest_plugin/aodh/api/base.py
index 816f204..450e6e7 100644
--- a/telemetry_tempest_plugin/aodh/api/base.py
+++ b/telemetry_tempest_plugin/aodh/api/base.py
@@ -62,3 +62,15 @@
def resource_cleanup(cls):
cls.cleanup_resources(cls.alarming_client.delete_alarm, cls.alarm_ids)
super(BaseAlarmingTest, cls).resource_cleanup()
+
+
+class BaseAlarmingAdminTest(BaseAlarmingTest):
+ """Base test case class for all Alarming API admin tests."""
+
+ credentials = ['primary', 'admin']
+
+ @classmethod
+ def setup_clients(cls):
+ super(BaseAlarmingAdminTest, cls).setup_clients()
+ cls.alarming_client = cls.os_primary.alarming_client
+ cls.admin_client = cls.os_admin.alarming_client