59 lines
1.6 KiB
Ruby
59 lines
1.6 KiB
Ruby
|
# frozen_string_literal: true
|
||
|
|
||
|
# ProjectRepositoryStorageMove are details of repository storage moves for a
|
||
|
# project. For example, moving a project to another gitaly node to help
|
||
|
# balance storage capacity.
|
||
|
class ProjectRepositoryStorageMove < ApplicationRecord
|
||
|
include AfterCommitQueue
|
||
|
|
||
|
belongs_to :project, inverse_of: :repository_storage_moves
|
||
|
|
||
|
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 } }
|
||
|
|
||
|
state_machine initial: :initial do
|
||
|
event :schedule do
|
||
|
transition initial: :scheduled
|
||
|
end
|
||
|
|
||
|
event :start do
|
||
|
transition scheduled: :started
|
||
|
end
|
||
|
|
||
|
event :finish do
|
||
|
transition started: :finished
|
||
|
end
|
||
|
|
||
|
event :do_fail do
|
||
|
transition [:initial, :scheduled, :started] => :failed
|
||
|
end
|
||
|
|
||
|
after_transition initial: :scheduled do |storage_move, _|
|
||
|
storage_move.run_after_commit do
|
||
|
ProjectUpdateRepositoryStorageWorker.perform_async(
|
||
|
storage_move.project_id,
|
||
|
storage_move.destination_storage_name,
|
||
|
storage_move.id
|
||
|
)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
state :initial, value: 1
|
||
|
state :scheduled, value: 2
|
||
|
state :started, value: 3
|
||
|
state :finished, value: 4
|
||
|
state :failed, value: 5
|
||
|
end
|
||
|
|
||
|
scope :order_created_at_desc, -> { order(created_at: :desc) }
|
||
|
scope :with_projects, -> { includes(project: :route) }
|
||
|
end
|