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:
Diffstat (limited to 'app/models/project_repository_storage_move.rb')
-rw-r--r--app/models/project_repository_storage_move.rb105
1 files changed, 18 insertions, 87 deletions
diff --git a/app/models/project_repository_storage_move.rb b/app/models/project_repository_storage_move.rb
index 3429dbe3a85..1e3782a1fb5 100644
--- a/app/models/project_repository_storage_move.rb
+++ b/app/models/project_repository_storage_move.rb
@@ -4,100 +4,31 @@
# project. For example, moving a project to another gitaly node to help
# balance storage capacity.
class ProjectRepositoryStorageMove < ApplicationRecord
- include AfterCommitQueue
+ extend ::Gitlab::Utils::Override
+ include RepositoryStorageMovable
- belongs_to :project, inverse_of: :repository_storage_moves
+ belongs_to :container, class_name: 'Project', inverse_of: :repository_storage_moves, foreign_key: :project_id
+ alias_attribute :project, :container
+ scope :with_projects, -> { includes(container: :route) }
- validates :project, presence: true
- validates :state, presence: true
- validates :source_storage_name,
- on: :create,
- presence: true,
- inclusion: { in: ->(_) { Gitlab.config.repositories.storages.keys } }
- validates :destination_storage_name,
- on: :create,
- presence: true,
- inclusion: { in: ->(_) { Gitlab.config.repositories.storages.keys } }
- validate :project_repository_writable, on: :create
-
- default_value_for(:destination_storage_name, allows_nil: false) do
- pick_repository_storage
- end
-
- state_machine initial: :initial do
- event :schedule do
- transition initial: :scheduled
- end
-
- event :start do
- transition scheduled: :started
- end
-
- event :finish_replication do
- transition started: :replicated
- end
-
- event :finish_cleanup do
- transition replicated: :finished
- end
-
- event :do_fail do
- transition [:initial, :scheduled, :started] => :failed
- transition replicated: :cleanup_failed
- end
-
- around_transition initial: :scheduled do |storage_move, block|
- block.call
-
- begin
- storage_move.project.set_repository_read_only!
- rescue => err
- errors.add(:project, err.message)
- next false
- end
-
- storage_move.run_after_commit do
- ProjectUpdateRepositoryStorageWorker.perform_async(
- storage_move.project_id,
- storage_move.destination_storage_name,
- storage_move.id
- )
- end
-
- true
- end
-
- before_transition started: :replicated do |storage_move|
- storage_move.project.set_repository_writable!
-
- storage_move.project.update_column(:repository_storage, storage_move.destination_storage_name)
- end
-
- before_transition started: :failed do |storage_move|
- storage_move.project.set_repository_writable!
- end
-
- state :initial, value: 1
- state :scheduled, value: 2
- state :started, value: 3
- state :finished, value: 4
- state :failed, value: 5
- state :replicated, value: 6
- state :cleanup_failed, value: 7
+ override :update_repository_storage
+ def update_repository_storage(new_storage)
+ container.update_column(:repository_storage, new_storage)
end
- scope :order_created_at_desc, -> { order(created_at: :desc) }
- scope :with_projects, -> { includes(project: :route) }
-
- class << self
- def pick_repository_storage
- Project.pick_repository_storage
- end
+ override :schedule_repository_storage_update_worker
+ def schedule_repository_storage_update_worker
+ ProjectUpdateRepositoryStorageWorker.perform_async(
+ project_id,
+ destination_storage_name,
+ id
+ )
end
private
- def project_repository_writable
- errors.add(:project, _('is read only')) if project&.repository_read_only?
+ override :error_key
+ def error_key
+ :project
end
end