debian-mirror-gitlab/app/services/incident_management/create_issue_service.rb

94 lines
2.2 KiB
Ruby
Raw Normal View History

2020-03-13 15:44:24 +05:30
# frozen_string_literal: true
module IncidentManagement
class CreateIssueService < BaseService
include Gitlab::Utils::StrongMemoize
2020-07-28 23:09:34 +05:30
def initialize(project, params)
super(project, User.alert_bot, params)
2020-03-13 15:44:24 +05:30
end
2020-07-28 23:09:34 +05:30
def execute
return error_with('setting disabled') unless incident_management_setting.create_issue?
2020-03-13 15:44:24 +05:30
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
2020-07-28 23:09:34 +05:30
label_result = find_or_create_incident_label
2020-03-13 15:44:24 +05:30
2020-07-28 23:09:34 +05:30
# Create an unlabelled issue if we couldn't create the label
# due to a race condition.
2020-03-13 15:44:24 +05:30
# See https://gitlab.com/gitlab-org/gitlab-foss/issues/65042
2020-07-28 23:09:34 +05:30
extra_params = label_result.success? ? { label_ids: [label_result.payload[:label].id] } : {}
2020-03-13 15:44:24 +05:30
Issues::CreateService.new(
project,
current_user,
title: issue_title,
description: issue_description,
2020-07-28 23:09:34 +05:30
**extra_params
2020-03-13 15:44:24 +05:30
).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
2020-07-28 23:09:34 +05:30
def find_or_create_incident_label
IncidentManagement::CreateIncidentLabelService.new(project, current_user).execute
2020-03-13 15:44:24 +05:30
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