Commit f5030f1e authored by Peter Leitzen's avatar Peter Leitzen

Merge branch '200011-move-error-tracking-incidents-to-core' into 'master'

Move Settings->Operations->Incidents to CE

Closes #200011

See merge request gitlab-org/gitlab!24600
parents bada8ea5 20fea2f3
...@@ -19,19 +19,36 @@ module Projects ...@@ -19,19 +19,36 @@ module Projects
# overridden in EE # overridden in EE
def track_events(result) def track_events(result)
if result[:status] == :success
::Gitlab::Tracking::IncidentManagement.track_from_params(
update_params[:incident_management_setting_attributes]
)
end
end end
private private
# overridden in EE
def render_update_response(result) def render_update_response(result)
respond_to do |format| respond_to do |format|
format.html do
render_update_html_response(result)
end
format.json do format.json do
render_update_json_response(result) render_update_json_response(result)
end end
end end
end end
def render_update_html_response(result)
if result[:status] == :success
flash[:notice] = _('Your changes have been saved')
redirect_to project_settings_operations_path(@project)
else
render 'show'
end
end
def render_update_json_response(result) def render_update_json_response(result)
if result[:status] == :success if result[:status] == :success
flash[:notice] = _('Your changes have been saved') flash[:notice] = _('Your changes have been saved')
...@@ -61,6 +78,8 @@ module Projects ...@@ -61,6 +78,8 @@ module Projects
# overridden in EE # overridden in EE
def permitted_project_params def permitted_project_params
project_params = { project_params = {
incident_management_setting_attributes: ::Gitlab::Tracking::IncidentManagement.tracking_keys.keys,
metrics_setting_attributes: [:external_dashboard_url], metrics_setting_attributes: [:external_dashboard_url],
error_tracking_setting_attributes: [ error_tracking_setting_attributes: [
......
...@@ -3,6 +3,11 @@ ...@@ -3,6 +3,11 @@
module ProjectsHelper module ProjectsHelper
prepend_if_ee('::EE::ProjectsHelper') # rubocop: disable Cop/InjectEnterpriseEditionModule prepend_if_ee('::EE::ProjectsHelper') # rubocop: disable Cop/InjectEnterpriseEditionModule
def project_incident_management_setting
@project_incident_management_setting ||= @project.incident_management_setting ||
@project.build_incident_management_setting
end
def link_to_project(project) def link_to_project(project)
link_to namespace_project_path(namespace_id: project.namespace, id: project), title: h(project.name) do link_to namespace_project_path(namespace_id: project.namespace, id: project), title: h(project.name) do
title = content_tag(:span, project.name, class: 'project-name') title = content_tag(:span, project.name, class: 'project-name')
......
...@@ -16,6 +16,7 @@ module Projects ...@@ -16,6 +16,7 @@ module Projects
.merge(metrics_setting_params) .merge(metrics_setting_params)
.merge(grafana_integration_params) .merge(grafana_integration_params)
.merge(prometheus_integration_params) .merge(prometheus_integration_params)
.merge(incident_management_setting_params)
end end
def metrics_setting_params def metrics_setting_params
...@@ -87,6 +88,10 @@ module Projects ...@@ -87,6 +88,10 @@ module Projects
{ prometheus_service_attributes: service.attributes.except(*%w(id project_id created_at updated_at)) } { prometheus_service_attributes: service.attributes.except(*%w(id project_id created_at updated_at)) }
end end
def incident_management_setting_params
params.slice(:incident_management_setting_attributes)
end
end end
end end
end end
......
- return unless incident_management_available?
- templates = [] - templates = []
- setting = project_incident_management_setting - setting = project_incident_management_setting
- templates = setting.available_issue_templates.map { |t| [t.name, t.key] } - templates = setting.available_issue_templates.map { |t| [t.name, t.key] }
%section.settings.no-animate %section.settings.no-animate.js-incident-management-settings
.settings-header .settings-header
%h4= _('Incidents') %h4= _('Incidents')
%button.btn.js-settings-toggle{ type: 'button' } %button.btn.js-settings-toggle{ type: 'button' }
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
- page_title _('Operations Settings') - page_title _('Operations Settings')
- breadcrumb_title _('Operations Settings') - breadcrumb_title _('Operations Settings')
= render_if_exists 'projects/settings/operations/incidents' = render 'projects/settings/operations/incidents'
= render 'projects/settings/operations/error_tracking' = render 'projects/settings/operations/error_tracking'
= render 'projects/settings/operations/external_dashboard' = render 'projects/settings/operations/external_dashboard'
= render 'projects/settings/operations/grafana_integration' = render 'projects/settings/operations/grafana_integration'
......
---
title: Move Settings->Operations->Incidents to the Core
merge_request: 24600
author:
type: changed
...@@ -25,19 +25,10 @@ module EE ...@@ -25,19 +25,10 @@ module EE
end end
end end
helper_method :tracing_setting, :incident_management_available? helper_method :tracing_setting
private private
def render_update_html_response(result)
if result[:status] == :success
flash[:notice] = _('Your changes have been saved')
redirect_to project_settings_operations_path(@project)
else
render 'show'
end
end
def alerting_params def alerting_params
{ alerting_setting_attributes: { regenerate_token: true } } { alerting_setting_attributes: { regenerate_token: true } }
end end
...@@ -50,10 +41,6 @@ module EE ...@@ -50,10 +41,6 @@ module EE
project.feature_available?(:tracing, current_user) project.feature_available?(:tracing, current_user)
end end
def incident_management_available?
project.feature_available?(:incident_management, current_user)
end
def track_tracing_external_url def track_tracing_external_url
external_url_previous_change = project&.tracing_setting&.external_url_previous_change external_url_previous_change = project&.tracing_setting&.external_url_previous_change
return unless external_url_previous_change return unless external_url_previous_change
...@@ -71,37 +58,14 @@ module EE ...@@ -71,37 +58,14 @@ module EE
permitted_params[:tracing_setting_attributes] = [:external_url] permitted_params[:tracing_setting_attributes] = [:external_url]
end end
if incident_management_available?
permitted_params[:incident_management_setting_attributes] = ::Gitlab::Tracking::IncidentManagement.tracking_keys.keys
end
permitted_params permitted_params
end end
override :render_update_response
def render_update_response(result)
respond_to do |format|
format.html do
render_update_html_response(result)
end
format.json do
render_update_json_response(result)
end
end
end
override :track_events override :track_events
def track_events(result) def track_events(result)
super super
if result[:status] == :success track_tracing_external_url if result[:status] == :success
::Gitlab::Tracking::IncidentManagement.track_from_params(
update_params[:incident_management_setting_attributes]
)
track_tracing_external_url
end
end end
end end
end end
......
...@@ -275,11 +275,6 @@ module EE ...@@ -275,11 +275,6 @@ module EE
@project.feature_available?(:tracing, current_user) && can?(current_user, :read_environment, @project) @project.feature_available?(:tracing, current_user) && can?(current_user, :read_environment, @project)
end end
def project_incident_management_setting
@project_incident_management_setting ||= @project.incident_management_setting ||
@project.build_incident_management_setting
end
override :can_import_members? override :can_import_members?
def can_import_members? def can_import_members?
super && !membership_locked? super && !membership_locked?
......
...@@ -96,14 +96,6 @@ describe Projects::Settings::OperationsController do ...@@ -96,14 +96,6 @@ describe Projects::Settings::OperationsController do
let(:private_project) { create(:project, :private) } let(:private_project) { create(:project, :private) }
let(:internal_project) { create(:project, :internal) } let(:internal_project) { create(:project, :internal) }
let(:incident_management_settings) do
{
create_issue: true,
send_email: true,
issue_template_key: 'some-key'
}
end
before do before do
public_project.add_maintainer(user) public_project.add_maintainer(user)
private_project.add_maintainer(user) private_project.add_maintainer(user)
...@@ -125,47 +117,6 @@ describe Projects::Settings::OperationsController do ...@@ -125,47 +117,6 @@ describe Projects::Settings::OperationsController do
expect(project.tracing_setting).to be_nil expect(project.tracing_setting).to be_nil
end end
it 'does not create incident_management_setting' do
update_project(
project,
incident_management_params: incident_management_settings
)
expect(project.incident_management_setting).to be_nil
end
context 'with existing incident_management_setting' do
let(:new_incident_management_settings) do
{
create_issue: false,
send_email: false,
issue_template_key: 'some-other-template'
}
end
let!(:incident_management_setting) do
create(:project_incident_management_setting,
project: project,
**incident_management_settings)
end
it 'does not update incident_management_setting' do
update_project(project,
incident_management_params: new_incident_management_settings)
setting = project.incident_management_setting
expect(setting.create_issue).to(
eq(incident_management_settings[:create_issue])
)
expect(setting.send_email).to(
eq(incident_management_settings[:send_email])
)
expect(setting.issue_template_key).to(
eq(incident_management_settings[:issue_template_key])
)
end
end
end end
context 'format html' do context 'format html' do
...@@ -226,42 +177,6 @@ describe Projects::Settings::OperationsController do ...@@ -226,42 +177,6 @@ describe Projects::Settings::OperationsController do
expect(project.tracing_setting.external_url).to eq(tracing_url) expect(project.tracing_setting.external_url).to eq(tracing_url)
end end
it 'creates incident management settings' do
update_project(
project,
incident_management_params: incident_management_settings
)
expect(project.incident_management_setting.create_issue).to(
eq(incident_management_settings.dig(:create_issue))
)
expect(project.incident_management_setting.send_email).to(
eq(incident_management_settings.dig(:send_email))
)
expect(project.incident_management_setting.issue_template_key).to(
eq(incident_management_settings.dig(:issue_template_key))
)
end
it 'creates tracing and incident management settings' do
update_project(
project,
tracing_params: { external_url: tracing_url },
incident_management_params: incident_management_settings
)
expect(project.tracing_setting.external_url).to eq(tracing_url)
expect(project.incident_management_setting.create_issue).to(
eq(incident_management_settings.dig(:create_issue))
)
expect(project.incident_management_setting.send_email).to(
eq(incident_management_settings.dig(:send_email))
)
expect(project.incident_management_setting.issue_template_key).to(
eq(incident_management_settings.dig(:issue_template_key))
)
end
end end
context 'with maintainer role' do context 'with maintainer role' do
...@@ -343,72 +258,6 @@ describe Projects::Settings::OperationsController do ...@@ -343,72 +258,6 @@ describe Projects::Settings::OperationsController do
end end
end end
context 'with existing incident management setting' do
let(:project) { create(:project) }
let(:new_incident_management_settings) do
{
create_issue: false,
send_email: false,
issue_template_key: 'some-other-template'
}
end
let!(:incident_management_setting) do
create(:project_incident_management_setting,
project: project,
**incident_management_settings)
end
before do
project.add_maintainer(user)
end
it 'updates incident management setting' do
update_project(project,
incident_management_params: new_incident_management_settings)
setting = project.incident_management_setting
expect(setting.create_issue).to(
eq(new_incident_management_settings[:create_issue])
)
expect(setting.send_email).to(
eq(new_incident_management_settings[:send_email])
)
expect(setting.issue_template_key).to(
eq(new_incident_management_settings[:issue_template_key])
)
end
end
context 'updating each incident management setting' do
let(:project) { create(:project) }
let(:new_incident_management_settings) { {} }
before do
project.add_maintainer(user)
end
shared_examples 'a gitlab tracking event' do |params, event_key|
it "creates a gitlab tracking event #{event_key}" do
new_incident_management_settings = params
expect(Gitlab::Tracking).to receive(:event)
.with('IncidentManagement::Settings', event_key, kind_of(Hash))
update_project(project,
incident_management_params: new_incident_management_settings)
end
end
it_behaves_like 'a gitlab tracking event', { create_issue: '1' }, 'enabled_issue_auto_creation_on_alerts'
it_behaves_like 'a gitlab tracking event', { create_issue: '0' }, 'disabled_issue_auto_creation_on_alerts'
it_behaves_like 'a gitlab tracking event', { issue_template_key: 'template' }, 'enabled_issue_template_on_alerts'
it_behaves_like 'a gitlab tracking event', { issue_template_key: nil }, 'disabled_issue_template_on_alerts'
it_behaves_like 'a gitlab tracking event', { send_email: '1' }, 'enabled_sending_emails'
it_behaves_like 'a gitlab tracking event', { send_email: '0' }, 'disabled_sending_emails'
end
context 'updating tracing settings' do context 'updating tracing settings' do
let(:project) { create(:project) } let(:project) { create(:project) }
let(:new_tracing_settings) { {} } let(:new_tracing_settings) { {} }
......
# frozen_string_literal: true
require 'spec_helper'
describe 'Projects > Settings' do
let(:user) { create(:user) }
let(:project) { create(:project, :repository, create_templates: :issue) }
let(:role) { :maintainer }
let(:create_issue) { 'Create an issue. Issues are created for each alert triggered.' }
let(:send_email) { 'Send a separate email notification to Developers.' }
before do
create(:project_incident_management_setting, send_email: true, project: project)
sign_in(user)
project.add_role(user, role)
end
describe 'Incidents' do
context 'with license' do
before do
stub_licensed_features(incident_management: true)
visit project_settings_operations_path(project)
end
it 'renders form for incident management' do
expect(page).to have_selector('h4', text: 'Incidents')
end
it 'sets correct default values' do
expect(find_field(create_issue)).not_to be_checked
expect(find_field(send_email)).to be_checked
end
it 'updates form values' do
check(create_issue)
template_select = find_field('Issue template')
template_select.find(:xpath, 'option[2]').select_option
uncheck(send_email)
save_form
expect(find_field(create_issue)).to be_checked
expect(page).to have_select('Issue template', selected: 'bug')
expect(find_field(send_email)).not_to be_checked
end
def save_form
page.within "#edit_project_#{project.id}" do
click_on 'Save changes'
end
end
end
context 'without license' do
before do
stub_licensed_features(incident_management: false)
visit project_settings_operations_path(project)
end
it 'renders form for incident management' do
expect(page).not_to have_selector('h4', text: 'Incidents')
end
end
end
end
...@@ -9,30 +9,6 @@ describe ProjectsHelper do ...@@ -9,30 +9,6 @@ describe ProjectsHelper do
helper.instance_variable_set(:@project, project) helper.instance_variable_set(:@project, project)
end end
describe '#project_incident_management_setting' do
context 'when incident_management_setting exists' do
let(:project_incident_management_setting) do
create(:project_incident_management_setting, project: project)
end
it 'return project_incident_management_setting' do
expect(helper.project_incident_management_setting).to(
eq(project_incident_management_setting)
)
end
end
context 'when incident_management_setting does not exist' do
it 'builds incident_management_setting' do
expect(helper.project_incident_management_setting.persisted?).to be(false)
expect(helper.project_incident_management_setting.send_email).to be(false)
expect(helper.project_incident_management_setting.create_issue).to be(true)
expect(helper.project_incident_management_setting.issue_template_key).to be(nil)
end
end
end
describe 'default_clone_protocol' do describe 'default_clone_protocol' do
context 'when gitlab.config.kerberos is enabled and user is logged in' do context 'when gitlab.config.kerberos is enabled and user is logged in' do
it 'returns krb5 as default protocol' do it 'returns krb5 as default protocol' do
......
...@@ -4,7 +4,7 @@ require 'spec_helper' ...@@ -4,7 +4,7 @@ require 'spec_helper'
describe Projects::Settings::OperationsController do describe Projects::Settings::OperationsController do
let_it_be(:user) { create(:user) } let_it_be(:user) { create(:user) }
let_it_be(:project) { create(:project) } let_it_be(:project, reload: true) { create(:project) }
before do before do
sign_in(user) sign_in(user)
...@@ -121,6 +121,74 @@ describe Projects::Settings::OperationsController do ...@@ -121,6 +121,74 @@ describe Projects::Settings::OperationsController do
end end
end end
context 'incident management' do
describe 'GET #show' do
context 'with existing setting' do
let!(:incident_management_setting) do
create(:project_incident_management_setting, project: project)
end
it 'loads existing setting' do
get :show, params: project_params(project)
expect(controller.helpers.project_incident_management_setting)
.to eq(incident_management_setting)
end
end
context 'without an existing setting' do
it 'builds a new setting' do
get :show, params: project_params(project)
expect(controller.helpers.project_incident_management_setting).to be_new_record
end
end
end
describe 'PATCH #update' do
let(:params) do
{
incident_management_setting_attributes: {
create_issue: 'false',
send_email: 'false',
issue_template_key: 'some-other-template'
}
}
end
it_behaves_like 'PATCHable'
context 'updating each incident management setting' do
let(:project) { create(:project) }
let(:new_incident_management_settings) { {} }
before do
project.add_maintainer(user)
end
shared_examples 'a gitlab tracking event' do |params, event_key|
it "creates a gitlab tracking event #{event_key}" do
new_incident_management_settings = params
expect(Gitlab::Tracking).to receive(:event)
.with('IncidentManagement::Settings', event_key, kind_of(Hash))
patch :update, params: project_params(project, incident_management_setting_attributes: new_incident_management_settings)
project.reload
end
end
it_behaves_like 'a gitlab tracking event', { create_issue: '1' }, 'enabled_issue_auto_creation_on_alerts'
it_behaves_like 'a gitlab tracking event', { create_issue: '0' }, 'disabled_issue_auto_creation_on_alerts'
it_behaves_like 'a gitlab tracking event', { issue_template_key: 'template' }, 'enabled_issue_template_on_alerts'
it_behaves_like 'a gitlab tracking event', { issue_template_key: nil }, 'disabled_issue_template_on_alerts'
it_behaves_like 'a gitlab tracking event', { send_email: '1' }, 'enabled_sending_emails'
it_behaves_like 'a gitlab tracking event', { send_email: '0' }, 'disabled_sending_emails'
end
end
end
context 'error tracking' do context 'error tracking' do
describe 'GET #show' do describe 'GET #show' do
context 'with existing setting' do context 'with existing setting' do
......
...@@ -4,7 +4,7 @@ require 'spec_helper' ...@@ -4,7 +4,7 @@ require 'spec_helper'
describe 'Projects > Settings > For a forked project', :js do describe 'Projects > Settings > For a forked project', :js do
let(:user) { create(:user) } let(:user) { create(:user) }
let(:project) { create(:project, :repository) } let(:project) { create(:project, :repository, create_templates: :issue) }
let(:role) { :maintainer } let(:role) { :maintainer }
before do before do
...@@ -22,6 +22,54 @@ describe 'Projects > Settings > For a forked project', :js do ...@@ -22,6 +22,54 @@ describe 'Projects > Settings > For a forked project', :js do
end end
describe 'Settings > Operations' do describe 'Settings > Operations' do
describe 'Incidents' do
let(:create_issue) { 'Create an issue. Issues are created for each alert triggered.' }
let(:send_email) { 'Send a separate email notification to Developers.' }
before do
create(:project_incident_management_setting, send_email: true, project: project)
visit project_settings_operations_path(project)
wait_for_requests
click_expand_incident_management_button
end
it 'renders form for incident management' do
expect(page).to have_selector('h4', text: 'Incidents')
end
it 'sets correct default values' do
expect(find_field(create_issue)).not_to be_checked
expect(find_field(send_email)).to be_checked
end
it 'updates form values' do
check(create_issue)
template_select = find_field('Issue template')
template_select.find(:xpath, 'option[2]').select_option
uncheck(send_email)
save_form
click_expand_incident_management_button
expect(find_field(create_issue)).to be_checked
expect(page).to have_select('Issue template', selected: 'bug')
expect(find_field(send_email)).not_to be_checked
end
def click_expand_incident_management_button
within '.js-incident-management-settings' do
click_button('Expand')
end
end
def save_form
page.within "#edit_project_#{project.id}" do
click_on 'Save changes'
end
end
end
context 'error tracking settings form' do context 'error tracking settings form' do
let(:sentry_list_projects_url) { 'http://sentry.example.com/api/0/projects/' } let(:sentry_list_projects_url) { 'http://sentry.example.com/api/0/projects/' }
......
...@@ -5,6 +5,37 @@ require 'spec_helper' ...@@ -5,6 +5,37 @@ require 'spec_helper'
describe ProjectsHelper do describe ProjectsHelper do
include ProjectForksHelper include ProjectForksHelper
describe '#project_incident_management_setting' do
let(:project) { create(:project) }
before do
helper.instance_variable_set(:@project, project)
end
context 'when incident_management_setting exists' do
let(:project_incident_management_setting) do
create(:project_incident_management_setting, project: project)
end
it 'return project_incident_management_setting' do
expect(helper.project_incident_management_setting).to(
eq(project_incident_management_setting)
)
end
end
context 'when incident_management_setting does not exist' do
it 'builds incident_management_setting' do
setting = helper.project_incident_management_setting
expect(setting).not_to be_persisted
expect(setting.send_email).to be_falsey
expect(setting.create_issue).to be_truthy
expect(setting.issue_template_key).to be_nil
end
end
end
describe '#error_tracking_setting_project_json' do describe '#error_tracking_setting_project_json' do
let(:project) { create(:project) } let(:project) { create(:project) }
......
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