Пример #1
0
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))
Пример #5
0
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)