diff --git a/monasca_notification/plugins/hipchat_notifier.py b/monasca_notification/plugins/hipchat_notifier.py index 203c781..c1ca082 100644 --- a/monasca_notification/plugins/hipchat_notifier.py +++ b/monasca_notification/plugins/hipchat_notifier.py @@ -36,6 +36,11 @@ from monasca_notification.plugins import abstract_notifier """ +SEVERITY_COLORS = {"low": 'green', + 'medium': 'gray', + 'high': 'yellow', + 'critical': 'red'} + class HipChatNotifier(abstract_notifier.AbstractNotifier): def __init__(self, log): @@ -68,12 +73,15 @@ class HipChatNotifier(abstract_notifier.AbstractNotifier): 'metrics': notification.metrics} hipchat_request = {} - hipchat_request['color'] = 'green' + hipchat_request['color'] = self._get_color(notification.severity.lower()) hipchat_request['message_format'] = 'text' hipchat_request['message'] = json.dumps(body, indent=3) return hipchat_request + def _get_color(self, severity): + return SEVERITY_COLORS.get(severity, 'purple') + def send_notification(self, notification): """Send the notification via hipchat Posts on the given url @@ -109,9 +117,9 @@ class HipChatNotifier(abstract_notifier.AbstractNotifier): self._log.info("Notification successfully posted.") return True else: - msg = "Received an HTTP code {} when trying to send to hipchat on URL {} with response {} ." + msg = "Received an HTTP code {} when trying to send to hipchat on URL {} with response {}." self._log.error(msg.format(result.status_code, url, result.text)) return False except Exception: - self._log.exception("Error trying to send to hipchat on URL {}".format(url)) + self._log.exception("Error trying to send to hipchat on URL {}".format(url)) return False diff --git a/tests/test_hipchat_notification.py b/tests/test_hipchat_notification.py new file mode 100644 index 0000000..952fdaa --- /dev/null +++ b/tests/test_hipchat_notification.py @@ -0,0 +1,104 @@ +# 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 json +import mock +import Queue +import unittest + +from monasca_notification import notification as m_notification +from monasca_notification.plugins import hipchat_notifier + + +def alarm(metrics): + return {"tenantId": "0", + "alarmId": "0", + "alarmDefinitionId": 0, + "alarmName": "test Alarm", + "alarmDescription": "test Alarm description", + "oldState": "OK", + "newState": "ALARM", + "severity": "CRITICAL", + "link": "some-link", + "lifecycleState": "OPEN", + "stateChangeReason": "I am alarming!", + "timestamp": 1429023453632, + "metrics": metrics} + + +class requestsResponse(object): + def __init__(self, status): + self.status_code = status + + +class TestHipchat(unittest.TestCase): + def setUp(self): + self.trap = Queue.Queue() + self.hipchat_config = {'timeout': 50} + + def tearDown(self): + self.assertTrue(self.trap.empty()) + + def _http_post_200(self, url, data, **kwargs): + self.trap.put(url) + self.trap.put(data) + r = requestsResponse(200) + return r + + @mock.patch('monasca_notification.plugins.hipchat_notifier.requests') + def notify(self, http_func, mock_requests): + mock_log = mock.MagicMock() + mock_log.warn = self.trap.put + mock_log.error = self.trap.put + mock_log.exception = self.trap.put + + mock_requests.post = http_func + + hipchat = hipchat_notifier.HipChatNotifier(mock_log) + + hipchat.config(self.hipchat_config) + + metric = [] + metric_data = {'dimensions': {'hostname': 'foo1', 'service': 'bar1'}} + metric.append(metric_data) + + alarm_dict = alarm(metric) + + notification = m_notification.Notification(0, 'hipchat', 'hipchat notification', + 'http://mock:3333/', 0, 0, alarm_dict) + + self.trap.put(hipchat.send_notification(notification)) + + def test_hipchat_success(self): + """hipchat success + """ + self.notify(self._http_post_200) + + url = self.trap.get(timeout=1) + data = self.trap.get(timeout=1) + + self.valid_hipchat_message(url, data) + + return_value = self.trap.get() + self.assertTrue(return_value) + + def valid_hipchat_message(self, url, data): + self.assertEqual(url, "http://mock:3333/") + + self.assertEqual(data.get('color'), 'red') + self.assertEqual(data.get('message_format'), 'text') + + message = json.loads(data.get('message')) + self.assertEqual(message.get('message'), 'I am alarming!') + self.assertEqual(message.get('alarm_name'), 'test Alarm') + self.assertEqual(message.get('alarm_description'), 'test Alarm description')