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
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2020-06-18 14:18:50 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2020-06-18 14:18:50 +0300
commit8c7f4e9d5f36cff46365a7f8c4b9c21578c1e781 (patch)
treea77e7fe7a93de11213032ed4ab1f33a3db51b738 /app/services/projects
parent00b35af3db1abfe813a778f643dad221aad51fca (diff)
Add latest changes from gitlab-org/gitlab@13-1-stable-ee
Diffstat (limited to 'app/services/projects')
-rw-r--r--app/services/projects/after_import_service.rb8
-rw-r--r--app/services/projects/alerting/notify_service.rb33
-rw-r--r--app/services/projects/container_repository/cleanup_tags_service.rb12
-rw-r--r--app/services/projects/create_service.rb24
-rw-r--r--app/services/projects/destroy_service.rb2
-rw-r--r--app/services/projects/detect_repository_languages_service.rb2
-rw-r--r--app/services/projects/group_links/create_service.rb1
-rw-r--r--app/services/projects/group_links/destroy_service.rb4
-rw-r--r--app/services/projects/group_links/update_service.rb29
-rw-r--r--app/services/projects/hashed_storage/base_attachment_service.rb2
-rw-r--r--app/services/projects/import_export/export_service.rb14
-rw-r--r--app/services/projects/import_service.rb2
-rw-r--r--app/services/projects/lfs_pointers/lfs_link_service.rb2
-rw-r--r--app/services/projects/lsif_data_service.rb101
-rw-r--r--app/services/projects/move_deploy_keys_projects_service.rb2
-rw-r--r--app/services/projects/move_lfs_objects_projects_service.rb2
-rw-r--r--app/services/projects/move_notification_settings_service.rb2
-rw-r--r--app/services/projects/move_project_group_links_service.rb2
-rw-r--r--app/services/projects/move_project_members_service.rb2
-rw-r--r--app/services/projects/operations/update_service.rb4
-rw-r--r--app/services/projects/prometheus/alerts/create_events_service.rb8
-rw-r--r--app/services/projects/prometheus/alerts/notify_service.rb35
-rw-r--r--app/services/projects/propagate_service_template.rb48
-rw-r--r--app/services/projects/update_remote_mirror_service.rb6
-rw-r--r--app/services/projects/update_repository_storage_service.rb7
-rw-r--r--app/services/projects/update_service.rb13
-rw-r--r--app/services/projects/update_statistics_service.rb2
27 files changed, 185 insertions, 184 deletions
diff --git a/app/services/projects/after_import_service.rb b/app/services/projects/after_import_service.rb
index ee2dde8aa7f..fad2290a47b 100644
--- a/app/services/projects/after_import_service.rb
+++ b/app/services/projects/after_import_service.rb
@@ -22,8 +22,12 @@ module Projects
# causing GC to run every time.
service.increment!
rescue Projects::HousekeepingService::LeaseTaken => e
- Rails.logger.info( # rubocop:disable Gitlab/RailsLogger
- "Could not perform housekeeping for project #{@project.full_path} (#{@project.id}): #{e}")
+ Gitlab::Import::Logger.info(
+ message: 'Project housekeeping failed',
+ project_full_path: @project.full_path,
+ project_id: @project.id,
+ error: e.message
+ )
end
private
diff --git a/app/services/projects/alerting/notify_service.rb b/app/services/projects/alerting/notify_service.rb
index 76c89e85f17..86c408aeec8 100644
--- a/app/services/projects/alerting/notify_service.rb
+++ b/app/services/projects/alerting/notify_service.rb
@@ -10,7 +10,7 @@ module Projects
return forbidden unless alerts_service_activated?
return unauthorized unless valid_token?(token)
- alert = create_alert
+ alert = process_alert
return bad_request unless alert.persisted?
process_incident_issues(alert) if process_issues?
@@ -26,11 +26,36 @@ module Projects
delegate :alerts_service, :alerts_service_activated?, to: :project
def am_alert_params
- Gitlab::AlertManagement::AlertParams.from_generic_alert(project: project, payload: params.to_h)
+ strong_memoize(:am_alert_params) do
+ Gitlab::AlertManagement::AlertParams.from_generic_alert(project: project, payload: params.to_h)
+ end
+ end
+
+ def process_alert
+ existing_alert = find_alert_by_fingerprint(am_alert_params[:fingerprint])
+
+ if existing_alert
+ process_existing_alert(existing_alert)
+ else
+ create_alert
+ end
+ end
+
+ def process_existing_alert(alert)
+ alert.register_new_event!
end
def create_alert
- AlertManagement::Alert.create(am_alert_params)
+ alert = AlertManagement::Alert.create(am_alert_params)
+ alert.execute_services if alert.persisted?
+
+ alert
+ end
+
+ def find_alert_by_fingerprint(fingerprint)
+ return unless fingerprint
+
+ AlertManagement::Alert.for_fingerprint(project, fingerprint).first
end
def send_email?
@@ -38,6 +63,8 @@ module Projects
end
def process_incident_issues(alert)
+ return if alert.issue
+
IncidentManagement::ProcessAlertWorker
.perform_async(project.id, parsed_payload, alert.id)
end
diff --git a/app/services/projects/container_repository/cleanup_tags_service.rb b/app/services/projects/container_repository/cleanup_tags_service.rb
index b53a9c1561e..c5809c11ea9 100644
--- a/app/services/projects/container_repository/cleanup_tags_service.rb
+++ b/app/services/projects/container_repository/cleanup_tags_service.rb
@@ -6,6 +6,7 @@ module Projects
def execute(container_repository)
return error('feature disabled') unless can_use?
return error('access denied') unless can_destroy?
+ return error('invalid regex') unless valid_regex?
tags = container_repository.tags
tags = without_latest(tags)
@@ -76,6 +77,17 @@ module Projects
def can_use?
Feature.enabled?(:container_registry_cleanup, project, default_enabled: true)
end
+
+ def valid_regex?
+ %w(name_regex_delete name_regex name_regex_keep).each do |param_name|
+ regex = params[param_name]
+ Gitlab::UntrustedRegexp.new(regex) unless regex.blank?
+ end
+ true
+ rescue RegexpError => e
+ Gitlab::ErrorTracking.log_exception(e, project_id: project.id)
+ false
+ end
end
end
end
diff --git a/app/services/projects/create_service.rb b/app/services/projects/create_service.rb
index 3233d1799b8..bffd443c49f 100644
--- a/app/services/projects/create_service.rb
+++ b/app/services/projects/create_service.rb
@@ -150,7 +150,7 @@ module Projects
if @project.save
unless @project.gitlab_project_import?
- create_services_from_active_templates(@project)
+ create_services_from_active_instances_or_templates(@project)
@project.create_labels
end
@@ -166,7 +166,7 @@ module Projects
log_message = message.dup
log_message << " Project ID: #{@project.id}" if @project&.id
- Rails.logger.error(log_message) # rubocop:disable Gitlab/RailsLogger
+ Gitlab::AppLogger.error(log_message)
if @project && @project.persisted? && @project.import_state
@project.import_state.mark_as_failed(message)
@@ -175,15 +175,6 @@ module Projects
@project
end
- # rubocop: disable CodeReuse/ActiveRecord
- def create_services_from_active_templates(project)
- Service.where(template: true, active: true).each do |template|
- service = Service.build_from_template(project.id, template)
- service.save!
- end
- end
- # rubocop: enable CodeReuse/ActiveRecord
-
def create_prometheus_service
service = @project.find_or_initialize_service(::PrometheusService.to_param)
@@ -225,6 +216,15 @@ module Projects
private
+ # rubocop: disable CodeReuse/ActiveRecord
+ def create_services_from_active_instances_or_templates(project)
+ Service.active.where(instance: true).or(Service.active.where(template: true)).group_by(&:type).each do |type, records|
+ service = records.find(&:instance?) || records.find(&:template?)
+ Service.build_from_integration(project.id, service).save!
+ end
+ end
+ # rubocop: enable CodeReuse/ActiveRecord
+
def project_namespace
@project_namespace ||= Namespace.find_by_id(@params[:namespace_id]) || current_user.namespace
end
@@ -249,9 +249,7 @@ module Projects
end
end
-# rubocop: disable Cop/InjectEnterpriseEditionModule
Projects::CreateService.prepend_if_ee('EE::Projects::CreateService')
-# rubocop: enable Cop/InjectEnterpriseEditionModule
# Measurable should be at the bottom of the ancestor chain, so it will measure execution of EE::Projects::CreateService as well
Projects::CreateService.prepend(Measurable)
diff --git a/app/services/projects/destroy_service.rb b/app/services/projects/destroy_service.rb
index fd1366d2c4a..2e949f2fc55 100644
--- a/app/services/projects/destroy_service.rb
+++ b/app/services/projects/destroy_service.rb
@@ -64,7 +64,7 @@ module Projects
end
def remove_snippets
- response = Snippets::BulkDestroyService.new(current_user, project.snippets).execute
+ response = ::Snippets::BulkDestroyService.new(current_user, project.snippets).execute
response.success?
end
diff --git a/app/services/projects/detect_repository_languages_service.rb b/app/services/projects/detect_repository_languages_service.rb
index 942cd8162e4..c57773c3302 100644
--- a/app/services/projects/detect_repository_languages_service.rb
+++ b/app/services/projects/detect_repository_languages_service.rb
@@ -21,7 +21,7 @@ module Projects
.update_all(share: update[:share])
end
- Gitlab::Database.bulk_insert(
+ Gitlab::Database.bulk_insert( # rubocop:disable Gitlab/BulkInsert
RepositoryLanguage.table_name,
detection.insertions(matching_programming_languages)
)
diff --git a/app/services/projects/group_links/create_service.rb b/app/services/projects/group_links/create_service.rb
index 241948b335b..2ba3cd6694f 100644
--- a/app/services/projects/group_links/create_service.rb
+++ b/app/services/projects/group_links/create_service.rb
@@ -13,6 +13,7 @@ module Projects
)
if link.save
+ group.refresh_members_authorized_projects
success(link: link)
else
error(link.errors.full_messages.to_sentence, 409)
diff --git a/app/services/projects/group_links/destroy_service.rb b/app/services/projects/group_links/destroy_service.rb
index ea7d05551fd..229191e41f6 100644
--- a/app/services/projects/group_links/destroy_service.rb
+++ b/app/services/projects/group_links/destroy_service.rb
@@ -12,7 +12,9 @@ module Projects
TodosDestroyer::ConfidentialIssueWorker.perform_in(Todo::WAIT_FOR_DELETE, nil, project.id)
end
- group_link.destroy
+ group_link.destroy.tap do |link|
+ link.group.refresh_members_authorized_projects
+ end
end
end
end
diff --git a/app/services/projects/group_links/update_service.rb b/app/services/projects/group_links/update_service.rb
new file mode 100644
index 00000000000..7de4b7a211d
--- /dev/null
+++ b/app/services/projects/group_links/update_service.rb
@@ -0,0 +1,29 @@
+# frozen_string_literal: true
+
+module Projects
+ module GroupLinks
+ class UpdateService < BaseService
+ def initialize(group_link, user = nil)
+ super(group_link.project, user)
+
+ @group_link = group_link
+ end
+
+ def execute(group_link_params)
+ group_link.update!(group_link_params)
+
+ if requires_authorization_refresh?(group_link_params)
+ group_link.group.refresh_members_authorized_projects
+ end
+ end
+
+ private
+
+ attr_reader :group_link
+
+ def requires_authorization_refresh?(params)
+ params.include?(:group_access)
+ end
+ end
+ end
+end
diff --git a/app/services/projects/hashed_storage/base_attachment_service.rb b/app/services/projects/hashed_storage/base_attachment_service.rb
index a2a7895ba17..d61a2af6c1c 100644
--- a/app/services/projects/hashed_storage/base_attachment_service.rb
+++ b/app/services/projects/hashed_storage/base_attachment_service.rb
@@ -19,7 +19,7 @@ module Projects
def initialize(project:, old_disk_path:, logger: nil)
@project = project
@old_disk_path = old_disk_path
- @logger = logger || Rails.logger # rubocop:disable Gitlab/RailsLogger
+ @logger = logger || Gitlab::AppLogger
end
# Return whether this operation was skipped or not
diff --git a/app/services/projects/import_export/export_service.rb b/app/services/projects/import_export/export_service.rb
index 86cb4f35206..031b99753c3 100644
--- a/app/services/projects/import_export/export_service.rb
+++ b/app/services/projects/import_export/export_service.rb
@@ -9,6 +9,7 @@ module Projects
super
@shared = project.import_export_shared
+ @logger = Gitlab::Export::Logger.build
end
def execute(after_export_strategy = nil)
@@ -115,11 +116,20 @@ module Projects
end
def notify_success
- Rails.logger.info("Import/Export - Project #{project.name} with ID: #{project.id} successfully exported") # rubocop:disable Gitlab/RailsLogger
+ @logger.info(
+ message: 'Project successfully exported',
+ project_name: project.name,
+ project_id: project.id
+ )
end
def notify_error
- Rails.logger.error("Import/Export - Project #{project.name} with ID: #{project.id} export error - #{shared.errors.join(', ')}") # rubocop:disable Gitlab/RailsLogger
+ @logger.error(
+ message: 'Project export error',
+ export_errors: shared.errors.join(', '),
+ project_name: project.name,
+ project_id: project.id
+ )
notification_service.project_not_exported(project, current_user, shared.errors)
end
diff --git a/app/services/projects/import_service.rb b/app/services/projects/import_service.rb
index 449c4c3de6b..b4abb5b6df7 100644
--- a/app/services/projects/import_service.rb
+++ b/app/services/projects/import_service.rb
@@ -149,9 +149,7 @@ module Projects
end
end
-# rubocop: disable Cop/InjectEnterpriseEditionModule
Projects::ImportService.prepend_if_ee('EE::Projects::ImportService')
-# rubocop: enable Cop/InjectEnterpriseEditionModule
# Measurable should be at the bottom of the ancestor chain, so it will measure execution of EE::Projects::ImportService as well
Projects::ImportService.prepend(Measurable)
diff --git a/app/services/projects/lfs_pointers/lfs_link_service.rb b/app/services/projects/lfs_pointers/lfs_link_service.rb
index 39cd553261f..e86106f0a09 100644
--- a/app/services/projects/lfs_pointers/lfs_link_service.rb
+++ b/app/services/projects/lfs_pointers/lfs_link_service.rb
@@ -38,7 +38,7 @@ module Projects
rows = existent_lfs_objects
.not_linked_to_project(project)
.map { |existing_lfs_object| { project_id: project.id, lfs_object_id: existing_lfs_object.id } }
- Gitlab::Database.bulk_insert(:lfs_objects_projects, rows)
+ Gitlab::Database.bulk_insert(:lfs_objects_projects, rows) # rubocop:disable Gitlab/BulkInsert
iterations += 1
linked_existing_objects += existent_lfs_objects.map(&:oid)
diff --git a/app/services/projects/lsif_data_service.rb b/app/services/projects/lsif_data_service.rb
deleted file mode 100644
index 5e7055b3309..00000000000
--- a/app/services/projects/lsif_data_service.rb
+++ /dev/null
@@ -1,101 +0,0 @@
-# frozen_string_literal: true
-
-module Projects
- class LsifDataService
- attr_reader :file, :project, :commit_id, :docs,
- :doc_ranges, :ranges, :def_refs, :hover_refs
-
- CACHE_EXPIRE_IN = 1.hour
-
- def initialize(file, project, commit_id)
- @file = file
- @project = project
- @commit_id = commit_id
-
- fetch_data!
- end
-
- def execute(path)
- doc_id = find_doc_id(docs, path)
- dir_absolute_path = docs[doc_id]&.delete_suffix(path)
-
- doc_ranges[doc_id]&.map do |range_id|
- location, ref_id = ranges[range_id].values_at('loc', 'ref_id')
- line_data, column_data = location
-
- {
- start_line: line_data.first,
- end_line: line_data.last,
- start_char: column_data.first,
- end_char: column_data.last,
- definition_url: definition_url_for(def_refs[ref_id], dir_absolute_path),
- hover: highlighted_hover(hover_refs[ref_id])
- }
- end
- end
-
- private
-
- def fetch_data
- Rails.cache.fetch("project:#{project.id}:lsif:#{commit_id}", expires_in: CACHE_EXPIRE_IN) do
- data = nil
-
- file.open do |stream|
- Zlib::GzipReader.wrap(stream) do |gz_stream|
- data = Gitlab::Json.parse(gz_stream.read)
- end
- end
-
- data
- end
- end
-
- def fetch_data!
- data = fetch_data
-
- @docs = data['docs']
- @doc_ranges = data['doc_ranges']
- @ranges = data['ranges']
- @def_refs = data['def_refs']
- @hover_refs = data['hover_refs']
- end
-
- def find_doc_id(docs, path)
- docs.reduce(nil) do |doc_id, (id, doc_path)|
- next doc_id unless doc_path =~ /#{path}$/
-
- if doc_id.nil? || docs[doc_id].size > doc_path.size
- doc_id = id
- end
-
- doc_id
- end
- end
-
- def definition_url_for(ref_id, dir_absolute_path)
- return unless range = ranges[ref_id]
-
- def_doc_id, location = range.values_at('doc_id', 'loc')
- localized_doc_url = docs[def_doc_id].delete_prefix(dir_absolute_path)
-
- # location is stored as [[start_line, end_line], [start_char, end_char]]
- start_line = location.first.first
-
- line_anchor = "L#{start_line + 1}"
- definition_ref_path = [commit_id, localized_doc_url].join('/')
-
- Gitlab::Routing.url_helpers.project_blob_path(project, definition_ref_path, anchor: line_anchor)
- end
-
- def highlighted_hover(hovers)
- hovers&.map do |hover|
- # Documentation for a method which is added as comments on top of the method
- # is stored as a raw string value in LSIF file
- next { value: hover } unless hover.is_a?(Hash)
-
- value = Gitlab::Highlight.highlight(nil, hover['value'], language: hover['language'])
- { language: hover['language'], value: value }
- end
- end
- end
-end
diff --git a/app/services/projects/move_deploy_keys_projects_service.rb b/app/services/projects/move_deploy_keys_projects_service.rb
index 01419563538..51d84af249e 100644
--- a/app/services/projects/move_deploy_keys_projects_service.rb
+++ b/app/services/projects/move_deploy_keys_projects_service.rb
@@ -28,7 +28,7 @@ module Projects
# rubocop: enable CodeReuse/ActiveRecord
def remove_remaining_deploy_keys_projects
- source_project.deploy_keys_projects.destroy_all # rubocop: disable DestroyAll
+ source_project.deploy_keys_projects.destroy_all # rubocop: disable Cop/DestroyAll
end
end
end
diff --git a/app/services/projects/move_lfs_objects_projects_service.rb b/app/services/projects/move_lfs_objects_projects_service.rb
index 8cc420d7ba7..57a8d3d69c6 100644
--- a/app/services/projects/move_lfs_objects_projects_service.rb
+++ b/app/services/projects/move_lfs_objects_projects_service.rb
@@ -20,7 +20,7 @@ module Projects
end
def remove_remaining_lfs_objects_project
- source_project.lfs_objects_projects.destroy_all # rubocop: disable DestroyAll
+ source_project.lfs_objects_projects.destroy_all # rubocop: disable Cop/DestroyAll
end
# rubocop: disable CodeReuse/ActiveRecord
diff --git a/app/services/projects/move_notification_settings_service.rb b/app/services/projects/move_notification_settings_service.rb
index 65a888fe26b..efe06f158cc 100644
--- a/app/services/projects/move_notification_settings_service.rb
+++ b/app/services/projects/move_notification_settings_service.rb
@@ -21,7 +21,7 @@ module Projects
# Remove remaining notification settings from source_project
def remove_remaining_notification_settings
- source_project.notification_settings.destroy_all # rubocop: disable DestroyAll
+ source_project.notification_settings.destroy_all # rubocop: disable Cop/DestroyAll
end
# Get users of current notification_settings
diff --git a/app/services/projects/move_project_group_links_service.rb b/app/services/projects/move_project_group_links_service.rb
index d1aa9af2bcb..349953ff973 100644
--- a/app/services/projects/move_project_group_links_service.rb
+++ b/app/services/projects/move_project_group_links_service.rb
@@ -25,7 +25,7 @@ module Projects
# Remove remaining project group links from source_project
def remove_remaining_project_group_links
- source_project.reset.project_group_links.destroy_all # rubocop: disable DestroyAll
+ source_project.reset.project_group_links.destroy_all # rubocop: disable Cop/DestroyAll
end
def group_links_in_target_project
diff --git a/app/services/projects/move_project_members_service.rb b/app/services/projects/move_project_members_service.rb
index de4e7e5a1e3..9a1b7c6d1b6 100644
--- a/app/services/projects/move_project_members_service.rb
+++ b/app/services/projects/move_project_members_service.rb
@@ -25,7 +25,7 @@ module Projects
def remove_remaining_members
# Remove remaining members and authorizations from source_project
- source_project.project_members.destroy_all # rubocop: disable DestroyAll
+ source_project.project_members.destroy_all # rubocop: disable Cop/DestroyAll
end
def project_members_in_target_project
diff --git a/app/services/projects/operations/update_service.rb b/app/services/projects/operations/update_service.rb
index c06f572b52f..7aa7ea73639 100644
--- a/app/services/projects/operations/update_service.rb
+++ b/app/services/projects/operations/update_service.rb
@@ -41,9 +41,9 @@ module Projects
attribs = params[:metrics_setting_attributes]
return {} unless attribs
- destroy = attribs[:external_dashboard_url].blank?
+ attribs[:external_dashboard_url] = attribs[:external_dashboard_url].presence
- { metrics_setting_attributes: attribs.merge(_destroy: destroy) }
+ { metrics_setting_attributes: attribs }
end
def error_tracking_params
diff --git a/app/services/projects/prometheus/alerts/create_events_service.rb b/app/services/projects/prometheus/alerts/create_events_service.rb
index a29240947ff..4fcf841314b 100644
--- a/app/services/projects/prometheus/alerts/create_events_service.rb
+++ b/app/services/projects/prometheus/alerts/create_events_service.rb
@@ -40,17 +40,13 @@ module Projects
def create_managed_prometheus_alert_event(parsed_alert)
alert = find_alert(parsed_alert.metric_id)
- payload_key = PrometheusAlertEvent.payload_key_for(parsed_alert.metric_id, parsed_alert.starts_at_raw)
-
- event = PrometheusAlertEvent.find_or_initialize_by_payload_key(parsed_alert.project, alert, payload_key)
+ event = PrometheusAlertEvent.find_or_initialize_by_payload_key(parsed_alert.project, alert, parsed_alert.gitlab_fingerprint)
set_status(parsed_alert, event)
end
def create_self_managed_prometheus_alert_event(parsed_alert)
- payload_key = SelfManagedPrometheusAlertEvent.payload_key_for(parsed_alert.starts_at_raw, parsed_alert.title, parsed_alert.full_query)
-
- event = SelfManagedPrometheusAlertEvent.find_or_initialize_by_payload_key(parsed_alert.project, payload_key) do |event|
+ event = SelfManagedPrometheusAlertEvent.find_or_initialize_by_payload_key(parsed_alert.project, parsed_alert.gitlab_fingerprint) do |event|
event.environment = parsed_alert.environment
event.title = parsed_alert.title
event.query_expression = parsed_alert.full_query
diff --git a/app/services/projects/prometheus/alerts/notify_service.rb b/app/services/projects/prometheus/alerts/notify_service.rb
index 2583a6cae9f..877a4f99a94 100644
--- a/app/services/projects/prometheus/alerts/notify_service.rb
+++ b/app/services/projects/prometheus/alerts/notify_service.rb
@@ -7,9 +7,19 @@ module Projects
include Gitlab::Utils::StrongMemoize
include IncidentManagement::Settings
+ # This set of keys identifies a payload as a valid Prometheus
+ # payload and thus processable by this service. See also
+ # https://prometheus.io/docs/alerting/configuration/#webhook_config
+ REQUIRED_PAYLOAD_KEYS = %w[
+ version groupKey status receiver groupLabels commonLabels
+ commonAnnotations externalURL alerts
+ ].to_set.freeze
+
+ SUPPORTED_VERSION = '4'
+
def execute(token)
return bad_request unless valid_payload_size?
- return unprocessable_entity unless valid_version?
+ return unprocessable_entity unless self.class.processable?(params)
return unauthorized unless valid_alert_manager_token?(token)
process_prometheus_alerts
@@ -20,6 +30,14 @@ module Projects
ServiceResponse.success
end
+ def self.processable?(params)
+ # Workaround for https://gitlab.com/gitlab-org/gitlab/-/issues/220496
+ return false unless params
+
+ REQUIRED_PAYLOAD_KEYS.subset?(params.keys.to_set) &&
+ params['version'] == SUPPORTED_VERSION
+ end
+
private
def valid_payload_size?
@@ -42,12 +60,10 @@ module Projects
params['alerts']
end
- def valid_version?
- params['version'] == '4'
- end
-
def valid_alert_manager_token?(token)
- valid_for_manual?(token) || valid_for_managed?(token)
+ valid_for_manual?(token) ||
+ valid_for_alerts_endpoint?(token) ||
+ valid_for_managed?(token)
end
def valid_for_manual?(token)
@@ -61,6 +77,13 @@ module Projects
end
end
+ def valid_for_alerts_endpoint?(token)
+ return false unless project.alerts_service_activated?
+
+ # Here we are enforcing the existence of the token
+ compare_token(token, project.alerts_service.token)
+ end
+
def valid_for_managed?(token)
prometheus_application = available_prometheus_application(project)
return false unless prometheus_application
diff --git a/app/services/projects/propagate_service_template.rb b/app/services/projects/propagate_service_template.rb
index 0483c951f1e..4adcda042d1 100644
--- a/app/services/projects/propagate_service_template.rb
+++ b/app/services/projects/propagate_service_template.rb
@@ -26,7 +26,7 @@ module Projects
def propagate_projects_with_template
loop do
- batch = Project.uncached { project_ids_batch }
+ batch = Project.uncached { project_ids_without_integration }
bulk_create_from_template(batch) unless batch.empty?
@@ -35,40 +35,36 @@ module Projects
end
def bulk_create_from_template(batch)
- service_list = batch.map do |project_id|
- service_hash.values << project_id
- end
+ service_list = ServiceList.new(batch, service_hash).to_array
Project.transaction do
- results = bulk_insert(Service, service_hash.keys << 'project_id', service_list)
+ results = bulk_insert(*service_list)
if data_fields_present?
- data_list = results.map { |row| data_hash.values << row['id'] }
+ data_list = DataList.new(results, data_fields_hash, template.data_fields.class).to_array
- bulk_insert(template.data_fields.class, data_hash.keys << 'service_id', data_list)
+ bulk_insert(*data_list)
end
run_callbacks(batch)
end
end
- def project_ids_batch
- Project.connection.select_values(
- <<-SQL
- SELECT id
- FROM projects
- WHERE NOT EXISTS (
- SELECT true
- FROM services
- WHERE services.project_id = projects.id
- AND services.type = #{ActiveRecord::Base.connection.quote(template.type)}
- )
- AND projects.pending_delete = false
- AND projects.archived = false
- LIMIT #{BATCH_SIZE}
- SQL
- )
+ # rubocop: disable CodeReuse/ActiveRecord
+ def project_ids_without_integration
+ services = Service
+ .select('1')
+ .where('services.project_id = projects.id')
+ .where(type: template.type)
+
+ Project
+ .where('NOT EXISTS (?)', services)
+ .where(pending_delete: false)
+ .where(archived: false)
+ .limit(BATCH_SIZE)
+ .pluck(:id)
end
+ # rubocop: enable CodeReuse/ActiveRecord
def bulk_insert(klass, columns, values_array)
items_to_insert = values_array.map { |array| Hash[columns.zip(array)] }
@@ -77,11 +73,11 @@ module Projects
end
def service_hash
- @service_hash ||= template.as_json(methods: :type, except: %w[id template project_id])
+ @service_hash ||= template.to_service_hash
end
- def data_hash
- @data_hash ||= template.data_fields.as_json(only: template.data_fields.class.column_names).except('id', 'service_id')
+ def data_fields_hash
+ @data_fields_hash ||= template.to_data_fields_hash
end
# rubocop: disable CodeReuse/ActiveRecord
diff --git a/app/services/projects/update_remote_mirror_service.rb b/app/services/projects/update_remote_mirror_service.rb
index e554bed6819..5f8ef75a8d7 100644
--- a/app/services/projects/update_remote_mirror_service.rb
+++ b/app/services/projects/update_remote_mirror_service.rb
@@ -27,7 +27,11 @@ module Projects
remote_mirror.update_start!
remote_mirror.ensure_remote!
- repository.fetch_remote(remote_mirror.remote_name, ssh_auth: remote_mirror, no_tags: true)
+
+ # https://gitlab.com/gitlab-org/gitaly/-/issues/2670
+ if Feature.disabled?(:gitaly_ruby_remote_branches_ls_remote)
+ repository.fetch_remote(remote_mirror.remote_name, ssh_auth: remote_mirror, no_tags: true)
+ end
response = remote_mirror.update_repository
diff --git a/app/services/projects/update_repository_storage_service.rb b/app/services/projects/update_repository_storage_service.rb
index 0632df6f6d7..fa8d4c5aa5f 100644
--- a/app/services/projects/update_repository_storage_service.rb
+++ b/app/services/projects/update_repository_storage_service.rb
@@ -24,7 +24,7 @@ module Projects
mark_old_paths_for_archive
repository_storage_move.finish!
- project.update!(repository_storage: destination_storage_name, repository_read_only: false)
+
project.leave_pool_repository
project.track_project_repository
end
@@ -34,10 +34,7 @@ module Projects
ServiceResponse.success
rescue StandardError => e
- project.transaction do
- repository_storage_move.do_fail!
- project.update!(repository_read_only: false)
- end
+ repository_storage_move.do_fail!
Gitlab::ErrorTracking.track_exception(e, project_path: project.full_path)
diff --git a/app/services/projects/update_service.rb b/app/services/projects/update_service.rb
index e10dede632a..58c9bce963b 100644
--- a/app/services/projects/update_service.rb
+++ b/app/services/projects/update_service.rb
@@ -13,8 +13,12 @@ module Projects
ensure_wiki_exists if enabling_wiki?
- if changing_storage_size?
- project.change_repository_storage(params.delete(:repository_storage))
+ if changing_repository_storage?
+ storage_move = project.repository_storage_moves.build(
+ source_storage_name: project.repository_storage,
+ destination_storage_name: params.delete(:repository_storage)
+ )
+ storage_move.schedule
end
yield if block_given?
@@ -132,7 +136,7 @@ module Projects
def ensure_wiki_exists
ProjectWiki.new(project, project.owner).wiki
- rescue ProjectWiki::CouldNotCreateWikiError
+ rescue Wiki::CouldNotCreateWikiError
log_error("Could not create wiki for #{project.full_name}")
Gitlab::Metrics.counter(:wiki_can_not_be_created_total, 'Counts the times we failed to create a wiki').increment
end
@@ -145,10 +149,11 @@ module Projects
project.previous_changes.include?(:pages_https_only)
end
- def changing_storage_size?
+ def changing_repository_storage?
new_repository_storage = params[:repository_storage]
new_repository_storage && project.repository.exists? &&
+ project.repository_storage != new_repository_storage &&
can?(current_user, :change_repository_storage, project)
end
end
diff --git a/app/services/projects/update_statistics_service.rb b/app/services/projects/update_statistics_service.rb
index cc6ffa9eafc..a0793cff2df 100644
--- a/app/services/projects/update_statistics_service.rb
+++ b/app/services/projects/update_statistics_service.rb
@@ -5,7 +5,7 @@ module Projects
def execute
return unless project
- Rails.logger.info("Updating statistics for project #{project.id}") # rubocop:disable Gitlab/RailsLogger
+ Gitlab::AppLogger.info("Updating statistics for project #{project.id}")
project.statistics.refresh!(only: statistics.map(&:to_sym))
end