def test_email_address_deletion_on_disabling_monitoring(self, mock_newrelic, mock_consul):
     """
     Check that the `disable_monitoring` method removes all the notification email addresses for an instance
     except the shared email addresses.
     """
     monitor_ids = [str(uuid4()) for i in range(4)]
     instance = OpenEdXInstanceFactory()
     mock_newrelic.get_synthetics_notification_emails.return_value = []
     mock_newrelic.create_synthetics_monitor.side_effect = monitor_ids
     ssl_monitor_ids = [str(uuid4()) for i in range(4)]
     mock_newrelic.create_synthetics_ssl_monitor.side_effect = ssl_monitor_ids
     mock_newrelic.add_alert_policy.return_value = 1
     mock_newrelic.add_alert_nrql_condition.side_effect = list(range(8))
     mock_newrelic.add_email_notification_channel.return_value = 1
     instance.new_relic_alert_policy = NewRelicAlertPolicy.objects.create(id=1, instance=instance)
     instance.new_relic_alert_policy.email_notification_channels.add(
         NewRelicEmailNotificationChannel.objects.create(id=10, email='*****@*****.**', shared=True)
     )
     instance.additional_monitoring_emails = ['*****@*****.**']
     instance.enable_monitoring()
     self.assertEqual(
         NewRelicEmailNotificationChannel.objects.filter(
             email__in=['*****@*****.**', '*****@*****.**']
         ).count(),
         2
     )
     instance.disable_monitoring()
     with self.assertRaises(NewRelicEmailNotificationChannel.DoesNotExist):
         NewRelicEmailNotificationChannel.objects.get(email='*****@*****.**')
     NewRelicEmailNotificationChannel.objects.get(email='*****@*****.**')
    def test_long_monitoring_condition_names(self, additional_emails, expected_emails, mock_newrelic, mock_consul):
        """
        Check that the `enable_monitoring` method creates New Relic Synthetics
        monitors for each of the instance's public urls, and enables email
        alerts even for those instance names which has extremely long names.
        """
        monitor_ids = [str(uuid4()) for i in range(4)]
        mock_newrelic.get_synthetics_monitor.return_value = []
        mock_newrelic.get_synthetics_notification_emails.return_value = []
        mock_newrelic.create_synthetics_monitor.side_effect = monitor_ids
        mock_newrelic.add_alert_policy.return_value = 1
        mock_newrelic.add_alert_nrql_condition.side_effect = list(range(4))
        mock_newrelic.add_email_notification_channel.side_effect = list(range(len(expected_emails)))
        instance = OpenEdXInstanceFactory()
        instance.name += " long" * 15  # Generate a very long instance name
        instance.additional_monitoring_emails = additional_emails
        instance.enable_monitoring()

        # Check that the monitors have been created
        mock_newrelic.delete_synthetics_monitor.assert_not_called()
        mock_newrelic.create_synthetics_monitor.assert_has_calls([
            call(instance.url),
            call(instance.studio_url),
            call(instance.lms_preview_url),
            call(instance.lms_extended_heartbeat_url),
        ], any_order=True)
        self.assertCountEqual(
            instance.new_relic_availability_monitors.values_list('pk', flat=True),
            monitor_ids
        )

        # Check that alert emails have been set up
        created_condition_urls = set()
        created_condition_names = set()
        list_of_emails_added = []

        for add_call in mock_newrelic.add_alert_nrql_condition.call_args_list:
            created_condition_urls.add(add_call[0][1])
            created_condition_names.add(add_call[0][2])

        for add_call in mock_newrelic.add_email_notification_channel.call_args_list:
            list_of_emails_added.append(add_call[0][0])

        for condition_name in created_condition_names:
            self.assertTrue(condition_name.endswith("..."))
            self.assertLessEqual(len(condition_name), 64)

        self.assertEqual(created_condition_urls, set([
            instance.url,
            instance.studio_url,
            instance.lms_preview_url,
            instance.lms_extended_heartbeat_url,
        ]))
        self.assertEqual(set(list_of_emails_added), set(expected_emails))
        mock_newrelic.add_notification_channels_to_policy.assert_called_with(1, list(range(len(expected_emails))))
示例#3
0
    def test_update_monitoring_additional_email(self, mock_newrelic,
                                                mock_consul):
        """
        Check that the `enable_monitoring` method will add new
        'additional_monitoring_emails' to the existing monitors.
        """
        instance = OpenEdXInstanceFactory()
        existing_monitor_ids = [str(uuid4()) for i in range(4)]
        existing_monitors = {}
        existing_monitor_urls = [
            instance.url, instance.studio_url, instance.lms_preview_url,
            instance.lms_extended_heartbeat_url
        ]
        for i in range(4):
            new_id = existing_monitor_ids[i]
            instance.new_relic_availability_monitors.create(pk=new_id)
            existing_monitors[new_id] = {
                'id': new_id,
                'uri': existing_monitor_urls[i]
            }

        def mock_get_synthetics_monitor(monitor_id):
            """ Mock for get_synthetics_monitor() """
            return existing_monitors[monitor_id]

        ssl_monitor_ids = [str(uuid4()) for i in range(4)]
        mock_newrelic.create_synthetics_ssl_monitor.side_effect = ssl_monitor_ids
        mock_newrelic.get_synthetics_monitor.side_effect = mock_get_synthetics_monitor
        mock_newrelic.get_synthetics_notification_emails.return_value = [
            '*****@*****.**'
        ]
        mock_newrelic.add_alert_policy.return_value = 1
        mock_newrelic.add_alert_policy.return_value = 1
        mock_newrelic.add_alert_nrql_condition.side_effect = list(range(8))
        mock_newrelic.add_email_notification_channel.return_value = 1
        instance.new_relic_alert_policy = NewRelicAlertPolicy.objects.create(
            id=1, instance=instance)
        instance.new_relic_alert_policy.email_notification_channels.add(
            NewRelicEmailNotificationChannel.objects.create(
                id=0, email='*****@*****.**'))
        NewRelicEmailNotificationChannel.objects.create(
            id=10, email='*****@*****.**')
        instance.additional_monitoring_emails = [
            '*****@*****.**', '*****@*****.**'
        ]
        instance.enable_monitoring()

        # Check that the extra email has been added to existing monitors,
        # which should be unchanged
        mock_newrelic.create_synthetics_monitor.assert_not_called()
        mock_newrelic.delete_synthetics_monitor.assert_not_called()
        mock_newrelic.add_email_notification_channel.assert_called_with(
            '*****@*****.**')
        mock_newrelic.add_notification_channels_to_policy.assert_called_with(
            1, [1, 10])
    def test_enable_monitoring(self, additional_monitoring_emails, expected_monitor_emails, mock_newrelic, mock_consul):
        """
        Check that the `enable_monitoring` method creates New Relic Synthetics
        monitors for each of the instance's public urls, and enables email
        alerts.
        """
        monitor_ids = [str(uuid4()) for i in range(4)]
        mock_newrelic.get_synthetics_monitor.return_value = []
        mock_newrelic.get_synthetics_notification_emails.return_value = []
        mock_newrelic.create_synthetics_monitor.side_effect = monitor_ids
        mock_newrelic.add_alert_policy.return_value = 1
        mock_newrelic.add_alert_nrql_condition.side_effect = list(range(4))
        mock_newrelic.add_email_notification_channel.side_effect = list(range(len(expected_monitor_emails)))
        instance = OpenEdXInstanceFactory()
        instance.additional_monitoring_emails = additional_monitoring_emails
        instance.enable_monitoring()

        # Check that the monitors have been created
        mock_newrelic.delete_synthetics_monitor.assert_not_called()
        mock_newrelic.create_synthetics_monitor.assert_has_calls([
            call(instance.url),
            call(instance.studio_url),
            call(instance.lms_preview_url),
            call(instance.lms_extended_heartbeat_url),
        ], any_order=True)
        self.assertCountEqual(
            instance.new_relic_availability_monitors.values_list('pk', flat=True),
            monitor_ids
        )

        # Check that alert emails have been set up
        created_conditions = set()
        list_of_emails_added = []

        for add_call in mock_newrelic.add_alert_nrql_condition.call_args_list:
            created_conditions.add((add_call[0][1], add_call[0][2]))

        for add_call in mock_newrelic.add_email_notification_channel.call_args_list:
            list_of_emails_added.append(add_call[0][0])

        self.assertEqual(
            created_conditions,
            set([
                (instance.url, 'LMS of {}'.format(instance.name)),
                (instance.studio_url, 'Studio of {}'.format(instance.name)),
                (instance.lms_preview_url, 'Preview of {}'.format(instance.name)),
                (instance.lms_extended_heartbeat_url, 'Extended heartbeat of {}'.format(instance.name)),
            ])
        )
        self.assertEqual(set(list_of_emails_added), set(expected_monitor_emails))
        mock_newrelic.add_notification_channels_to_policy.assert_called_with(
            1, list(range(len(expected_monitor_emails)))
        )
示例#5
0
    def test_update_monitoring_additional_email(self, mock_newrelic):
        """
        Check that the `enable_monitoring` method will add new
        'additional_monitoring_emails' to the existing monitors.
        """
        instance = OpenEdXInstanceFactory()
        existing_monitor_ids = [str(uuid4()) for i in range(4)]
        existing_monitors = {}
        existing_monitor_urls = [
            instance.url, instance.studio_url, instance.lms_preview_url,
            instance.lms_extended_heartbeat_url
        ]
        for i in range(4):
            new_id = existing_monitor_ids[i]
            instance.new_relic_availability_monitors.create(pk=new_id)
            existing_monitors[new_id] = {
                'id': new_id,
                'uri': existing_monitor_urls[i]
            }

        def mock_get_synthetics_monitor(monitor_id):
            """ Mock for get_synthetics_monitor() """
            return existing_monitors[monitor_id]

        mock_newrelic.get_synthetics_monitor.side_effect = mock_get_synthetics_monitor
        mock_newrelic.get_synthetics_notification_emails.return_value = [
            '*****@*****.**'
        ]

        instance.additional_monitoring_emails = ['*****@*****.**']
        instance.enable_monitoring()

        # Check that the extra email has been added to existing monitors,
        # which should be unchanged
        mock_newrelic.create_synthetics_monitor.assert_not_called()
        mock_newrelic.delete_synthetics_monitor.assert_not_called()
        mock_newrelic.add_synthetics_email_alerts.assert_has_calls(
            [
                call(existing_monitor_ids[0], ['*****@*****.**']),
                call(existing_monitor_ids[1], ['*****@*****.**']),
                call(existing_monitor_ids[2], ['*****@*****.**']),
            ],
            any_order=True)
示例#6
0
    def test_enable_monitoring(self, additional_monitoring_emails,
                               expected_monitor_emails, mock_newrelic):
        """
        Check that the `enable_monitoring` method creates New Relic Synthetics
        monitors for each of the instance's public urls, and enables email
        alerts.
        """
        monitor_ids = [str(uuid4()) for i in range(4)]
        mock_newrelic.get_synthetics_monitor.return_value = []
        mock_newrelic.get_synthetics_notification_emails.return_value = []
        mock_newrelic.create_synthetics_monitor.side_effect = monitor_ids
        instance = OpenEdXInstanceFactory()
        instance.additional_monitoring_emails = additional_monitoring_emails
        instance.enable_monitoring()

        # Check that the monitors have been created
        mock_newrelic.delete_synthetics_monitor.assert_not_called()
        mock_newrelic.create_synthetics_monitor.assert_has_calls(
            [
                call(instance.url),
                call(instance.studio_url),
                call(instance.lms_preview_url),
                call(instance.lms_extended_heartbeat_url),
            ],
            any_order=True)
        self.assertCountEqual(
            instance.new_relic_availability_monitors.values_list('pk',
                                                                 flat=True),
            monitor_ids)

        # Check that alert emails have been set up
        created_monitor_ids = set()
        for creation_call in mock_newrelic.add_synthetics_email_alerts.call_args_list:
            created_monitor_ids.add(
                creation_call[0]
                [0])  # First positional arg to add_synthetics_email_alerts()
            list_of_emails_added = creation_call[0][
                1]  # Second arg - the list of emails added
            self.assertEqual(set(list_of_emails_added),
                             set(expected_monitor_emails))
        self.assertEqual(set(monitor_ids), created_monitor_ids)