diff options
Diffstat (limited to 'app/models/project_repository_storage_move.rb')
-rw-r--r-- | app/models/project_repository_storage_move.rb | 105 |
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 |