Welcome to mirror list, hosted at ThFree Co, Russian Federation.

error_handling.rb « packages « concerns « workers « app - gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 26948d399126131b99cb55ff2c59b495927d29a6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# frozen_string_literal: true

module Packages
  module ErrorHandling
    extend ActiveSupport::Concern

    DEFAULT_STATUS_MESSAGE = 'Unexpected error'

    CONTROLLED_ERRORS = [
      ArgumentError,
      ActiveRecord::RecordInvalid,
      ::Packages::Helm::ExtractFileMetadataService::ExtractionError,
      ::Packages::Nuget::ExtractMetadataFileService::ExtractionError,
      ::Packages::Nuget::UpdatePackageFromMetadataService::InvalidMetadataError,
      ::Packages::Nuget::UpdatePackageFromMetadataService::ZipError,
      ::Packages::Rubygems::ProcessGemService::ExtractionError,
      ::Packages::Rubygems::ProcessGemService::InvalidMetadataError
    ].freeze

    def process_package_file_error(package_file:, exception:, extra_log_payload: {})
      log_payload = {
        project_id: package_file.project_id,
        package_file_id: package_file.id
      }.merge(extra_log_payload)
      Gitlab::ErrorTracking.log_exception(exception, **log_payload)

      package_file.package.update_columns(
        status: :error,
        status_message: truncated_status_message(exception)
      )
    end

    private

    def controlled_error?(exception)
      CONTROLLED_ERRORS.include?(exception.class)
    end

    def truncated_status_message(exception)
      status_message = exception.message if controlled_error?(exception)

      # Do not save the exception message in case it contains confidential data
      status_message ||= "#{DEFAULT_STATUS_MESSAGE}: #{exception.class}"

      status_message.truncate(::Packages::Package::STATUS_MESSAGE_MAX_LENGTH)
    end
  end
end