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