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

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2023-07-21 03:08:18 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2023-07-21 03:08:18 +0300
commita558e386749c579a70cca6463926092926627388 (patch)
tree47437c43af4cdc18bdbc4abbcca4a892a3dc64b0 /app
parent5bb4992da25d7e15ec33e51b4a7db8ff6a4cc162 (diff)
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'app')
-rw-r--r--app/assets/javascripts/sidebar/components/incidents/escalation_status.vue67
-rw-r--r--app/models/packages/package.rb1
-rw-r--r--app/services/packages/nuget/update_package_from_metadata_service.rb3
-rw-r--r--app/services/packages/rubygems/process_gem_service.rb5
-rw-r--r--app/workers/concerns/packages/error_handling.rb48
-rw-r--r--app/workers/packages/debian/process_package_file_worker.rb14
-rw-r--r--app/workers/packages/helm/extraction_worker.rb10
-rw-r--r--app/workers/packages/nuget/extraction_worker.rb10
-rw-r--r--app/workers/packages/rubygems/extraction_worker.rb10
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