58 lines
1.6 KiB
Ruby
58 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
|