def init(statsd_obj): global statsd, statsd_timer statsd = statsd_obj statsd_timer = statsd.get_timer() possible_notifiers.append(email_notifier.EmailNotifier(log)) possible_notifiers.append(webhook_notifier.WebhookNotifier(log)) possible_notifiers.append(pagerduty_notifier.PagerdutyNotifier(log))
def test_smtp_sendmail_failed_connection_twice(self, mock_smtp): """Email that fails on smtp_connect twice """ metrics = [] metric_data = { 'name': 'cpu.percent', 'dimensions': { 'hostname': 'foo1', 'service': 'bar1' } } metrics.append(metric_data) metric_data = { 'name': 'cpu.percent', 'dimensions': { 'hostname': 'foo2', 'service': 'bar2' } } metrics.append(metric_data) mock_log = mock.MagicMock() mock_log.warn = self.trap.append mock_log.error = self.trap.append mock_log.debug = self.trap.append mock_log.info = self.trap.append mock_log.exception = self.trap.append # mock_smtp.SMTP.return_value = mock_smtp mock_smtp.SMTP.side_effect = [ mock_smtp, smtplib.SMTPServerDisconnected, socket.error ] mock_smtp.sendmail.side_effect = [ smtplib.SMTPServerDisconnected, smtplib.SMTPServerDisconnected ] # There has to be a better way to preserve exception definitions when # we're mocking access to a library mock_smtp.SMTPServerDisconnected = smtplib.SMTPServerDisconnected mock_smtp.SMTPException = smtplib.SMTPException email = email_notifier.EmailNotifier(mock_log) email.config() alarm_dict = alarm(metrics) notification = Notification(0, 'email', 'email notification', '*****@*****.**', 0, 0, alarm_dict) self.trap.append(email.send_notification(notification)) self.assertIn( "SMTP server disconnected. Will reconnect and retry message.", self.trap) self.assertIn("Unable to connect to email server.", self.trap)
def test_smtp_sendmail_smtp_None(self, mock_smtp): """Email that fails on smtp_connect twice """ metrics = [] metric_data = { 'name': 'cpu.percent', 'dimensions': { 'hostname': 'foo1', 'service': 'bar1' } } metrics.append(metric_data) metric_data = { 'name': 'cpu.percent', 'dimensions': { 'hostname': 'foo2', 'service': 'bar2' } } metrics.append(metric_data) mock_log = mock.MagicMock() mock_log.warn = self.trap.append mock_log.error = self.trap.append mock_log.debug = self.trap.append mock_log.info = self.trap.append mock_log.exception = self.trap.append mock_smtp.SMTP.return_value = None mock_smtp.SMTP.side_effect = [socket.error, socket.error, socket.error] mock_smtp.sendmail.side_effect = [ smtplib.SMTPServerDisconnected, smtplib.SMTPServerDisconnected ] # There has to be a better way to preserve exception definitions when # we're mocking access to a library mock_smtp.SMTPServerDisconnected = smtplib.SMTPServerDisconnected mock_smtp.SMTPException = smtplib.SMTPException email = email_notifier.EmailNotifier(mock_log) email.config() del self.trap[:] alarm_dict = alarm(metrics) notification = Notification(0, 'email', 'email notification', '*****@*****.**', 0, 0, alarm_dict) email_result = email.send_notification(notification) self.assertFalse(email_result) self.assertIn("Connecting to Email Server my.smtp.server", self.trap)
def notify(self, smtp_stub, metric, mock_smtp): mock_smtp.SMTP = smtp_stub mock_log = mock.MagicMock() mock_log.warn = self.trap.append mock_log.error = self.trap.append email = email_notifier.EmailNotifier(mock_log) alarm_dict = alarm(metric) notification = Notification(0, 'email', 'email notification', '*****@*****.**', 0, 0, alarm_dict) self.trap.append(email.send_notification(notification))
def init(statsd_obj): global statsd, statsd_timer, \ possible_notifiers, configured_notifiers,\ statsd_counter statsd = statsd_obj statsd_timer = statsd.get_timer() statsd_counter = {} configured_notifiers = {} possible_notifiers = [ email_notifier.EmailNotifier(log), webhook_notifier.WebhookNotifier(log), pagerduty_notifier.PagerdutyNotifier(log) ]
def test_get_link_url(self, mock_smtp): # Given one metric with name and dimensions metrics = [] metric = { 'name': 'cpu.percent', 'dimensions': { 'hostname': 'foo1', 'service': 'bar1' } } metrics.append(metric) mock_log = mock.MagicMock() mock_log.warn = self.trap.append mock_log.error = self.trap.append mock_log.debug = self.trap.append mock_log.info = self.trap.append mock_log.exception = self.trap.append mock_smtp.SMTP.return_value = mock_smtp mock_smtp.sendmail.side_effect = smtplib.SMTPException mock_smtp.SMTPServerDisconnected = smtplib.SMTPServerDisconnected mock_smtp.SMTPException = smtplib.SMTPException email = email_notifier.EmailNotifier(mock_log) # Create alarm timestamp and timestamp for 'from' and 'to' dates in milliseconds. alarm_date = datetime.datetime(2017, 6, 7, 18, 0) alarm_ms, expected_from_ms, expected_to_ms = self.create_time_data( alarm_date) # When retrieving the link to Grafana for the first metric and given timestamp result_url = email._get_link_url(metrics[0], alarm_ms) self.assertIsNotNone(result_url) # Then the following link to Grafana (including the metric info and timestamp) is expected. expected_url = "http://127.0.0.1:3000/dashboard/script/drilldown.js" \ "?metric=cpu.percent&dim_hostname=foo1&dim_service=bar1" \ "&from=%s&to=%s" % (expected_from_ms, expected_to_ms) self._assert_equal_urls(expected_url, result_url)