summaryrefslogtreecommitdiff
path: root/spec/support
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2020-03-02 21:08:01 +0000
committerGitLab Bot <gitlab-bot@gitlab.com>2020-03-02 21:08:01 +0000
commit561e1b470f0a99fe6304c8f197348c47a637d594 (patch)
tree6b361b6b0b412b70450aca167079c50a13bd88d8 /spec/support
parent7b52c7cb634ef7047d30b0337fe477bcdcedf41d (diff)
downloadgitlab-ce-561e1b470f0a99fe6304c8f197348c47a637d594.tar.gz
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'spec/support')
-rw-r--r--spec/support/shared_examples/services/projects/update_repository_storage_service_shared_examples.rb101
1 files changed, 101 insertions, 0 deletions
diff --git a/spec/support/shared_examples/services/projects/update_repository_storage_service_shared_examples.rb b/spec/support/shared_examples/services/projects/update_repository_storage_service_shared_examples.rb
new file mode 100644
index 00000000000..f222dff60ab
--- /dev/null
+++ b/spec/support/shared_examples/services/projects/update_repository_storage_service_shared_examples.rb
@@ -0,0 +1,101 @@
+# frozen_string_literal: true
+
+RSpec.shared_examples 'moves repository to another storage' do |repository_type|
+ let(:project_repository_double) { double(:repository) }
+ let(:repository_double) { double(:repository) }
+
+ before do
+ # Default stub for non-specified params
+ allow(Gitlab::Git::Repository).to receive(:new).and_call_original
+
+ allow(Gitlab::Git::Repository).to receive(:new)
+ .with('test_second_storage', project.repository.raw.relative_path, project.repository.gl_repository, project.repository.full_path)
+ .and_return(project_repository_double)
+
+ allow(Gitlab::Git::Repository).to receive(:new)
+ .with('test_second_storage', repository.raw.relative_path, repository.gl_repository, repository.full_path)
+ .and_return(repository_double)
+ end
+
+ context 'when the move succeeds', :clean_gitlab_redis_shared_state do
+ before do
+ allow(project_repository_double)
+ .to receive(:fetch_repository_as_mirror)
+ .with(project.repository.raw)
+ .and_return(true)
+
+ allow(repository_double)
+ .to receive(:fetch_repository_as_mirror)
+ .with(repository.raw)
+ .and_return(true)
+ end
+
+ it "moves the project and its #{repository_type} repository to the new storage and unmarks the repository as read only" do
+ old_project_repository_path = Gitlab::GitalyClient::StorageSettings.allow_disk_access do
+ project.repository.path_to_repo
+ end
+
+ old_repository_path = repository.full_path
+
+ subject.execute('test_second_storage')
+
+ expect(project).not_to be_repository_read_only
+ expect(project.repository_storage).to eq('test_second_storage')
+ expect(gitlab_shell.repository_exists?('default', old_project_repository_path)).to be(false)
+ expect(gitlab_shell.repository_exists?('default', old_repository_path)).to be(false)
+ end
+
+ context ':repack_after_shard_migration feature flag disabled' do
+ before do
+ stub_feature_flags(repack_after_shard_migration: false)
+ end
+
+ it 'does not enqueue a GC run' do
+ expect { subject.execute('test_second_storage') }
+ .not_to change(GitGarbageCollectWorker.jobs, :count)
+ end
+ end
+
+ context ':repack_after_shard_migration feature flag enabled' do
+ before do
+ stub_feature_flags(repack_after_shard_migration: true)
+ end
+
+ it 'does not enqueue a GC run if housekeeping is disabled' do
+ stub_application_setting(housekeeping_enabled: false)
+
+ expect { subject.execute('test_second_storage') }
+ .not_to change(GitGarbageCollectWorker.jobs, :count)
+ end
+
+ it 'enqueues a GC run' do
+ expect { subject.execute('test_second_storage') }
+ .to change(GitGarbageCollectWorker.jobs, :count).by(1)
+ end
+ end
+ end
+
+ context 'when the project is already on the target storage' do
+ it 'bails out and does nothing' do
+ expect do
+ subject.execute(project.repository_storage)
+ end.to raise_error(described_class::RepositoryAlreadyMoved)
+ end
+ end
+
+ context "when the move of the #{repository_type} repository fails" do
+ it 'unmarks the repository as read-only without updating the repository storage' do
+ allow(project_repository_double).to receive(:fetch_repository_as_mirror)
+ .with(project.repository.raw).and_return(true)
+ allow(repository_double).to receive(:fetch_repository_as_mirror)
+ .with(repository.raw).and_return(false)
+
+ expect(GitlabShellWorker).not_to receive(:perform_async)
+
+ subject.execute('test_second_storage')
+
+ expect(project).not_to be_repository_read_only
+ expect(project.repository_storage).to eq('default')
+ end
+ end
+end