diff options
Diffstat (limited to 'app/workers/concerns/packages/error_handling.rb')
-rw-r--r-- | app/workers/concerns/packages/error_handling.rb | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/app/workers/concerns/packages/error_handling.rb b/app/workers/concerns/packages/error_handling.rb new file mode 100644 index 00000000000..26948d39912 --- /dev/null +++ b/app/workers/concerns/packages/error_handling.rb @@ -0,0 +1,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 |