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 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)

        email.config(self.email_config)

        alarm_dict = alarm(metric)

        notification = Notification('email', 0, 1, 'email notification',
                                    '*****@*****.**', 0, alarm_dict)

        self.trap.append(email.send_notification(notification))
    def test_smtp_sendmail_smtp_None(self, mock_smtp):
        """Email that fails on smtp_connect twice
        """

        metrics = []
        metric_data = {'dimensions': {'hostname': 'foo1', 'service': 'bar1'}}
        metrics.append(metric_data)
        metric_data = {'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(self.email_config)

        del self.trap[:]

        alarm_dict = alarm(metrics)

        notification = Notification('email', 0, 1, 'email notification',
                                    '*****@*****.**', 0, alarm_dict)

        email_result = email.send_notification(notification)

        self.assertFalse(email_result)
        self.assertIn(
            "Connecting to Email Server {}".format(
                self.email_config['server']), self.trap)
    def test_smtp_sendmail_failed_connection_twice(self, mock_smtp):
        """Email that fails on smtp_connect twice
        """

        metrics = []
        metric_data = {'dimensions': {'hostname': 'foo1', 'service': 'bar1'}}
        metrics.append(metric_data)
        metric_data = {'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(self.email_config)

        alarm_dict = alarm(metrics)

        notification = Notification('email', 0, 1, 'email notification',
                                    '*****@*****.**', 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)