diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2023-07-21 03:08:18 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2023-07-21 03:08:18 +0300 |
commit | a558e386749c579a70cca6463926092926627388 (patch) | |
tree | 47437c43af4cdc18bdbc4abbcca4a892a3dc64b0 /app | |
parent | 5bb4992da25d7e15ec33e51b4a7db8ff6a4cc162 (diff) |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'app')
9 files changed, 124 insertions, 44 deletions
diff --git a/app/assets/javascripts/sidebar/components/incidents/escalation_status.vue b/app/assets/javascripts/sidebar/components/incidents/escalation_status.vue index 72a572087c7..8203dce67cd 100644 --- a/app/assets/javascripts/sidebar/components/incidents/escalation_status.vue +++ b/app/assets/javascripts/sidebar/components/incidents/escalation_status.vue @@ -1,5 +1,5 @@ <script> -import { GlDropdown, GlDropdownItem } from '@gitlab/ui'; +import { GlCollapsibleListbox } from '@gitlab/ui'; import { INCIDENTS_I18N as i18n, STATUS_ACKNOWLEDGED, @@ -14,8 +14,7 @@ export default { i18n, STATUS_LIST, components: { - GlDropdown, - GlDropdownItem, + GlCollapsibleListbox, }, props: { value: { @@ -26,52 +25,64 @@ export default { return [...STATUS_LIST, null].includes(value); }, }, - preventDropdownClose: { - type: Boolean, + headerText: { + type: String, required: false, - default: false, + default: null, + }, + statusSubtexts: { + type: Object, + required: false, + default() { + return {}; + }, }, }, + data() { + return { + selected: this.value, + }; + }, computed: { + statusDropdownOptions() { + return this.$options.STATUS_LIST.map((status) => ({ + text: this.getStatusLabel(status), + subtext: this.statusSubtexts[status], + value: status, + })); + }, currentStatusLabel() { return this.getStatusLabel(this.value); }, }, + methods: { show() { - this.$refs.dropdown.show(); + this.$refs.dropdown.open(); }, hide() { - this.$refs.dropdown.hide(); + this.$refs.dropdown.close(); }, getStatusLabel, - hideDropdown(event) { - if (this.preventDropdownClose) { - event.preventDefault(); - } - }, }, }; </script> <template> - <gl-dropdown + <gl-collapsible-listbox ref="dropdown" + v-model="selected" + :header-text="headerText" block - :text="currentStatusLabel" + :toggle-text="currentStatusLabel" + :items="statusDropdownOptions" toggle-class="dropdown-menu-toggle gl-mb-2" - @hide="hideDropdown" + data-testid="escalation-status-dropdown" + @select="$emit('input', selected)" > - <slot name="header"> </slot> - <gl-dropdown-item - v-for="status in $options.STATUS_LIST" - :key="status" - data-testid="status-dropdown-item" - is-check-item - :is-checked="status === value" - @click="$emit('input', status)" - > - {{ getStatusLabel(status) }} - </gl-dropdown-item> - </gl-dropdown> + <template #list-item="{ item }"> + <span class="gl-display-block">{{ item.text }}</span> + <span v-if="item.subtext" class="gl-font-sm gl-text-gray-500">{{ item.subtext }}</span> + </template> + </gl-collapsible-listbox> </template> diff --git a/app/models/packages/package.rb b/app/models/packages/package.rb index 8218f8b9eba..9d0ca1acc74 100644 --- a/app/models/packages/package.rb +++ b/app/models/packages/package.rb @@ -10,6 +10,7 @@ class Packages::Package < ApplicationRecord DISPLAYABLE_STATUSES = [:default, :error].freeze INSTALLABLE_STATUSES = [:default, :hidden].freeze + STATUS_MESSAGE_MAX_LENGTH = 255 enum package_type: { maven: 1, diff --git a/app/services/packages/nuget/update_package_from_metadata_service.rb b/app/services/packages/nuget/update_package_from_metadata_service.rb index d82509fff5e..73a52ea569f 100644 --- a/app/services/packages/nuget/update_package_from_metadata_service.rb +++ b/app/services/packages/nuget/update_package_from_metadata_service.rb @@ -14,6 +14,7 @@ module Packages MISSING_MATCHING_PACKAGE_ERROR_MESSAGE = 'symbol package is invalid, matching package does not exist' InvalidMetadataError = Class.new(StandardError) + ZipError = Class.new(StandardError) def initialize(package_file) @package_file = package_file @@ -32,6 +33,8 @@ module Packages end rescue ActiveRecord::RecordInvalid => e raise InvalidMetadataError, e.message + rescue Zip::Error + raise ZipError, 'Could not open the .nupkg file' end private diff --git a/app/services/packages/rubygems/process_gem_service.rb b/app/services/packages/rubygems/process_gem_service.rb index ca4aaa8fdde..07545495f1b 100644 --- a/app/services/packages/rubygems/process_gem_service.rb +++ b/app/services/packages/rubygems/process_gem_service.rb @@ -9,6 +9,8 @@ module Packages include ExclusiveLeaseGuard ExtractionError = Class.new(StandardError) + InvalidMetadataError = Class.new(StandardError) + DEFAULT_LEASE_TIMEOUT = 1.hour.to_i.freeze def initialize(package_file) @@ -20,6 +22,9 @@ module Packages return success if process_gem error('Gem was not processed') + rescue ActiveRecord::StatementInvalid + # TODO: We can remove this rescue block when we fix https://gitlab.com/gitlab-org/gitlab/-/issues/415899 + raise InvalidMetadataError, 'Invalid metadata' end private 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 diff --git a/app/workers/packages/debian/process_package_file_worker.rb b/app/workers/packages/debian/process_package_file_worker.rb index 0e21e98d182..843560d4334 100644 --- a/app/workers/packages/debian/process_package_file_worker.rb +++ b/app/workers/packages/debian/process_package_file_worker.rb @@ -5,6 +5,7 @@ module Packages class ProcessPackageFileWorker include ApplicationWorker include Gitlab::Utils::StrongMemoize + include ::Packages::ErrorHandling data_consistency :always @@ -24,11 +25,16 @@ module Packages return unless package_file.debian_file_metadatum&.unknown? ::Packages::Debian::ProcessPackageFileService.new(package_file, distribution_name, component_name).execute - rescue StandardError => e - Gitlab::ErrorTracking.log_exception(e, package_file_id: @package_file_id, - distribution_name: @distribution_name, component_name: @component_name) + rescue StandardError => exception package_file.update_column(:status, :error) - package_file.package.update_column(:status, :error) + process_package_file_error( + package_file: package_file, + exception: exception, + extra_log_payload: { + distribution_name: @distribution_name, + component_name: @component_name + } + ) end private diff --git a/app/workers/packages/helm/extraction_worker.rb b/app/workers/packages/helm/extraction_worker.rb index 0ba2d149f77..ca043c5c8c7 100644 --- a/app/workers/packages/helm/extraction_worker.rb +++ b/app/workers/packages/helm/extraction_worker.rb @@ -4,6 +4,7 @@ module Packages module Helm class ExtractionWorker include ApplicationWorker + include ::Packages::ErrorHandling data_consistency :always @@ -19,10 +20,11 @@ module Packages return unless package_file && !package_file.package.default? ::Packages::Helm::ProcessFileService.new(channel, package_file).execute - - rescue StandardError => e - Gitlab::ErrorTracking.log_exception(e, project_id: package_file.project_id) - package_file.package.update_column(:status, :error) + rescue StandardError => exception + process_package_file_error( + package_file: package_file, + exception: exception + ) end end end diff --git a/app/workers/packages/nuget/extraction_worker.rb b/app/workers/packages/nuget/extraction_worker.rb index b8e00621aa1..55aca0beb03 100644 --- a/app/workers/packages/nuget/extraction_worker.rb +++ b/app/workers/packages/nuget/extraction_worker.rb @@ -4,6 +4,7 @@ module Packages module Nuget class ExtractionWorker # rubocop:disable Scalability/IdempotentWorker include ApplicationWorker + include ::Packages::ErrorHandling data_consistency :always @@ -18,10 +19,11 @@ module Packages return unless package_file ::Packages::Nuget::UpdatePackageFromMetadataService.new(package_file).execute - - rescue StandardError => e - Gitlab::ErrorTracking.log_exception(e, project_id: package_file.project_id) - package_file.package.update_column(:status, :error) + rescue StandardError => exception + process_package_file_error( + package_file: package_file, + exception: exception + ) end end end diff --git a/app/workers/packages/rubygems/extraction_worker.rb b/app/workers/packages/rubygems/extraction_worker.rb index dbaf9bc35a9..7076fdb3b90 100644 --- a/app/workers/packages/rubygems/extraction_worker.rb +++ b/app/workers/packages/rubygems/extraction_worker.rb @@ -4,6 +4,7 @@ module Packages module Rubygems class ExtractionWorker # rubocop:disable Scalability/IdempotentWorker include ApplicationWorker + include ::Packages::ErrorHandling data_consistency :always @@ -19,10 +20,11 @@ module Packages return unless package_file ::Packages::Rubygems::ProcessGemService.new(package_file).execute - - rescue StandardError => e - Gitlab::ErrorTracking.log_exception(e, project_id: package_file.project_id) - package_file.package.update_column(:status, :error) + rescue StandardError => exception + process_package_file_error( + package_file: package_file, + exception: exception + ) end end end |