93 lines
2.2 KiB
Ruby
93 lines
2.2 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module IncidentManagement
|
|
class CreateIssueService < BaseService
|
|
include Gitlab::Utils::StrongMemoize
|
|
|
|
def initialize(project, params)
|
|
super(project, User.alert_bot, params)
|
|
end
|
|
|
|
def execute
|
|
return error_with('setting disabled') unless incident_management_setting.create_issue?
|
|
return error_with('invalid alert') unless alert.valid?
|
|
|
|
issue = create_issue
|
|
return error_with(issue_errors(issue)) unless issue.valid?
|
|
|
|
success(issue: issue)
|
|
end
|
|
|
|
private
|
|
|
|
def create_issue
|
|
label_result = find_or_create_incident_label
|
|
|
|
# Create an unlabelled issue if we couldn't create the label
|
|
# due to a race condition.
|
|
# See https://gitlab.com/gitlab-org/gitlab-foss/issues/65042
|
|
extra_params = label_result.success? ? { label_ids: [label_result.payload[:label].id] } : {}
|
|
|
|
Issues::CreateService.new(
|
|
project,
|
|
current_user,
|
|
title: issue_title,
|
|
description: issue_description,
|
|
**extra_params
|
|
).execute
|
|
end
|
|
|
|
def issue_title
|
|
alert.full_title
|
|
end
|
|
|
|
def issue_description
|
|
horizontal_line = "\n\n---\n\n"
|
|
|
|
[
|
|
alert_summary,
|
|
alert_markdown,
|
|
issue_template_content
|
|
].compact.join(horizontal_line)
|
|
end
|
|
|
|
def find_or_create_incident_label
|
|
IncidentManagement::CreateIncidentLabelService.new(project, current_user).execute
|
|
end
|
|
|
|
def alert_summary
|
|
alert.issue_summary_markdown
|
|
end
|
|
|
|
def alert_markdown
|
|
alert.alert_markdown
|
|
end
|
|
|
|
def alert
|
|
strong_memoize(:alert) do
|
|
Gitlab::Alerting::Alert.new(project: project, payload: params).present
|
|
end
|
|
end
|
|
|
|
def issue_template_content
|
|
incident_management_setting.issue_template_content
|
|
end
|
|
|
|
def incident_management_setting
|
|
strong_memoize(:incident_management_setting) do
|
|
project.incident_management_setting ||
|
|
project.build_incident_management_setting
|
|
end
|
|
end
|
|
|
|
def issue_errors(issue)
|
|
issue.errors.full_messages.to_sentence
|
|
end
|
|
|
|
def error_with(message)
|
|
log_error(%{Cannot create incident issue for "#{project.full_name}": #{message}})
|
|
|
|
error(message)
|
|
end
|
|
end
|
|
end
|