diff --git a/aodhclient/tests/unit/test_alarm_cli.py b/aodhclient/tests/unit/test_alarm_cli.py new file mode 100644 index 0000000..f09ffee --- /dev/null +++ b/aodhclient/tests/unit/test_alarm_cli.py @@ -0,0 +1,204 @@ +# +# Copyright IBM 2016. 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. + +import argparse + +import mock +import testtools + +from aodhclient.v2 import alarm_cli + + +class CliAlarmListTest(testtools.TestCase): + + def test_get_columns(self): + expected_value = 'gnocchi_resources_threshold_rule' + result = alarm_cli.CliAlarmList.get_columns( + 'gnocchi_resources_threshold') + self.assertIn(expected_value, result) + + +class CliAlarmCreateTest(testtools.TestCase): + + def setUp(self): + super(CliAlarmCreateTest, self).setUp() + self.app = mock.Mock() + self.parser = mock.Mock() + self.cli_alarm_create = ( + alarm_cli.CliAlarmCreate(self.app, self.parser)) + + @mock.patch.object(argparse.ArgumentParser, 'error') + def test_validate_args_gnocchi_resources_threshold(self, mock_arg): + # Cover the test case of the method _validate_args for + # gnocchi_resources_threshold + parser = self.cli_alarm_create.get_parser('aodh alarm create') + test_parsed_args = parser.parse_args([ + '--name', 'gnocchi_resources_threshold_test', + '--type', 'gnocchi_resources_threshold', + '--metric', 'cpu' + '--aggregation_method', 'last', + '--resource_type', 'generic', + '--threshold', '80' + ]) + self.cli_alarm_create._validate_args(test_parsed_args) + mock_arg.assert_called_with( + 'gnocchi_resources_threshold requires --metric' + ', --threshold, --resource-id, --resource-type ' + 'and --aggregation-method') + + @mock.patch.object(argparse.ArgumentParser, 'error') + def test_validate_args_threshold(self, mock_arg): + # Cover the test case of the method _validate_args for + # threshold + parser = self.cli_alarm_create.get_parser('aodh alarm create') + test_parsed_args = parser.parse_args([ + '--name', 'threshold_test', + '--type', 'threshold', + '--threshold', '80' + ]) + self.cli_alarm_create._validate_args(test_parsed_args) + mock_arg.assert_called_with( + 'threshold requires --meter-name and ' + '--threshold') + + @mock.patch.object(argparse.ArgumentParser, 'error') + def test_validate_args_gno_agg_by_resources_threshold(self, mock_arg): + # Cover the test case of the method _validate_args for + # gnocchi_aggregation_by_resources_threshold + parser = self.cli_alarm_create.get_parser('aodh alarm create') + test_parsed_args = parser.parse_args([ + '--name', 'gnocchi_aggregation_by_resources_threshold_test', + '--type', 'gnocchi_aggregation_by_resources_threshold', + '--metric', 'cpu', + '--aggregation_method', 'last', + '--resource_type', 'generic', + '--threshold', '80' + ]) + self.cli_alarm_create._validate_args(test_parsed_args) + mock_arg.assert_called_with( + 'gnocchi_aggregation_by_resources_threshold' + ' requires --metric, --threshold, ' + '--aggregation-method, --query and' + ' --resource_type') + + @mock.patch.object(argparse.ArgumentParser, 'error') + def test_validate_args_gno_agg_by_metrics_threshold(self, mock_arg): + # Cover the test case of the method _validate_args for + # gnocchi_aggregation_by_metrics_threshold + parser = self.cli_alarm_create.get_parser('aodh alarm create') + test_parsed_args = parser.parse_args([ + '--name', 'gnocchi_aggregation_by_metrics_threshold_test', + '--type', 'gnocchi_aggregation_by_metrics_threshold', + '--resource_type', 'generic', + '--threshold', '80' + ]) + self.cli_alarm_create._validate_args(test_parsed_args) + mock_arg.assert_called_with( + 'gnocchi_aggregation_by_metrics_threshold' + ' requires --metrics, --threshold and ' + '--aggregation-method') + + def test_alarm_from_args(self): + # The test case to cover the method _alarm_from_args + parser = self.cli_alarm_create.get_parser('aodh alarm create') + test_parsed_args = parser.parse_args([ + '--type', 'threshold', + '--name', 'alarm_from_args_test', + '--project-id', '01919bbd-8b0e-451c-be28-abe250ae9b1b', + '--user-id', '01919bbd-8b0e-451c-be28-abe250ae9c1c', + '--description', 'For Test', + '--state', 'ok', + '--severity', 'critical', + '--enabled', 'True', + '--alarm-action', 'http://something/alarm', + '--ok-action', 'http://something/ok', + '--repeat-action', 'True', + '--insufficient-data-action', + 'http://something/insufficient', + '--time-constraint', '', + '--meter-name', 'cpu', + '--period', '60', + '--evaluation-periods', '60', + '--statistic', 'max', + '--comparison-operator', 'le', + '--threshold', '80', + '--event-type', 'event', + '--query', '{}', + '--granularity', '60', + '--aggregation-method', 'last', + '--metric', 'cpu', + '--resource-id', '01919bbd-8b0e-451c-be28-abe250ae9c1c', + '--resource-type', 'generic' + ]) + + # Output for the test + alarm = { + 'name': 'alarm_from_args_test', + 'project_id': '01919bbd-8b0e-451c-be28-abe250ae9b1b', + 'user_id': '01919bbd-8b0e-451c-be28-abe250ae9c1c', + 'description': 'For Test', + 'state': 'ok', + 'severity': 'critical', + 'enabled': True, + 'alarm_actions': ['http://something/alarm'], + 'ok_actions': ['http://something/ok'], + 'insufficient_data_actions': + ['http://something/insufficient'], + 'time_constraints': [''], + 'repeat_actions': True, + 'threshold_rule': { + 'meter_name': 'cpu', + 'period': 60, + 'evaluation_periods': 60, + 'statistic': 'max', + 'comparison_operator': 'le', + 'threshold': 80.0, + 'query': '{}' + }, + 'event_rule': { + 'event_type': 'event', + 'query': '{}' + }, + 'gnocchi_resources_threshold_rule': { + 'granularity': '60', + 'metric': 'cpu', + 'aggregation_method': 'last', + 'evaluation_periods': 60, + 'resource_id': '01919bbd-8b0e-451c-be28-abe250ae9c1c', + 'comparison_operator': 'le', + 'threshold': 80.0, + 'resource_type': 'generic' + }, + 'gnocchi_aggregation_by_metrics_threshold_rule': { + 'granularity': '60', + 'aggregation_method': 'last', + 'evaluation_periods': 60, + 'comparison_operator': 'le', + 'threshold': 80.0 + }, + 'gnocchi_aggregation_by_resources_threshold_rule': { + 'granularity': '60', + 'metric': 'cpu', + 'aggregation_method': 'last', + 'evaluation_periods': 60, + 'comparison_operator': 'le', + 'threshold': 80.0, + 'query': '{}', + 'resource_type': 'generic' + }, + 'type': 'threshold' + } + alarm_rep = self.cli_alarm_create._alarm_from_args(test_parsed_args) + self.assertEqual(alarm, alarm_rep) diff --git a/aodhclient/tests/unit/test_alarm_manager.py b/aodhclient/tests/unit/test_alarm_manager.py new file mode 100644 index 0000000..48d26c3 --- /dev/null +++ b/aodhclient/tests/unit/test_alarm_manager.py @@ -0,0 +1,85 @@ +# +# Copyright IBM 2016. 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. + +import mock +import testtools + +from aodhclient.v2 import alarm + + +class AlarmManagerTest(testtools.TestCase): + + def setUp(self): + super(AlarmManagerTest, self).setUp() + self.client = mock.Mock() + self.alarms = { + 'event_alarm': { + 'gnocchi_aggregation_by_metrics_threshold_rule': {}, + 'gnocchi_resources_threshold_rule': {}, + 'name': 'event_alarm', + 'threshold_rule': {}, + 'gnocchi_aggregation_by_resources_threshold_rule': {}, + 'event_rule': {}, + 'type': 'event'} + } + self.results = { + "result1": { + "event_rule": {} + }, + } + + @mock.patch.object(alarm.AlarmManager, '_get') + def test_list(self, mock_am): + am = alarm.AlarmManager(self.client) + am.list('event') + mock_am.assert_called_with( + 'v2/alarms?q.field=type&q.op=eq&q.value=event') + + @mock.patch.object(alarm.AlarmManager, '_get') + def test_get(self, mock_am): + am = alarm.AlarmManager(self.client) + am.get('01919bbd-8b0e-451c-be28-abe250ae9b1b') + mock_am.assert_called_with( + 'v2/alarms/01919bbd-8b0e-451c-be28-abe250ae9b1b') + + @mock.patch.object(alarm.AlarmManager, '_delete') + def test_delete(self, mock_am): + am = alarm.AlarmManager(self.client) + am.delete('01919bbd-8b0e-451c-be28-abe250ae9b1b') + mock_am.assert_called_with( + 'v2/alarms/01919bbd-8b0e-451c-be28-abe250ae9b1b') + + def test_clean_rules_event_alarm(self): + am = alarm.AlarmManager(self.client) + alarm_value = self.alarms.get('event_alarm') + am._clean_rules('event', alarm_value) + alarm_value.pop('type') + alarm_value.pop('name') + result = self.results.get("result1") + self.assertEqual(alarm_value, result) + + @mock.patch.object(alarm.AlarmManager, '_post') + def test_search(self, mock_am): + am = alarm.AlarmManager(self.client) + query = '{"=": {"type": "event"}}' + am.search(query) + url = 'v2/query/alarms' + expected_value = ('{"filter": "{\\"=\\": {\\"type\\":' + ' \\"event\\"}}"}') + headers_value = {'Content-Type': "application/json"} + mock_am.assert_called_with( + url, + data=expected_value, + headers=headers_value)