Commit 4bedbb20 authored by Sean McGivern's avatar Sean McGivern

Merge branch '4925-use-send-email-setting' into 'master'

Check incident_management_settings before sending alert email

See merge request gitlab-org/gitlab-ee!9830
parents cfad789e 9d048ea7
......@@ -8,7 +8,7 @@ module Projects
return false unless valid_version?
return false unless valid_alert_manager_token?(token)
send_alert_email(project, firings) if firings.any?
send_alert_email if send_email?
persist_events(project, params)
true
......@@ -16,6 +16,23 @@ module Projects
private
def has_incident_management_license?
project.feature_available?(:incident_management)
end
def incident_management_feature_enabled?
Feature.enabled?(:incident_management)
end
def send_email?
return firings.any? unless incident_management_feature_enabled? &&
has_incident_management_license?
setting = project.incident_management_setting || project.build_incident_management_setting
setting.send_email && firings.any?
end
def firings
@firings ||= alerts_by_status('firing')
end
......@@ -89,7 +106,7 @@ module Projects
ActiveSupport::SecurityUtils.variable_size_secure_compare(expected, actual)
end
def send_alert_email(projects, firing_alerts)
def send_alert_email
notification_service
.async
.prometheus_alerts_fired(project, firings)
......
......@@ -9,9 +9,13 @@ describe Projects::Prometheus::Alerts::NotifyService do
let(:token_input) { 'token' }
let(:subject) { service.execute(token_input) }
shared_examples 'notifies alerts' do
before do
# We use `set(:project)` so we make sure to clear caches
project.clear_memoization(:licensed_feature_available)
end
shared_examples 'sends notification email' do
let(:notification_service) { spy }
let(:create_events_service) { spy }
it 'sends a notification for firing alerts only' do
expect(NotificationService)
......@@ -23,6 +27,10 @@ describe Projects::Prometheus::Alerts::NotifyService do
expect(subject).to eq(true)
end
end
shared_examples 'persists events' do
let(:create_events_service) { spy }
it 'persists events' do
expect(Projects::Prometheus::Alerts::CreateEventsService)
......@@ -36,6 +44,11 @@ describe Projects::Prometheus::Alerts::NotifyService do
end
end
shared_examples 'notifies alerts' do
it_behaves_like 'sends notification email'
it_behaves_like 'persists events'
end
shared_examples 'no notifications' do
let(:notification_service) { spy }
let(:create_events_service) { spy }
......@@ -73,6 +86,8 @@ describe Projects::Prometheus::Alerts::NotifyService do
with_them do
before do
stub_feature_flags(incident_management: false)
cluster = create(:cluster, :provided_by_user,
projects: [project],
enabled: cluster_enabled)
......@@ -112,6 +127,8 @@ describe Projects::Prometheus::Alerts::NotifyService do
end
before do
stub_feature_flags(incident_management: false)
stub_licensed_features(multiple_clusters: true)
create(:clusters_applications_prometheus, :installed,
......@@ -152,6 +169,8 @@ describe Projects::Prometheus::Alerts::NotifyService do
let(:alert_manager_token) { token_input }
before do
stub_feature_flags(incident_management: false)
create(:prometheus_service, project: project)
if alerting_setting
......@@ -171,6 +190,66 @@ describe Projects::Prometheus::Alerts::NotifyService do
end
end
end
context 'incident_management feature flag disabled' do
before do
create(:prometheus_service, project: project)
create(:project_alerting_setting, project: project, token: token)
create(:project_incident_management_setting, send_email: true, project: project)
stub_feature_flags(incident_management: false)
end
it_behaves_like 'notifies alerts'
end
context 'no incident_management license' do
before do
create(:prometheus_service, project: project)
create(:project_alerting_setting, project: project, token: token)
create(:project_incident_management_setting, send_email: true, project: project)
stub_licensed_features(incident_management: false)
end
it_behaves_like 'notifies alerts'
end
context 'with incident_management license' do
before do
create(:prometheus_service, project: project)
create(:project_alerting_setting, project: project, token: token)
stub_licensed_features(incident_management: true)
end
context 'when incident_management_setting does not exist' do
it_behaves_like 'notifies alerts'
end
context 'when incident_management_setting.send_email is true' do
before do
create(:project_incident_management_setting, send_email: true, project: project)
end
it_behaves_like 'notifies alerts'
end
context 'incident_management_setting.send_email is false' do
before do
create(:project_incident_management_setting, send_email: false, project: project)
end
it_behaves_like 'persists events'
it 'does not send notification' do
expect(project.feature_available?(:incident_management)).to eq(true)
expect(NotificationService).not_to receive(:new)
expect(subject).to eq(true)
end
end
end
end
context 'with invalid payload' do
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment