Add latest changes from gitlab-org/gitlab@master
This commit is contained in:
parent
810bb7ad35
commit
118f3e3bdb
|
@ -13,12 +13,8 @@ class PagesTransferWorker # rubocop:disable Scalability/IdempotentWorker
|
|||
loggable_arguments 0, 1
|
||||
|
||||
def perform(method, args)
|
||||
return unless Gitlab::PagesTransfer::METHODS.include?(method)
|
||||
|
||||
result = Gitlab::PagesTransfer.new.public_send(method, *args) # rubocop:disable GitlabSecurity/PublicSend
|
||||
|
||||
# If result isn't truthy, the move failed. Promote this to an
|
||||
# exception so that it will be logged and retried appropriately
|
||||
raise TransferFailedError unless result
|
||||
# noop
|
||||
# This worker is not necessary anymore and will be removed
|
||||
# https://gitlab.com/gitlab-org/gitlab/-/issues/340616
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1,38 +0,0 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
# To make a call happen in a new Sidekiq job, add `.async` before the call. For
|
||||
# instance:
|
||||
#
|
||||
# PagesTransfer.new.async.move_namespace(...)
|
||||
#
|
||||
module Gitlab
|
||||
class PagesTransfer < ProjectTransfer
|
||||
METHODS = %w[move_namespace move_project rename_project rename_namespace].freeze
|
||||
|
||||
class Async
|
||||
METHODS.each do |meth|
|
||||
define_method meth do |*args|
|
||||
next unless Settings.pages.local_store.enabled
|
||||
|
||||
PagesTransferWorker.perform_async(meth, args)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
METHODS.each do |meth|
|
||||
define_method meth do |*args|
|
||||
next unless Settings.pages.local_store.enabled
|
||||
|
||||
super(*args)
|
||||
end
|
||||
end
|
||||
|
||||
def async
|
||||
@async ||= Async.new
|
||||
end
|
||||
|
||||
def root_dir
|
||||
Gitlab.config.pages.path
|
||||
end
|
||||
end
|
||||
end
|
|
@ -1,157 +0,0 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require 'spec_helper'
|
||||
|
||||
RSpec.describe Gitlab::PagesTransfer do
|
||||
describe '#async' do
|
||||
let(:async) { subject.async }
|
||||
|
||||
context 'when receiving an allowed method' do
|
||||
it 'schedules a PagesTransferWorker', :aggregate_failures do
|
||||
described_class::METHODS.each do |meth|
|
||||
expect(PagesTransferWorker)
|
||||
.to receive(:perform_async).with(meth, %w[foo bar])
|
||||
|
||||
async.public_send(meth, 'foo', 'bar')
|
||||
end
|
||||
end
|
||||
|
||||
it 'does nothing if legacy storage is disabled' do
|
||||
allow(Settings.pages.local_store).to receive(:enabled).and_return(false)
|
||||
|
||||
described_class::METHODS.each do |meth|
|
||||
expect(PagesTransferWorker)
|
||||
.not_to receive(:perform_async)
|
||||
|
||||
async.public_send(meth, 'foo', 'bar')
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
context 'when receiving a private method' do
|
||||
it 'raises NoMethodError' do
|
||||
expect { async.move('foo', 'bar') }.to raise_error(NoMethodError)
|
||||
end
|
||||
end
|
||||
|
||||
context 'when receiving a non-existent method' do
|
||||
it 'raises NoMethodError' do
|
||||
expect { async.foo('bar') }.to raise_error(NoMethodError)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
RSpec.shared_examples 'moving a pages directory' do |parameter|
|
||||
let!(:pages_path_before) { project.pages_path }
|
||||
let(:config_path_before) { File.join(pages_path_before, 'config.json') }
|
||||
let(:pages_path_after) { project.reload.pages_path }
|
||||
let(:config_path_after) { File.join(pages_path_after, 'config.json') }
|
||||
|
||||
before do
|
||||
FileUtils.mkdir_p(pages_path_before)
|
||||
FileUtils.touch(config_path_before)
|
||||
end
|
||||
|
||||
after do
|
||||
FileUtils.remove_entry(pages_path_before, true)
|
||||
FileUtils.remove_entry(pages_path_after, true)
|
||||
end
|
||||
|
||||
it 'moves the directory' do
|
||||
subject.public_send(meth, *args)
|
||||
|
||||
expect(File.exist?(config_path_before)).to be(false)
|
||||
expect(File.exist?(config_path_after)).to be(true)
|
||||
end
|
||||
|
||||
it 'returns false if it fails to move the directory' do
|
||||
# Move the directory once, so it can't be moved again
|
||||
subject.public_send(meth, *args)
|
||||
|
||||
expect(subject.public_send(meth, *args)).to be(false)
|
||||
end
|
||||
|
||||
it 'does nothing if legacy storage is disabled' do
|
||||
allow(Settings.pages.local_store).to receive(:enabled).and_return(false)
|
||||
|
||||
subject.public_send(meth, *args)
|
||||
|
||||
expect(File.exist?(config_path_before)).to be(true)
|
||||
expect(File.exist?(config_path_after)).to be(false)
|
||||
end
|
||||
end
|
||||
|
||||
describe '#move_namespace' do
|
||||
# Can't use let_it_be because we change the path
|
||||
let(:group_1) { create(:group) }
|
||||
let(:group_2) { create(:group) }
|
||||
let(:subgroup) { create(:group, parent: group_1) }
|
||||
let(:project) { create(:project, group: subgroup) }
|
||||
let(:new_path) { "#{group_2.path}/#{subgroup.path}" }
|
||||
let(:meth) { 'move_namespace' }
|
||||
|
||||
# Store the path before we change it
|
||||
let!(:args) { [project.path, subgroup.full_path, new_path] }
|
||||
|
||||
before do
|
||||
# We need to skip hooks, otherwise the directory will be moved
|
||||
# via an ActiveRecord callback
|
||||
subgroup.update_columns(parent_id: group_2.id)
|
||||
subgroup.route.update!(path: new_path)
|
||||
end
|
||||
|
||||
include_examples 'moving a pages directory'
|
||||
end
|
||||
|
||||
describe '#move_project' do
|
||||
# Can't use let_it_be because we change the path
|
||||
let(:group_1) { create(:group) }
|
||||
let(:group_2) { create(:group) }
|
||||
let(:project) { create(:project, group: group_1) }
|
||||
let(:new_path) { group_2.path }
|
||||
let(:meth) { 'move_project' }
|
||||
let(:args) { [project.path, group_1.full_path, group_2.full_path] }
|
||||
|
||||
include_examples 'moving a pages directory' do
|
||||
before do
|
||||
project.update!(group: group_2)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe '#rename_project' do
|
||||
# Can't use let_it_be because we change the path
|
||||
let(:project) { create(:project) }
|
||||
let(:new_path) { project.path.succ }
|
||||
let(:meth) { 'rename_project' }
|
||||
|
||||
# Store the path before we change it
|
||||
let!(:args) { [project.path, new_path, project.namespace.full_path] }
|
||||
|
||||
include_examples 'moving a pages directory' do
|
||||
before do
|
||||
project.update!(path: new_path)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe '#rename_namespace' do
|
||||
# Can't use let_it_be because we change the path
|
||||
let(:group) { create(:group) }
|
||||
let(:project) { create(:project, group: group) }
|
||||
let(:new_path) { project.namespace.full_path.succ }
|
||||
let(:meth) { 'rename_namespace' }
|
||||
|
||||
# Store the path before we change it
|
||||
let!(:args) { [project.namespace.full_path, new_path] }
|
||||
|
||||
before do
|
||||
# We need to skip hooks, otherwise the directory will be moved
|
||||
# via an ActiveRecord callback
|
||||
group.update_columns(path: new_path)
|
||||
group.route.update!(path: new_path)
|
||||
end
|
||||
|
||||
include_examples 'moving a pages directory'
|
||||
end
|
||||
end
|
|
@ -1,38 +0,0 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require 'spec_helper'
|
||||
|
||||
RSpec.describe PagesTransferWorker do
|
||||
describe '#perform' do
|
||||
Gitlab::PagesTransfer::METHODS.each do |meth|
|
||||
context "when method is #{meth}" do
|
||||
let(:args) { [1, 2, 3] }
|
||||
|
||||
it 'calls the service with the given arguments' do
|
||||
expect_next_instance_of(Gitlab::PagesTransfer) do |service|
|
||||
expect(service).to receive(meth).with(*args).and_return(true)
|
||||
end
|
||||
|
||||
subject.perform(meth, args)
|
||||
end
|
||||
|
||||
it 'raises an error when the service returns false' do
|
||||
expect_next_instance_of(Gitlab::PagesTransfer) do |service|
|
||||
expect(service).to receive(meth).with(*args).and_return(false)
|
||||
end
|
||||
|
||||
expect { subject.perform(meth, args) }
|
||||
.to raise_error(described_class::TransferFailedError)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe 'when method is not allowed' do
|
||||
it 'does nothing' do
|
||||
expect(Gitlab::PagesTransfer).not_to receive(:new)
|
||||
|
||||
subject.perform('object_id', [])
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
Loading…
Reference in New Issue