Separate backends by type
Adding telemetry_services config group.
Deprecating old gnocchi and sg-core service options.
Splitting the backend specific tests into their own paths so they
can be disabled based on configuration.
Change-Id: I4ca0e217998825589f755d1169aa0600cef14248
diff --git a/.zuul.yaml b/.zuul.yaml
index 613717d..de2a73b 100644
--- a/.zuul.yaml
+++ b/.zuul.yaml
@@ -53,6 +53,9 @@
$TEMPEST_CONFIG:
service_available:
sg-core: True
+ telemetry_services:
+ aodh_gnocchi: True
+ aodh_prometheus: True
telemetry:
disable_ssl_certificate_validation: True
tempest_test_regex: telemetry_tempest_plugin
diff --git a/telemetry_tempest_plugin/aodh/api/base.py b/telemetry_tempest_plugin/aodh/api/base.py
index 7298170..816f204 100644
--- a/telemetry_tempest_plugin/aodh/api/base.py
+++ b/telemetry_tempest_plugin/aodh/api/base.py
@@ -31,8 +31,6 @@
super(BaseAlarmingTest, cls).skip_checks()
if not CONF.service_available.aodh:
raise cls.skipException("Aodh support is required")
- if not CONF.service_available.gnocchi:
- raise cls.skipException("Gnocchi support is required")
@classmethod
def setup_clients(cls):
diff --git a/telemetry_tempest_plugin/aodh/api/gnocchi/__init__.py b/telemetry_tempest_plugin/aodh/api/gnocchi/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/telemetry_tempest_plugin/aodh/api/gnocchi/__init__.py
diff --git a/telemetry_tempest_plugin/aodh/api/gnocchi/test_alarming_api.py b/telemetry_tempest_plugin/aodh/api/gnocchi/test_alarming_api.py
new file mode 100644
index 0000000..b6ccba5
--- /dev/null
+++ b/telemetry_tempest_plugin/aodh/api/gnocchi/test_alarming_api.py
@@ -0,0 +1,163 @@
+# 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 TelemetryAlarmingAPIGnocchiTest(base.BaseAlarmingTest):
+
+ @classmethod
+ def skip_checks(cls):
+ """This section is used to evaluate config early
+
+ Skip all test methods based on these checks
+ """
+
+ super(TelemetryAlarmingAPIGnocchiTest, cls).skip_checks()
+ if not CONF.telemetry_services.aodh_gnocchi:
+ msg = ("%s: Skipping Gnocchi specific tests withouth Gnocchi" %
+ cls.__name__)
+ raise cls.skipException(msg)
+
+ @decorators.idempotent_id('0024ca4b-3894-485a-bb4b-8d86e4714b48')
+ def test_create_update_get_delete_alarm(self):
+ # Create an alarm
+ alarm_name = data_utils.rand_name('telemetry_alarm')
+ rule = {'metrics': ['41869681-5776-46d6-91ed-cccc43b6e4e3',
+ 'a1fb80f4-c242-4f57-87c6-68f47521059e'],
+ 'aggregation_method': 'mean',
+ 'comparison_operator': 'eq',
+ 'threshold': 300.0}
+ body = self.alarming_client.create_alarm(
+ name=alarm_name,
+ alarm_actions=['http://no.where'],
+ type='gnocchi_aggregation_by_metrics_threshold',
+ gnocchi_aggregation_by_metrics_threshold_rule=rule
+ )
+ self.assertEqual(alarm_name, body['name'])
+ alarm_id = body['alarm_id']
+ self.assertDictContainsSubset(
+ rule,
+ body['gnocchi_aggregation_by_metrics_threshold_rule'])
+
+ # Update alarm with same rule and name
+ body = self.alarming_client.update_alarm(
+ alarm_id,
+ name=alarm_name,
+ alarm_actions=['http://no.where'],
+ type='gnocchi_aggregation_by_metrics_threshold',
+ gnocchi_aggregation_by_metrics_threshold_rule=rule)
+ self.assertEqual(alarm_name, body['name'])
+ self.assertDictContainsSubset(
+ rule,
+ body['gnocchi_aggregation_by_metrics_threshold_rule'])
+
+ # Update alarm with new rule and new name
+ new_rule = {'metrics': ['41869681-5776-46d6-91ed-cccc43b6e4e3',
+ 'a1fb80f4-c242-4f57-87c6-68f47521059e'],
+ 'aggregation_method': 'mean',
+ 'comparison_operator': 'eq',
+ 'threshold': 150.0}
+ alarm_name_updated = data_utils.rand_name('telemetry-alarm-update')
+ body = self.alarming_client.update_alarm(
+ alarm_id,
+ name=alarm_name_updated,
+ alarm_actions=['http://no.where'],
+ type='gnocchi_aggregation_by_metrics_threshold',
+ gnocchi_aggregation_by_metrics_threshold_rule=new_rule)
+ self.assertEqual(alarm_name_updated, body['name'])
+ self.assertDictContainsSubset(
+ new_rule,
+ body['gnocchi_aggregation_by_metrics_threshold_rule'])
+
+ # Update severity
+ body = self.alarming_client.update_alarm(
+ alarm_id,
+ name=alarm_name_updated,
+ alarm_actions=['http://no.where'],
+ type='gnocchi_aggregation_by_metrics_threshold',
+ gnocchi_aggregation_by_metrics_threshold_rule=new_rule,
+ severity='low')
+
+ # Get and verify details of an alarm after update
+ body = self.alarming_client.show_alarm(alarm_id)
+ self.assertEqual(alarm_name_updated, body['name'])
+ self.assertDictContainsSubset(
+ new_rule,
+ body['gnocchi_aggregation_by_metrics_threshold_rule'])
+ self.assertEqual('low', body['severity'])
+
+ # Get history for the alarm and verify the same
+ body = self.alarming_client.show_alarm_history(alarm_id)
+ self.assertEqual("rule change", body[0]['type'])
+ self.assertIn(alarm_name_updated, body[0]['detail'])
+ self.assertEqual("creation", body[1]['type'])
+ self.assertIn(alarm_name, body[1]['detail'])
+
+ # Query by state and verify
+ query = ['state', 'eq', 'insufficient data']
+ body = self.alarming_client.list_alarms(query)
+ self.assertNotEqual(0, len(body))
+ self.assertEqual(set(['insufficient data']),
+ set(alarm['state'] for alarm in body))
+
+ # Query by type and verify
+ query = ['type', 'eq', 'gnocchi_aggregation_by_metrics_threshold']
+ body = self.alarming_client.list_alarms(query)
+ self.assertNotEqual(0, len(body))
+ self.assertEqual(set(['gnocchi_aggregation_by_metrics_threshold']),
+ set(alarm['type'] for alarm in body))
+
+ # Delete alarm and verify if deleted
+ self.alarming_client.delete_alarm(alarm_id)
+ self.assertRaises(lib_exc.NotFound,
+ self.alarming_client.show_alarm, alarm_id)
+
+ @decorators.idempotent_id('c4486c22-cf8a-4e47-9168-22b92f3499f6')
+ def test_get_capabilities(self):
+
+ response = self.alarming_client.show_capabilities()
+ self.assertIsNotNone(response)
+ self.assertNotEqual({}, response)
+ self.assertIn('api', response)
+ self.assertIn('alarm_storage', response)
+
+ @decorators.idempotent_id('a45a95f6-7855-4dbc-a507-af0f48cc3370')
+ def test_create_n_delete_alarm_duplicate_actions(self):
+ # create dual actions
+ alarm_name = data_utils.rand_name('telemetry_alarm')
+ rule = {'metrics': ['41869681-5776-46d6-91ed-cccc43b6e4e3',
+ 'a1fb80f4-c242-4f57-87c6-68f47521059e'],
+ 'aggregation_method': 'mean',
+ 'comparison_operator': 'eq',
+ 'threshold': 300.0}
+ body = self.alarming_client.create_alarm(
+ name=alarm_name,
+ alarm_actions=['http://no.where', 'http://no.where'],
+ type='gnocchi_aggregation_by_metrics_threshold',
+ gnocchi_aggregation_by_metrics_threshold_rule=rule
+ )
+ alarm_id = body['alarm_id']
+ alarms = self.alarming_client.list_alarms(['name', 'eq', alarm_name])
+ self.assertEqual(1, len(alarms))
+ self.assertEqual(['http://no.where'], alarms[0]['alarm_actions'])
+
+ # Delete alarm and verify if deleted
+ self.alarming_client.delete_alarm(alarm_id)
+ self.assertRaises(lib_exc.NotFound,
+ self.alarming_client.show_alarm, alarm_id)
diff --git a/telemetry_tempest_plugin/aodh/api/gnocchi/test_alarming_api_negative.py b/telemetry_tempest_plugin/aodh/api/gnocchi/test_alarming_api_negative.py
new file mode 100644
index 0000000..b658807
--- /dev/null
+++ b/telemetry_tempest_plugin/aodh/api/gnocchi/test_alarming_api_negative.py
@@ -0,0 +1,513 @@
+# Copyright 2015 GlobalLogic. All rights reserved.
+#
+# 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 TelemetryAlarmingNegativeGnocchiTest(base.BaseAlarmingTest):
+ """Negative tests for show_alarm, update_alarm, show_alarm_history tests
+
+ ** show non-existent alarm
+ ** show the deleted alarm
+ ** delete deleted alarm
+ ** update deleted alarm
+ """
+
+ @classmethod
+ def skip_checks(cls):
+ """This section is used to evaluate config early
+
+ Skip all test methods based on these checks
+ """
+
+ super(TelemetryAlarmingNegativeGnocchiTest, cls).skip_checks()
+ if not CONF.telemetry_services.aodh_gnocchi:
+ msg = ("%s: Skipping Gnocchi specific tests withouth Gnocchi" %
+ cls.__name__)
+ raise cls.skipException(msg)
+
+ @decorators.attr(type=['negative'])
+ @decorators.idempotent_id('ef45000d-0a72-4781-866d-4cb7bf2582ae')
+ def test_get_update_show_history_delete_deleted_alarm(self):
+ # get, update and delete the deleted alarm
+ alarm_name = data_utils.rand_name('telemetry_alarm')
+ rule = {'metrics': ["c0d457b6-957e-41de-a384-d5eb0957de3b"],
+ 'aggregation_method': 'mean',
+ 'comparison_operator': 'eq',
+ 'threshold': 100.0,
+ 'granularity': 90}
+ body = self.alarming_client.create_alarm(
+ name=alarm_name,
+ type='gnocchi_aggregation_by_metrics_threshold',
+ gnocchi_aggregation_by_metrics_threshold_rule=rule)
+ alarm_id = body['alarm_id']
+ self.alarming_client.delete_alarm(alarm_id)
+ # get the deleted alarm
+ self.assertRaises(lib_exc.NotFound, self.alarming_client.show_alarm,
+ alarm_id)
+
+ # update the deleted alarm
+ updated_alarm_name = data_utils.rand_name('telemetry_alarm_updated')
+ updated_rule = {'metrics': ["c0d457b6-957e-41de-a384-d5eb0957de3b"],
+ 'comparison_operator': 'eq',
+ 'aggregation_method': 'mean',
+ 'threshold': 70,
+ 'granularity': 50}
+ self.assertRaises(
+ lib_exc.NotFound, self.alarming_client.update_alarm,
+ alarm_id,
+ gnocchi_aggregation_by_metrics_threshold_rule=updated_rule,
+ name=updated_alarm_name,
+ type='gnocchi_aggregation_by_metrics_threshold')
+ # delete the deleted alarm
+ self.assertRaises(lib_exc.NotFound, self.alarming_client.delete_alarm,
+ alarm_id)
+
+ @decorators.attr(type=['negative'])
+ @decorators.idempotent_id('3bd874d7-dcbf-410e-ab08-829969282d92')
+ def test_create_invalid_alarm_constraint_start(self):
+ # create bad time constraint
+ alarm_name = data_utils.rand_name('telemetry_alarm')
+ tc_name = data_utils.rand_name('time_constraint')
+ rule = {'metrics': ['41869681-5776-46d6-91ed-cccc43b6e4e3',
+ 'a1fb80f4-c242-4f57-87c6-68f47521059e'],
+ 'aggregation_method': 'mean',
+ 'comparison_operator': 'eq',
+ 'threshold': 300.0}
+ tc = [{'name': tc_name,
+ 'start': '11:00am',
+ 'duration': 10}]
+ self.assertRaises(
+ lib_exc.BadRequest,
+ self.alarming_client.create_alarm,
+ name=alarm_name,
+ type='gnocchi_aggregation_by_metrics_threshold',
+ time_constraints=tc,
+ gnocchi_aggregation_by_metrics_threshold_rule=rule)
+
+ @decorators.skip_because(bug="2045115")
+ @decorators.attr(type=['negative'])
+ @decorators.idempotent_id('384dec5a-af5b-4a9e-8dc1-9d056fca71d6')
+ def test_create_null_alarm_constraint(self):
+ # create bad time constraint
+ alarm_name = data_utils.rand_name('telemetry_alarm')
+ rule = {'metrics': ['41869681-5776-46d6-91ed-cccc43b6e4e3',
+ 'a1fb80f4-c242-4f57-87c6-68f47521059e'],
+ 'aggregation_method': 'mean',
+ 'comparison_operator': 'eq',
+ 'threshold': 300.0}
+ tc = None
+ self.assertRaises(
+ lib_exc.BadRequest,
+ self.alarming_client.create_alarm,
+ name=alarm_name,
+ type='gnocchi_aggregation_by_metrics_threshold',
+ time_constraints=tc,
+ gnocchi_aggregation_by_metrics_threshold_rule=rule)
+
+ @decorators.attr(type=['negative'])
+ @decorators.idempotent_id('f358ee93-798e-4641-8fdc-13dc2f7a71c5')
+ def test_create_duplicate_alarm_constraint_name(self):
+ # create bad time constraint
+ alarm_name = data_utils.rand_name('telemetry_alarm')
+ tc_name = data_utils.rand_name('time_constraint')
+ rule = {'metrics': ['41869681-5776-46d6-91ed-cccc43b6e4e3',
+ 'a1fb80f4-c242-4f57-87c6-68f47521059e'],
+ 'aggregation_method': 'mean',
+ 'comparison_operator': 'eq',
+ 'threshold': 300.0}
+ tc = [{'name': tc_name,
+ 'start': '* 11 * * *',
+ 'duration': 10},
+ {'name': tc_name,
+ 'start': '* * * * *',
+ 'duration': 20}]
+ self.assertRaises(
+ lib_exc.BadRequest,
+ self.alarming_client.create_alarm,
+ name=alarm_name,
+ type='gnocchi_aggregation_by_metrics_threshold',
+ time_constraints=tc,
+ gnocchi_aggregation_by_metrics_threshold_rule=rule)
+
+ @decorators.attr(type=['negative'])
+ @decorators.idempotent_id('e1d5d605-61a0-415b-bcaf-dc3a15717344')
+ def test_create_invalid_alarm_constraint_timezone(self):
+ # create bad time constraint
+ alarm_name = data_utils.rand_name('telemetry_alarm')
+ tc_name = data_utils.rand_name('time_constraint')
+ rule = {'metrics': ['41869681-5776-46d6-91ed-cccc43b6e4e3',
+ 'a1fb80f4-c242-4f57-87c6-68f47521059e'],
+ 'aggregation_method': 'mean',
+ 'comparison_operator': 'eq',
+ 'threshold': 300.0}
+ tc = [{'name': tc_name,
+ 'start': '* 11 * * *',
+ 'duration': 10,
+ 'timezone': 'aaaa'}]
+ self.assertRaises(
+ lib_exc.BadRequest,
+ self.alarming_client.create_alarm,
+ name=alarm_name,
+ type='gnocchi_aggregation_by_metrics_threshold',
+ time_constraints=tc,
+ gnocchi_aggregation_by_metrics_threshold_rule=rule)
+
+ @decorators.attr(type=['negative'])
+ @decorators.idempotent_id('7d3ee20c-8a0f-4a43-8a1a-2168da9905da')
+ def test_create_invalid_alarm_constraint_duration(self):
+ # create bad time constraint
+ alarm_name = data_utils.rand_name('telemetry_alarm')
+ tc_name = data_utils.rand_name('time_constraint')
+ rule = {'metrics': ['41869681-5776-46d6-91ed-cccc43b6e4e3',
+ 'a1fb80f4-c242-4f57-87c6-68f47521059e'],
+ 'aggregation_method': 'mean',
+ 'comparison_operator': 'eq',
+ 'threshold': 300.0}
+ tc = [{'name': tc_name,
+ 'start': '* 11 * * *',
+ 'duration': -10}]
+ self.assertRaises(
+ lib_exc.BadRequest,
+ self.alarming_client.create_alarm,
+ name=alarm_name,
+ type='gnocchi_aggregation_by_metrics_threshold',
+ time_constraints=tc,
+ gnocchi_aggregation_by_metrics_threshold_rule=rule)
+
+ @decorators.attr(type=['negative'])
+ @decorators.idempotent_id('21ab2919-8680-44d8-be90-57aac5b22474')
+ def test_create_invalid_alarm_rule_granularity(self):
+ # create bad time constraint
+ alarm_name = data_utils.rand_name('telemetry_alarm')
+ tc_name = data_utils.rand_name('time_constraint')
+ rule = {'metrics': ['41869681-5776-46d6-91ed-cccc43b6e4e3',
+ 'a1fb80f4-c242-4f57-87c6-68f47521059e'],
+ 'aggregation_method': 'mean',
+ 'comparison_operator': 'eq',
+ 'threshold': 300.0,
+ 'granularity': -1}
+ tc = [{'name': tc_name,
+ 'start': '* 11 * * *',
+ 'duration': 10}]
+ self.assertRaises(
+ lib_exc.BadRequest,
+ self.alarming_client.create_alarm,
+ name=alarm_name,
+ type='gnocchi_aggregation_by_metrics_threshold',
+ time_constraints=tc,
+ gnocchi_aggregation_by_metrics_threshold_rule=rule)
+
+ @decorators.attr(type=['negative'])
+ @decorators.idempotent_id('b942eeb3-7fc2-4ba4-ad8f-674f3ac7fb96')
+ def test_create_invalid_alarm_none_rule(self):
+ # create bad time constraint
+ alarm_name = data_utils.rand_name('telemetry_alarm')
+ tc_name = data_utils.rand_name('time_constraint')
+ rule = None
+ tc = [{'name': tc_name,
+ 'start': '* 11 * * *',
+ 'duration': -10}]
+ self.assertRaises(
+ lib_exc.BadRequest,
+ self.alarming_client.create_alarm,
+ name=alarm_name,
+ type='gnocchi_aggregation_by_metrics_threshold',
+ time_constraints=tc,
+ gnocchi_aggregation_by_metrics_threshold_rule=rule)
+
+ @decorators.attr(type=['negative'])
+ @decorators.idempotent_id('a805f2f3-ea3e-4574-b616-3dbe86cb95f8')
+ def test_create_invalid_alarm_input_state(self):
+ # create bad time constraint
+ alarm_name = data_utils.rand_name('telemetry_alarm')
+ rule = {'metrics': ['41869681-5776-46d6-91ed-cccc43b6e4e3',
+ 'a1fb80f4-c242-4f57-87c6-68f47521059e'],
+ 'aggregation_method': 'mean',
+ 'comparison_operator': 'eq',
+ 'threshold': 300.0}
+ self.assertRaises(
+ lib_exc.BadRequest,
+ self.alarming_client.create_alarm,
+ name=alarm_name,
+ state='bad_state',
+ type='gnocchi_aggregation_by_metrics_threshold',
+ gnocchi_aggregation_by_metrics_threshold_rule=rule)
+
+ @decorators.attr(type=['negative'])
+ @decorators.idempotent_id('ea90ef4a-135d-48f2-b984-c156a89f627c')
+ def test_create_invalid_alarm_input_severity(self):
+ # create bad time constraint
+ alarm_name = data_utils.rand_name('telemetry_alarm')
+ rule = {'metrics': ['41869681-5776-46d6-91ed-cccc43b6e4e3',
+ 'a1fb80f4-c242-4f57-87c6-68f47521059e'],
+ 'aggregation_method': 'mean',
+ 'comparison_operator': 'eq',
+ 'threshold': 300.0}
+ self.assertRaises(
+ lib_exc.BadRequest,
+ self.alarming_client.create_alarm,
+ name=alarm_name,
+ state='ok',
+ severity='bad_value',
+ type='gnocchi_aggregation_by_metrics_threshold',
+ gnocchi_aggregation_by_metrics_threshold_rule=rule)
+
+ @decorators.attr(type=['negative'])
+ @decorators.idempotent_id('3af990af-f134-4b87-9234-a25280afc176')
+ def test_create_invalid_alarm_input_enabled_string(self):
+ # create bad time constraint
+ alarm_name = data_utils.rand_name('telemetry_alarm')
+ rule = {'metrics': ['41869681-5776-46d6-91ed-cccc43b6e4e3',
+ 'a1fb80f4-c242-4f57-87c6-68f47521059e'],
+ 'aggregation_method': 'mean',
+ 'comparison_operator': 'eq',
+ 'threshold': 300.0}
+ self.assertRaises(
+ lib_exc.BadRequest,
+ self.alarming_client.create_alarm,
+ name=alarm_name,
+ state='ok',
+ enabled='bad_value',
+ type='gnocchi_aggregation_by_metrics_threshold',
+ gnocchi_aggregation_by_metrics_threshold_rule=rule)
+
+ @decorators.skip_because(bug="2045118")
+ @decorators.attr(type=['negative'])
+ @decorators.idempotent_id('db999b7e-3bc8-4be3-90f3-9d0034f61e8a')
+ def test_create_invalid_alarm_input_enabled_int(self):
+ # create bad time constraint
+ alarm_name = data_utils.rand_name('telemetry_alarm')
+ rule = {'metrics': ['41869681-5776-46d6-91ed-cccc43b6e4e3',
+ 'a1fb80f4-c242-4f57-87c6-68f47521059e'],
+ 'aggregation_method': 'mean',
+ 'comparison_operator': 'eq',
+ 'threshold': 300.0}
+ self.assertRaises(
+ lib_exc.BadRequest,
+ self.alarming_client.create_alarm,
+ name=alarm_name,
+ state='ok',
+ enabled=0,
+ type='gnocchi_aggregation_by_metrics_threshold',
+ gnocchi_aggregation_by_metrics_threshold_rule=rule)
+
+ @decorators.attr(type=['negative'])
+ @decorators.idempotent_id('0c64f10f-8529-46a5-9172-f0a64789632f')
+ def test_create_invalid_alarm_statistic(self):
+ # create bad time constraint
+ alarm_name = data_utils.rand_name('telemetry_alarm')
+ rule = {'metrics': ['41869681-5776-46d6-91ed-cccc43b6e4e3',
+ 'a1fb80f4-c242-4f57-87c6-68f47521059e'],
+ 'aggregation_method': 'magic',
+ 'comparison_operator': 'gt',
+ 'threshold': 2.0}
+ self.assertRaises(
+ lib_exc.BadRequest,
+ self.alarming_client.create_alarm,
+ name=alarm_name,
+ type='gnocchi_aggregation_by_metrics_threshold',
+ gnocchi_aggregation_by_metrics_threshold_rule=rule)
+
+ @decorators.attr(type=['negative'])
+ @decorators.idempotent_id('0c421fe7-69e9-4a7c-9df0-547f7bc4c91a')
+ def test_create_invalid_alarm_com_op(self):
+ # create bad time constraint
+ alarm_name = data_utils.rand_name('telemetry_alarm')
+ rule = {'metrics': ['41869681-5776-46d6-91ed-cccc43b6e4e3',
+ 'a1fb80f4-c242-4f57-87c6-68f47521059e'],
+ 'comparison_operator': 'bd_co',
+ 'threshold': 20.0}
+ self.assertRaises(
+ lib_exc.BadRequest,
+ self.alarming_client.create_alarm,
+ name=alarm_name,
+ type='gnocchi_aggregation_by_metrics_threshold',
+ gnocchi_aggregation_by_metrics_threshold_rule=rule)
+
+ @decorators.attr(type=['negative'])
+ @decorators.idempotent_id('5bbccedd-dd80-462c-a6da-d796d7667b5e')
+ def test_create_alarm_wsme_workaround(self):
+ # create bad time constraint
+ alarm_name = data_utils.rand_name('telemetry_alarm')
+ rule_key = 'gnocchi_aggregation_by_metrics_threshold_rule'
+ rules = {
+ 'type': {
+ 'name': alarm_name,
+ rule_key: {
+ 'metrics': ['41869681-5776-46d6-91ed-cccc43b6e4e3',
+ 'a1fb80f4-c242-4f57-87c6-68f47521059e'],
+ 'aggregation_method': 'mean',
+ 'threshold': 2.0,
+ }
+ },
+ 'name': {
+ 'type': 'gnocchi_aggregation_by_metrics_threshold',
+ rule_key: {
+ 'metrics': ['41869681-5776-46d6-91ed-cccc43b6e4e3',
+ 'a1fb80f4-c242-4f57-87c6-68f47521059e'],
+ 'aggregation_method': 'mean',
+ 'threshold': 2.0,
+ }
+ },
+ 'threshold_rule/metrics': {
+ 'name': alarm_name,
+ 'type': 'gnocchi_aggregation_by_metrics_threshold',
+ rule_key: {
+ 'aggregation_method': 'mean',
+ 'threshold': 2.0,
+ }
+ },
+ 'threshold_rule/threshold': {
+ 'name': alarm_name,
+ 'type': 'gnocchi_aggregation_by_metrics_threshold',
+ rule_key: {
+ 'metrics': ['41869681-5776-46d6-91ed-cccc43b6e4e3',
+ 'a1fb80f4-c242-4f57-87c6-68f47521059e'],
+ 'aggregation_method': 'mean',
+ }
+ },
+ }
+
+ for field, adef in rules.items():
+ self.assertRaises(
+ lib_exc.BadRequest,
+ self.alarming_client.create_alarm,
+ name=getattr(adef, 'name', None),
+ type=getattr(adef, 'type', None),
+ gnocchi_aggregation_by_metrics_threshold_rule=adef[rule_key]
+ )
+
+ def _do_create_alarm_invalid_action(self, ok_actions=None,
+ alarm_actions=None,
+ insufficient_data_actions=None,
+ error_message=None):
+
+ ok_actions = ok_actions or []
+ alarm_actions = alarm_actions or []
+ insufficient_data_actions = insufficient_data_actions or []
+ rule_key = 'gnocchi_aggregation_by_metrics_threshold_rule'
+ alarm_name = data_utils.rand_name('telemetry_alarm')
+ adef = {
+ 'enabled': False,
+ 'state': 'ok',
+ 'type': 'gnocchi_aggregation_by_metrics_threshold',
+ 'ok_actions': ok_actions,
+ 'alarm_actions': alarm_actions,
+ 'insufficient_data_actions': insufficient_data_actions,
+ 'repeat_actions': True,
+ rule_key: {
+ 'metrics': ['41869681-5776-46d6-91ed-cccc43b6e4e3',
+ 'a1fb80f4-c242-4f57-87c6-68f47521059e'],
+ 'comparison_operator': 'le',
+ 'aggregation_method': 'count',
+ 'threshold': 50,
+ 'evaluation_periods': '3',
+ 'granularity': '180',
+ }
+ }
+ self.assertRaises(
+ lib_exc.BadRequest,
+ self.alarming_client.create_alarm,
+ name=alarm_name,
+ type=adef['type'],
+ enabled=adef['enabled'],
+ state=adef['state'],
+ ok_actions=adef['ok_actions'],
+ alarm_actions=adef['alarm_actions'],
+ insufficient_data_actions=adef['insufficient_data_actions'],
+ repeat_actions=adef['repeat_actions'],
+ gnocchi_aggregation_by_metrics_threshold_rule=adef[rule_key])
+
+ @decorators.attr(type=['negative'])
+ @decorators.idempotent_id('95e505c3-51e0-4ac8-8e75-6dfb5828fcd2')
+ def test_create_invalid_alarm_ok_actions(self):
+ self._do_create_alarm_invalid_action(
+ ok_actions=['spam://something/ok'],
+ error_message='Unsupported action spam://something/ok')
+
+ @decorators.skip_because(bug="2045116")
+ @decorators.attr(type=['negative'])
+ @decorators.idempotent_id('4b2b7be0-9d13-4e36-ad28-d11c5aa06411')
+ def test_create_invalid_alarm_too_many_actions(self):
+ self._do_create_alarm_invalid_action(
+ ok_actions=['http://no.where', 'http://no.where2'],
+ error_message="alarm_actions count exceeds maximum value 1")
+
+ @decorators.attr(type=['negative'])
+ @decorators.idempotent_id('2332b637-8193-448c-8b37-e0b6a6fded34')
+ def test_post_invalid_alarm_alarm_actions(self):
+ self._do_create_alarm_invalid_action(
+ alarm_actions=['spam://something/alarm'],
+ error_message='Unsupported action spam://something/alarm')
+
+ @decorators.attr(type=['negative'])
+ @decorators.idempotent_id('78029ec7-cb70-4f89-a1b6-df235d6688b6')
+ def test_post_invalid_alarm_insufficient_data_actions(self):
+ self._do_create_alarm_invalid_action(
+ insufficient_data_actions=['spam://something/insufficient'],
+ error_message='Unsupported action spam://something/insufficient')
+
+ @decorators.attr(type='negative')
+ @decorators.idempotent_id('32bbc39e-7423-4309-acf9-39ff584764fc')
+ def test_create_update_with_faults_delete_alarm(self):
+ # create dual actions
+ alarm_name = data_utils.rand_name('telemetry_alarm')
+ rule = {'metrics': ['41869681-5776-46d6-91ed-cccc43b6e4e3',
+ 'a1fb80f4-c242-4f57-87c6-68f47521059e'],
+ 'aggregation_method': 'mean',
+ 'comparison_operator': 'eq',
+ 'threshold': 300.0}
+ body = self.alarming_client.create_alarm(
+ name=alarm_name,
+ alarm_actions=['http://no.where'],
+ type='gnocchi_aggregation_by_metrics_threshold',
+ gnocchi_aggregation_by_metrics_threshold_rule=rule
+ )
+ alarm_id = body['alarm_id']
+ alarms = self.alarming_client.list_alarms(['name', 'eq', alarm_name])
+ self.assertEqual(1, len(alarms))
+
+ # update the alarm with wrong fields.
+ self.assertRaises(
+ lib_exc.BadRequest,
+ self.alarming_client.update_alarm,
+ alarm_id=alarm_id,
+ this_can_not_be_correct='ha')
+
+ # update the alarm with invalid action
+ self.assertRaises(
+ lib_exc.BadRequest,
+ self.alarming_client.update_alarm,
+ alarm_id=alarm_id,
+ ok_actions='spam://something/ok')
+
+ # update the alarm with invalid state
+ self.assertRaises(
+ lib_exc.BadRequest,
+ self.alarming_client.alarm_set_state,
+ alarm_id=alarm_id,
+ state='not valid')
+
+ # Delete alarm and verify if deleted
+ self.alarming_client.delete_alarm(alarm_id)
+ self.assertRaises(lib_exc.NotFound,
+ self.alarming_client.show_alarm, alarm_id)
diff --git a/telemetry_tempest_plugin/aodh/api/prometheus/__init__.py b/telemetry_tempest_plugin/aodh/api/prometheus/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/telemetry_tempest_plugin/aodh/api/prometheus/__init__.py
diff --git a/telemetry_tempest_plugin/aodh/api/sql/__init__.py b/telemetry_tempest_plugin/aodh/api/sql/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/telemetry_tempest_plugin/aodh/api/sql/__init__.py
diff --git a/telemetry_tempest_plugin/aodh/api/sql/test_alarming_api.py b/telemetry_tempest_plugin/aodh/api/sql/test_alarming_api.py
new file mode 100644
index 0000000..fce5eb5
--- /dev/null
+++ b/telemetry_tempest_plugin/aodh/api/sql/test_alarming_api.py
@@ -0,0 +1,110 @@
+# 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 random
+
+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 TelemetryAlarmingAPIMysqlTest(base.BaseAlarmingTest):
+
+ @classmethod
+ def skip_checks(cls):
+ """This section is used to evaluate config early
+
+ Skip all test methods based on these checks
+ """
+
+ super(TelemetryAlarmingAPIMysqlTest, cls).skip_checks()
+ if not CONF.telemetry_services.aodh_mysql:
+ msg = ("%s: Skipping mysql specific tests withouth mysql" %
+ cls.__name__)
+ raise cls.skipException(msg)
+
+ @classmethod
+ def resource_setup(cls):
+ super(TelemetryAlarmingAPIMysqlTest, 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"}]
+ }
+
+ @decorators.idempotent_id('2fa9ba1e-6118-4ce7-984c-b5d2c275de55')
+ def test_create_list_sort_limit_delete_alarm(self):
+ # create test alarms
+ alarms = {}
+ sevs = ['critical', 'moderate']
+ for i in range(3):
+ alarm_name = data_utils.rand_name('sorted_alarms')
+ alarms[alarm_name] = []
+ for j in range(random.randint(2, 4)):
+ body = self.alarming_client.create_alarm(
+ name=alarm_name,
+ type='event',
+ severity=random.choice(sevs),
+ event_rule=self.rule)
+ alarms[alarm_name].append(body['alarm_id'])
+ ordered_alarms = []
+ for key in sorted(alarms):
+ ordered_alarms.extend([(key, a) for a in sorted(alarms[key])])
+
+ # Sort by severity and verify
+ sort = ['severity:asc']
+ body = self.alarming_client.list_alarms(sort=sort)
+ self.assertEqual(set(sevs),
+ set([alarm['severity'] for alarm in body if alarm[
+ 'name'].startswith('tempest-sorted_alarms')]))
+ sort = ['severity']
+ body = self.alarming_client.list_alarms(sort=sort)
+ self.assertEqual(set(sevs),
+ set([alarm['severity'] for alarm in body if alarm[
+ 'name'].startswith('tempest-sorted_alarms')]))
+
+ # multiple sorts
+ sort = ['name:asc', 'alarm_id:asc']
+ body = self.alarming_client.list_alarms(sort=sort)
+ name_ids = [(a['name'], a['alarm_id']) for a in body if a[
+ 'name'].startswith('tempest-sorted_alarms')]
+ self.assertEqual(ordered_alarms, name_ids)
+
+ # limit and sort
+ sort = ['name:asc', 'alarm_id:asc']
+ limit = 2
+ body = self.alarming_client.list_alarms(limit=limit)
+ self.assertEqual(2, len(body))
+ body = self.alarming_client.list_alarms(sort=sort, limit=limit)
+ self.assertEqual(2, len(body))
+ self.assertEqual([ordered_alarms[0][0], ordered_alarms[1][0]],
+ [body[0]['name'], body[1]['name']])
+ body = self.alarming_client.list_alarms(
+ sort=sort, marker=ordered_alarms[1][1])
+ name_ids = [(a['name'], a['alarm_id']) for a in body if a[
+ 'name'].startswith('tempest-sorted_alarms')]
+ self.assertEqual(ordered_alarms[2:], name_ids)
+
+ # Delete alarms and verify if deleted
+ for name, alarm_id in ordered_alarms:
+ self.alarming_client.delete_alarm(alarm_id)
+ self.assertRaises(lib_exc.NotFound,
+ self.alarming_client.show_alarm, alarm_id)
diff --git a/telemetry_tempest_plugin/aodh/api/test_alarming_api.py b/telemetry_tempest_plugin/aodh/api/test_alarming_api.py
index fbdaa75..61fbe0e 100644
--- a/telemetry_tempest_plugin/aodh/api/test_alarming_api.py
+++ b/telemetry_tempest_plugin/aodh/api/test_alarming_api.py
@@ -293,31 +293,6 @@
self.assertIn('status', response['versions']['values'][0])
self.assertIn('updated', response['versions']['values'][0])
- @decorators.idempotent_id('a45a95f6-7855-4dbc-a507-af0f48cc3370')
- def test_create_n_delete_alarm_duplicate_actions(self):
- # create dual actions
- alarm_name = data_utils.rand_name('telemetry_alarm')
- rule = {'metrics': ['41869681-5776-46d6-91ed-cccc43b6e4e3',
- 'a1fb80f4-c242-4f57-87c6-68f47521059e'],
- 'aggregation_method': 'mean',
- 'comparison_operator': 'eq',
- 'threshold': 300.0}
- body = self.alarming_client.create_alarm(
- name=alarm_name,
- alarm_actions=['http://no.where', 'http://no.where'],
- type='gnocchi_aggregation_by_metrics_threshold',
- gnocchi_aggregation_by_metrics_threshold_rule=rule
- )
- alarm_id = body['alarm_id']
- alarms = self.alarming_client.list_alarms(['name', 'eq', alarm_name])
- self.assertEqual(1, len(alarms))
- self.assertEqual(['http://no.where'], alarms[0]['alarm_actions'])
-
- # Delete alarm and verify if deleted
- self.alarming_client.delete_alarm(alarm_id)
- self.assertRaises(lib_exc.NotFound,
- self.alarming_client.show_alarm, alarm_id)
-
@decorators.idempotent_id('c1dcefdf-3b96-40d0-8f39-04fc0702ab6b')
def test_create_n_delete_alarm_rule_loadbalancer(self):
# create dual actions
diff --git a/telemetry_tempest_plugin/aodh/api/test_alarming_api_negative.py b/telemetry_tempest_plugin/aodh/api/test_alarming_api_negative.py
index a1bc0d8..794f736 100644
--- a/telemetry_tempest_plugin/aodh/api/test_alarming_api_negative.py
+++ b/telemetry_tempest_plugin/aodh/api/test_alarming_api_negative.py
@@ -66,233 +66,6 @@
query)
@decorators.attr(type=['negative'])
- @decorators.idempotent_id('ef45000d-0a72-4781-866d-4cb7bf2582ae')
- def test_get_update_show_history_delete_deleted_alarm(self):
- # get, update and delete the deleted alarm
- alarm_name = data_utils.rand_name('telemetry_alarm')
- rule = {'metrics': ["c0d457b6-957e-41de-a384-d5eb0957de3b"],
- 'aggregation_method': 'mean',
- 'comparison_operator': 'eq',
- 'threshold': 100.0,
- 'granularity': 90}
- body = self.alarming_client.create_alarm(
- name=alarm_name,
- type='gnocchi_aggregation_by_metrics_threshold',
- gnocchi_aggregation_by_metrics_threshold_rule=rule)
- alarm_id = body['alarm_id']
- self.alarming_client.delete_alarm(alarm_id)
- # get the deleted alarm
- self.assertRaises(lib_exc.NotFound, self.alarming_client.show_alarm,
- alarm_id)
-
- # update the deleted alarm
- updated_alarm_name = data_utils.rand_name('telemetry_alarm_updated')
- updated_rule = {'metrics': ["c0d457b6-957e-41de-a384-d5eb0957de3b"],
- 'comparison_operator': 'eq',
- 'aggregation_method': 'mean',
- 'threshold': 70,
- 'granularity': 50}
- self.assertRaises(
- lib_exc.NotFound, self.alarming_client.update_alarm,
- alarm_id,
- gnocchi_aggregation_by_metrics_threshold_rule=updated_rule,
- name=updated_alarm_name,
- type='gnocchi_aggregation_by_metrics_threshold')
- # delete the deleted alarm
- self.assertRaises(lib_exc.NotFound, self.alarming_client.delete_alarm,
- alarm_id)
-
- @decorators.attr(type=['negative'])
- @decorators.idempotent_id('3bd874d7-dcbf-410e-ab08-829969282d92')
- def test_create_invalid_alarm_constraint_start(self):
- # create bad time constraint
- alarm_name = data_utils.rand_name('telemetry_alarm')
- tc_name = data_utils.rand_name('time_constraint')
- rule = {'metrics': ['41869681-5776-46d6-91ed-cccc43b6e4e3',
- 'a1fb80f4-c242-4f57-87c6-68f47521059e'],
- 'aggregation_method': 'mean',
- 'comparison_operator': 'eq',
- 'threshold': 300.0}
- tc = [{'name': tc_name,
- 'start': '11:00am',
- 'duration': 10}]
- self.assertRaises(
- lib_exc.BadRequest,
- self.alarming_client.create_alarm,
- name=alarm_name,
- type='gnocchi_aggregation_by_metrics_threshold',
- time_constraints=tc,
- gnocchi_aggregation_by_metrics_threshold_rule=rule)
-
- @decorators.skip_because(bug="2045115")
- @decorators.attr(type=['negative'])
- @decorators.idempotent_id('384dec5a-af5b-4a9e-8dc1-9d056fca71d6')
- def test_create_null_alarm_constraint(self):
- # create bad time constraint
- alarm_name = data_utils.rand_name('telemetry_alarm')
- rule = {'metrics': ['41869681-5776-46d6-91ed-cccc43b6e4e3',
- 'a1fb80f4-c242-4f57-87c6-68f47521059e'],
- 'aggregation_method': 'mean',
- 'comparison_operator': 'eq',
- 'threshold': 300.0}
- tc = None
- self.assertRaises(
- lib_exc.BadRequest,
- self.alarming_client.create_alarm,
- name=alarm_name,
- type='gnocchi_aggregation_by_metrics_threshold',
- time_constraints=tc,
- gnocchi_aggregation_by_metrics_threshold_rule=rule)
-
- @decorators.attr(type=['negative'])
- @decorators.idempotent_id('f358ee93-798e-4641-8fdc-13dc2f7a71c5')
- def test_create_duplicate_alarm_constraint_name(self):
- # create bad time constraint
- alarm_name = data_utils.rand_name('telemetry_alarm')
- tc_name = data_utils.rand_name('time_constraint')
- rule = {'metrics': ['41869681-5776-46d6-91ed-cccc43b6e4e3',
- 'a1fb80f4-c242-4f57-87c6-68f47521059e'],
- 'aggregation_method': 'mean',
- 'comparison_operator': 'eq',
- 'threshold': 300.0}
- tc = [{'name': tc_name,
- 'start': '* 11 * * *',
- 'duration': 10},
- {'name': tc_name,
- 'start': '* * * * *',
- 'duration': 20}]
- self.assertRaises(
- lib_exc.BadRequest,
- self.alarming_client.create_alarm,
- name=alarm_name,
- type='gnocchi_aggregation_by_metrics_threshold',
- time_constraints=tc,
- gnocchi_aggregation_by_metrics_threshold_rule=rule)
-
- @decorators.attr(type=['negative'])
- @decorators.idempotent_id('e1d5d605-61a0-415b-bcaf-dc3a15717344')
- def test_create_invalid_alarm_constraint_timezone(self):
- # create bad time constraint
- alarm_name = data_utils.rand_name('telemetry_alarm')
- tc_name = data_utils.rand_name('time_constraint')
- rule = {'metrics': ['41869681-5776-46d6-91ed-cccc43b6e4e3',
- 'a1fb80f4-c242-4f57-87c6-68f47521059e'],
- 'aggregation_method': 'mean',
- 'comparison_operator': 'eq',
- 'threshold': 300.0}
- tc = [{'name': tc_name,
- 'start': '* 11 * * *',
- 'duration': 10,
- 'timezone': 'aaaa'}]
- self.assertRaises(
- lib_exc.BadRequest,
- self.alarming_client.create_alarm,
- name=alarm_name,
- type='gnocchi_aggregation_by_metrics_threshold',
- time_constraints=tc,
- gnocchi_aggregation_by_metrics_threshold_rule=rule)
-
- @decorators.attr(type=['negative'])
- @decorators.idempotent_id('7d3ee20c-8a0f-4a43-8a1a-2168da9905da')
- def test_create_invalid_alarm_constraint_duration(self):
- # create bad time constraint
- alarm_name = data_utils.rand_name('telemetry_alarm')
- tc_name = data_utils.rand_name('time_constraint')
- rule = {'metrics': ['41869681-5776-46d6-91ed-cccc43b6e4e3',
- 'a1fb80f4-c242-4f57-87c6-68f47521059e'],
- 'aggregation_method': 'mean',
- 'comparison_operator': 'eq',
- 'threshold': 300.0}
- tc = [{'name': tc_name,
- 'start': '* 11 * * *',
- 'duration': -10}]
- self.assertRaises(
- lib_exc.BadRequest,
- self.alarming_client.create_alarm,
- name=alarm_name,
- type='gnocchi_aggregation_by_metrics_threshold',
- time_constraints=tc,
- gnocchi_aggregation_by_metrics_threshold_rule=rule)
-
- @decorators.attr(type=['negative'])
- @decorators.idempotent_id('21ab2919-8680-44d8-be90-57aac5b22474')
- def test_create_invalid_alarm_rule_granularity(self):
- # create bad time constraint
- alarm_name = data_utils.rand_name('telemetry_alarm')
- tc_name = data_utils.rand_name('time_constraint')
- rule = {'metrics': ['41869681-5776-46d6-91ed-cccc43b6e4e3',
- 'a1fb80f4-c242-4f57-87c6-68f47521059e'],
- 'aggregation_method': 'mean',
- 'comparison_operator': 'eq',
- 'threshold': 300.0,
- 'granularity': -1}
- tc = [{'name': tc_name,
- 'start': '* 11 * * *',
- 'duration': 10}]
- self.assertRaises(
- lib_exc.BadRequest,
- self.alarming_client.create_alarm,
- name=alarm_name,
- type='gnocchi_aggregation_by_metrics_threshold',
- time_constraints=tc,
- gnocchi_aggregation_by_metrics_threshold_rule=rule)
-
- @decorators.attr(type=['negative'])
- @decorators.idempotent_id('b942eeb3-7fc2-4ba4-ad8f-674f3ac7fb96')
- def test_create_invalid_alarm_none_rule(self):
- # create bad time constraint
- alarm_name = data_utils.rand_name('telemetry_alarm')
- tc_name = data_utils.rand_name('time_constraint')
- rule = None
- tc = [{'name': tc_name,
- 'start': '* 11 * * *',
- 'duration': -10}]
- self.assertRaises(
- lib_exc.BadRequest,
- self.alarming_client.create_alarm,
- name=alarm_name,
- type='gnocchi_aggregation_by_metrics_threshold',
- time_constraints=tc,
- gnocchi_aggregation_by_metrics_threshold_rule=rule)
-
- @decorators.attr(type=['negative'])
- @decorators.idempotent_id('a805f2f3-ea3e-4574-b616-3dbe86cb95f8')
- def test_create_invalid_alarm_input_state(self):
- # create bad time constraint
- alarm_name = data_utils.rand_name('telemetry_alarm')
- rule = {'metrics': ['41869681-5776-46d6-91ed-cccc43b6e4e3',
- 'a1fb80f4-c242-4f57-87c6-68f47521059e'],
- 'aggregation_method': 'mean',
- 'comparison_operator': 'eq',
- 'threshold': 300.0}
- self.assertRaises(
- lib_exc.BadRequest,
- self.alarming_client.create_alarm,
- name=alarm_name,
- state='bad_state',
- type='gnocchi_aggregation_by_metrics_threshold',
- gnocchi_aggregation_by_metrics_threshold_rule=rule)
-
- @decorators.attr(type=['negative'])
- @decorators.idempotent_id('ea90ef4a-135d-48f2-b984-c156a89f627c')
- def test_create_invalid_alarm_input_severity(self):
- # create bad time constraint
- alarm_name = data_utils.rand_name('telemetry_alarm')
- rule = {'metrics': ['41869681-5776-46d6-91ed-cccc43b6e4e3',
- 'a1fb80f4-c242-4f57-87c6-68f47521059e'],
- 'aggregation_method': 'mean',
- 'comparison_operator': 'eq',
- 'threshold': 300.0}
- self.assertRaises(
- lib_exc.BadRequest,
- self.alarming_client.create_alarm,
- name=alarm_name,
- state='ok',
- severity='bad_value',
- type='gnocchi_aggregation_by_metrics_threshold',
- gnocchi_aggregation_by_metrics_threshold_rule=rule)
-
- @decorators.attr(type=['negative'])
@decorators.idempotent_id('7373e681-8e11-4071-a955-aa9582bef914')
def test_create_invalid_alarm_input_type(self):
# create bad time constraint
@@ -311,78 +84,6 @@
bad_type_rule=rule)
@decorators.attr(type=['negative'])
- @decorators.idempotent_id('3af990af-f134-4b87-9234-a25280afc176')
- def test_create_invalid_alarm_input_enabled_string(self):
- # create bad time constraint
- alarm_name = data_utils.rand_name('telemetry_alarm')
- rule = {'metrics': ['41869681-5776-46d6-91ed-cccc43b6e4e3',
- 'a1fb80f4-c242-4f57-87c6-68f47521059e'],
- 'aggregation_method': 'mean',
- 'comparison_operator': 'eq',
- 'threshold': 300.0}
- self.assertRaises(
- lib_exc.BadRequest,
- self.alarming_client.create_alarm,
- name=alarm_name,
- state='ok',
- enabled='bad_value',
- type='gnocchi_aggregation_by_metrics_threshold',
- gnocchi_aggregation_by_metrics_threshold_rule=rule)
-
- @decorators.skip_because(bug="2045118")
- @decorators.attr(type=['negative'])
- @decorators.idempotent_id('db999b7e-3bc8-4be3-90f3-9d0034f61e8a')
- def test_create_invalid_alarm_input_enabled_int(self):
- # create bad time constraint
- alarm_name = data_utils.rand_name('telemetry_alarm')
- rule = {'metrics': ['41869681-5776-46d6-91ed-cccc43b6e4e3',
- 'a1fb80f4-c242-4f57-87c6-68f47521059e'],
- 'aggregation_method': 'mean',
- 'comparison_operator': 'eq',
- 'threshold': 300.0}
- self.assertRaises(
- lib_exc.BadRequest,
- self.alarming_client.create_alarm,
- name=alarm_name,
- state='ok',
- enabled=0,
- type='gnocchi_aggregation_by_metrics_threshold',
- gnocchi_aggregation_by_metrics_threshold_rule=rule)
-
- @decorators.attr(type=['negative'])
- @decorators.idempotent_id('0c64f10f-8529-46a5-9172-f0a64789632f')
- def test_create_invalid_alarm_statistic(self):
- # create bad time constraint
- alarm_name = data_utils.rand_name('telemetry_alarm')
- rule = {'metrics': ['41869681-5776-46d6-91ed-cccc43b6e4e3',
- 'a1fb80f4-c242-4f57-87c6-68f47521059e'],
- 'aggregation_method': 'magic',
- 'comparison_operator': 'gt',
- 'threshold': 2.0}
- self.assertRaises(
- lib_exc.BadRequest,
- self.alarming_client.create_alarm,
- name=alarm_name,
- type='gnocchi_aggregation_by_metrics_threshold',
- gnocchi_aggregation_by_metrics_threshold_rule=rule)
-
- @decorators.attr(type=['negative'])
- @decorators.idempotent_id('0c421fe7-69e9-4a7c-9df0-547f7bc4c91a')
- def test_create_invalid_alarm_com_op(self):
- # create bad time constraint
- alarm_name = data_utils.rand_name('telemetry_alarm')
- rule = {'metrics': ['41869681-5776-46d6-91ed-cccc43b6e4e3',
- 'a1fb80f4-c242-4f57-87c6-68f47521059e'],
- 'comparison_operator': 'bd_co',
- 'threshold': 20.0}
- self.assertRaises(
- lib_exc.BadRequest,
- self.alarming_client.create_alarm,
- name=alarm_name,
- type='gnocchi_aggregation_by_metrics_threshold',
- gnocchi_aggregation_by_metrics_threshold_rule=rule)
-
- @decorators.attr(type=['negative'])
@decorators.idempotent_id('6d3f39dd-64ee-438d-804e-f193dc2c7d4b')
def test_list_invalid_project(self):
# Get invalid paths
@@ -402,129 +103,6 @@
alarm_id=alarm_id)
@decorators.attr(type=['negative'])
- @decorators.idempotent_id('5bbccedd-dd80-462c-a6da-d796d7667b5e')
- def test_create_alarm_wsme_workaround(self):
- # create bad time constraint
- alarm_name = data_utils.rand_name('telemetry_alarm')
- rule_key = 'gnocchi_aggregation_by_metrics_threshold_rule'
- rules = {
- 'type': {
- 'name': alarm_name,
- rule_key: {
- 'metrics': ['41869681-5776-46d6-91ed-cccc43b6e4e3',
- 'a1fb80f4-c242-4f57-87c6-68f47521059e'],
- 'aggregation_method': 'mean',
- 'threshold': 2.0,
- }
- },
- 'name': {
- 'type': 'gnocchi_aggregation_by_metrics_threshold',
- rule_key: {
- 'metrics': ['41869681-5776-46d6-91ed-cccc43b6e4e3',
- 'a1fb80f4-c242-4f57-87c6-68f47521059e'],
- 'aggregation_method': 'mean',
- 'threshold': 2.0,
- }
- },
- 'threshold_rule/metrics': {
- 'name': alarm_name,
- 'type': 'gnocchi_aggregation_by_metrics_threshold',
- rule_key: {
- 'aggregation_method': 'mean',
- 'threshold': 2.0,
- }
- },
- 'threshold_rule/threshold': {
- 'name': alarm_name,
- 'type': 'gnocchi_aggregation_by_metrics_threshold',
- rule_key: {
- 'metrics': ['41869681-5776-46d6-91ed-cccc43b6e4e3',
- 'a1fb80f4-c242-4f57-87c6-68f47521059e'],
- 'aggregation_method': 'mean',
- }
- },
- }
-
- for field, adef in rules.items():
- self.assertRaises(
- lib_exc.BadRequest,
- self.alarming_client.create_alarm,
- name=getattr(adef, 'name', None),
- type=getattr(adef, 'type', None),
- gnocchi_aggregation_by_metrics_threshold_rule=adef[rule_key]
- )
-
- def _do_create_alarm_invalid_action(self, ok_actions=None,
- alarm_actions=None,
- insufficient_data_actions=None,
- error_message=None):
-
- ok_actions = ok_actions or []
- alarm_actions = alarm_actions or []
- insufficient_data_actions = insufficient_data_actions or []
- rule_key = 'gnocchi_aggregation_by_metrics_threshold_rule'
- alarm_name = data_utils.rand_name('telemetry_alarm')
- adef = {
- 'enabled': False,
- 'state': 'ok',
- 'type': 'gnocchi_aggregation_by_metrics_threshold',
- 'ok_actions': ok_actions,
- 'alarm_actions': alarm_actions,
- 'insufficient_data_actions': insufficient_data_actions,
- 'repeat_actions': True,
- rule_key: {
- 'metrics': ['41869681-5776-46d6-91ed-cccc43b6e4e3',
- 'a1fb80f4-c242-4f57-87c6-68f47521059e'],
- 'comparison_operator': 'le',
- 'aggregation_method': 'count',
- 'threshold': 50,
- 'evaluation_periods': '3',
- 'granularity': '180',
- }
- }
- self.assertRaises(
- lib_exc.BadRequest,
- self.alarming_client.create_alarm,
- name=alarm_name,
- type=adef['type'],
- enabled=adef['enabled'],
- state=adef['state'],
- ok_actions=adef['ok_actions'],
- alarm_actions=adef['alarm_actions'],
- insufficient_data_actions=adef['insufficient_data_actions'],
- repeat_actions=adef['repeat_actions'],
- gnocchi_aggregation_by_metrics_threshold_rule=adef[rule_key])
-
- @decorators.attr(type=['negative'])
- @decorators.idempotent_id('95e505c3-51e0-4ac8-8e75-6dfb5828fcd2')
- def test_create_invalid_alarm_ok_actions(self):
- self._do_create_alarm_invalid_action(
- ok_actions=['spam://something/ok'],
- error_message='Unsupported action spam://something/ok')
-
- @decorators.skip_because(bug="2045116")
- @decorators.attr(type=['negative'])
- @decorators.idempotent_id('4b2b7be0-9d13-4e36-ad28-d11c5aa06411')
- def test_create_invalid_alarm_too_many_actions(self):
- self._do_create_alarm_invalid_action(
- ok_actions=['http://no.where', 'http://no.where2'],
- error_message="alarm_actions count exceeds maximum value 1")
-
- @decorators.attr(type=['negative'])
- @decorators.idempotent_id('2332b637-8193-448c-8b37-e0b6a6fded34')
- def test_post_invalid_alarm_alarm_actions(self):
- self._do_create_alarm_invalid_action(
- alarm_actions=['spam://something/alarm'],
- error_message='Unsupported action spam://something/alarm')
-
- @decorators.attr(type=['negative'])
- @decorators.idempotent_id('78029ec7-cb70-4f89-a1b6-df235d6688b6')
- def test_post_invalid_alarm_insufficient_data_actions(self):
- self._do_create_alarm_invalid_action(
- insufficient_data_actions=['spam://something/insufficient'],
- error_message='Unsupported action spam://something/insufficient')
-
- @decorators.attr(type=['negative'])
@decorators.idempotent_id('350dae2b-8720-48ae-b3a6-d92dbba55d07')
def test_list_invalid_sort_key(self):
# list with invalid sort key
@@ -532,49 +110,3 @@
lib_exc.BadRequest,
self.alarming_client.list_alarms,
sort=['invalid_key:asc'])
-
- @decorators.attr(type='negative')
- @decorators.idempotent_id('32bbc39e-7423-4309-acf9-39ff584764fc')
- def test_create_update_with_faults_delete_alarm(self):
- # create dual actions
- alarm_name = data_utils.rand_name('telemetry_alarm')
- rule = {'metrics': ['41869681-5776-46d6-91ed-cccc43b6e4e3',
- 'a1fb80f4-c242-4f57-87c6-68f47521059e'],
- 'aggregation_method': 'mean',
- 'comparison_operator': 'eq',
- 'threshold': 300.0}
- body = self.alarming_client.create_alarm(
- name=alarm_name,
- alarm_actions=['http://no.where'],
- type='gnocchi_aggregation_by_metrics_threshold',
- gnocchi_aggregation_by_metrics_threshold_rule=rule
- )
- alarm_id = body['alarm_id']
- alarms = self.alarming_client.list_alarms(['name', 'eq', alarm_name])
- self.assertEqual(1, len(alarms))
-
- # update the alarm with wrong fields.
- self.assertRaises(
- lib_exc.BadRequest,
- self.alarming_client.update_alarm,
- alarm_id=alarm_id,
- this_can_not_be_correct='ha')
-
- # update the alarm with invalid action
- self.assertRaises(
- lib_exc.BadRequest,
- self.alarming_client.update_alarm,
- alarm_id=alarm_id,
- ok_actions='spam://something/ok')
-
- # update the alarm with invalid state
- self.assertRaises(
- lib_exc.BadRequest,
- self.alarming_client.alarm_set_state,
- alarm_id=alarm_id,
- state='not valid')
-
- # Delete alarm and verify if deleted
- self.alarming_client.delete_alarm(alarm_id)
- self.assertRaises(lib_exc.NotFound,
- self.alarming_client.show_alarm, alarm_id)
diff --git a/telemetry_tempest_plugin/config.py b/telemetry_tempest_plugin/config.py
index 7546834..94b6e1b 100644
--- a/telemetry_tempest_plugin/config.py
+++ b/telemetry_tempest_plugin/config.py
@@ -30,15 +30,20 @@
cfg.BoolOpt('gnocchi',
default=True,
help="Whether or not Gnocchi is expected to be"
- "available"),
+ "available",
+ deprecated_for_removal=True),
cfg.BoolOpt('sg_core',
default=False,
help="Whether or not sg-core is expected to be"
- "available")]
+ "available",
+ deprecated_for_removal=True)]
telemetry_group = cfg.OptGroup(name='telemetry',
title='Telemetry Service Options')
+telemetry_services_group = cfg.OptGroup(name='telemetry_services',
+ title='Telemetry Services')
+
event_group = cfg.OptGroup(name='event',
title='Event Service Options')
@@ -80,6 +85,21 @@
]
+telemetry_services_opts = [
+ cfg.BoolOpt('aodh_gnocchi',
+ default=False,
+ help="Can telemetry plugin expect gnocchi backend"),
+ cfg.BoolOpt('aodh_mysql',
+ default=False,
+ help="Can telemetry plugin expect mysql backend"),
+ cfg.BoolOpt('aodh_postgre',
+ default=False,
+ help="Can telemetry plugin expect postgre backend"),
+ cfg.BoolOpt('aodh_prometheus',
+ default=False,
+ help="Can telemetry plugin expect prometheus backend"),
+]
+
event_opts = [
cfg.StrOpt('catalog_type',
default='event',
diff --git a/telemetry_tempest_plugin/plugin.py b/telemetry_tempest_plugin/plugin.py
index 2f2861e..51c40f9 100644
--- a/telemetry_tempest_plugin/plugin.py
+++ b/telemetry_tempest_plugin/plugin.py
@@ -38,6 +38,9 @@
conf, tempest_config.telemetry_group,
tempest_config.TelemetryGroup)
config.register_opt_group(
+ conf, tempest_config.telemetry_services_group,
+ tempest_config.telemetry_services_opts)
+ config.register_opt_group(
conf, tempest_config.event_group,
tempest_config.event_opts)
config.register_opt_group(
@@ -50,6 +53,8 @@
def get_opt_lists(self):
return [(tempest_config.telemetry_group.name,
tempest_config.TelemetryGroup),
+ (tempest_config.telemetry_services_group.name,
+ tempest_config.telemetry_services_opts),
(tempest_config.event_group.name,
tempest_config.event_opts),
(config.service_available_group.name,