Files
gitlab-ce/lib/api/admin/batched_background_migrations.rb
2025-04-16 18:17:53 +00:00

159 lines
5.7 KiB
Ruby

# frozen_string_literal: true
module API
module Admin
class BatchedBackgroundMigrations < ::API::Base
feature_category :database
urgency :low
before do
authenticated_as_admin!
end
namespace 'admin' do
resources 'batched_background_migrations/:id' do
desc 'Retrieve a batched background migration' do
success ::API::Entities::BatchedBackgroundMigration
failure [
{ code: 401, message: '401 Unauthorized' },
{ code: 403, message: '403 Forbidden' },
{ code: 404, message: '404 Not found' }
]
tags %w[batched_background_migrations]
end
params do
optional :database,
type: String,
values: Gitlab::Database.all_database_names,
desc: 'The name of the database',
default: 'main'
requires :id,
type: Integer,
desc: 'The batched background migration id'
end
get do
Gitlab::Database::SharedModel.using_connection(base_model.connection) do
present_entity(batched_background_migration)
end
end
end
resources 'batched_background_migrations' do
desc 'Get the list of batched background migrations' do
success ::API::Entities::BatchedBackgroundMigration
failure [
{ code: 401, message: '401 Unauthorized' },
{ code: 403, message: '403 Forbidden' }
]
is_array true
tags %w[batched_background_migrations]
end
params do
optional :database,
type: String,
values: Gitlab::Database.all_database_names,
desc: 'The name of the database, the default `main`',
default: 'main'
optional :job_class_name,
type: String,
desc: 'Filter migrations by job class name.'
end
get do
Gitlab::Database::SharedModel.using_connection(base_model.connection) do
migrations = Database::BatchedBackgroundMigrationsFinder.new(params: params).execute
present_entity(migrations)
end
end
end
resources 'batched_background_migrations/:id/resume' do
desc 'Resume a batched background migration' do
success ::API::Entities::BatchedBackgroundMigration
failure [
{ code: 401, message: '401 Unauthorized' },
{ code: 403, message: '403 Forbidden' },
{ code: 404, message: '404 Not found' },
{ code: 422, message: 'You can resume only `paused` batched background migrations.' }
]
tags %w[batched_background_migrations]
end
params do
optional :database,
type: String,
values: Gitlab::Database.all_database_names,
desc: 'The name of the database',
default: 'main'
requires :id,
type: Integer,
desc: 'The batched background migration id'
end
put do
Gitlab::Database::SharedModel.using_connection(base_model.connection) do
unless batched_background_migration.paused?
msg = 'You can resume only `paused` batched background migrations.'
render_api_error!(msg, 422)
end
batched_background_migration.execute!
present_entity(batched_background_migration)
end
end
end
resources 'batched_background_migrations/:id/pause' do
desc 'Pause a batched background migration' do
success ::API::Entities::BatchedBackgroundMigration
failure [
{ code: 401, message: '401 Unauthorized' },
{ code: 403, message: '403 Forbidden' },
{ code: 404, message: '404 Not found' },
{ code: 422, message: 'You can pause only `active` batched background migrations.' }
]
tags %w[batched_background_migrations]
end
params do
optional :database,
type: String,
values: Gitlab::Database.all_database_names,
desc: 'The name of the database',
default: 'main'
requires :id,
type: Integer,
desc: 'The batched background migration id'
end
put do
Gitlab::Database::SharedModel.using_connection(base_model.connection) do
unless batched_background_migration.active?
msg = 'You can pause only `active` batched background migrations.'
render_api_error!(msg, 422)
end
batched_background_migration.pause!
present_entity(batched_background_migration)
end
end
end
end
helpers do
def batched_background_migration
@batched_background_migration ||= Gitlab::Database::BackgroundMigration::BatchedMigration.find(params[:id])
end
def base_model
database = params[:database] || Gitlab::Database::MAIN_DATABASE_NAME
@base_model ||= Gitlab::Database.database_base_models[database]
end
# Force progress evaluation to occur now while we're using the right connection
def present_entity(result)
representation = entity_representation_for(::API::Entities::BatchedBackgroundMigration, result, {})
json_representation = Gitlab::Json.dump(representation)
body Gitlab::Json::PrecompiledJson.new(json_representation)
end
end
end
end
end