diff options
Diffstat (limited to 'spec/tasks/gitlab/backup_rake_spec.rb')
-rw-r--r-- | spec/tasks/gitlab/backup_rake_spec.rb | 111 |
1 files changed, 57 insertions, 54 deletions
diff --git a/spec/tasks/gitlab/backup_rake_spec.rb b/spec/tasks/gitlab/backup_rake_spec.rb index a2cc2b12e5e..8963164ac53 100644 --- a/spec/tasks/gitlab/backup_rake_spec.rb +++ b/spec/tasks/gitlab/backup_rake_spec.rb @@ -284,62 +284,75 @@ RSpec.describe 'gitlab:app namespace rake task', :delete do end context 'multiple repository storages' do - let_it_be(:default_storage_hash) { Gitlab.config.repositories.storages.default.to_h } + include StubConfiguration + + let(:default_storage_name) { 'default' } + let(:second_storage_name) { 'test_second_storage' } before do # We only need a backup of the repositories for this test stub_env('SKIP', 'db,uploads,builds,artifacts,lfs,registry') - - allow(Gitlab.config.repositories).to receive(:storages).and_return(storages) - - # Avoid asking gitaly about the root ref (which will fail because of the - # mocked storages) - allow_any_instance_of(Repository).to receive(:empty?).and_return(false) - - FileUtils.mkdir_p(b_storage_dir) - - # Even when overriding the storage, we have to move it there, so it exists - Gitlab::GitalyClient::StorageSettings.allow_disk_access do - FileUtils.mv( - File.join(Settings.absolute(storages['default'].legacy_disk_path), project_b.repository.disk_path + '.git'), - Rails.root.join(storages['test_second_storage'].legacy_disk_path, project_b.repository.disk_path + '.git') - ) - end - end - - after do - FileUtils.rm_rf(test_second_storage_dir) + stub_storage_settings( second_storage_name => { + 'gitaly_address' => Gitlab.config.repositories.storages.default.gitaly_address, + 'path' => TestEnv::SECOND_STORAGE_PATH + }) end - let(:test_second_storage_dir) { Dir.mktmpdir } + shared_examples 'includes repositories in all repository storages' do + specify :aggregate_failures do + project_a = create(:project, :repository) + project_a.track_project_repository + project_snippet_a = create(:project_snippet, :repository, project: project_a, author: project_a.owner) + project_b = create(:project, :repository, repository_storage: second_storage_name) + project_b.track_project_repository + project_snippet_b = create(:project_snippet, :repository, project: project_b, author: project_b.owner) + project_snippet_b.snippet_repository.update!(shard: project_b.project_repository.shard) + create(:wiki_page, container: project_a) + create(:design, :with_file, issue: create(:issue, project: project_a)) + + move_repository_to_secondary(project_b) + move_repository_to_secondary(project_snippet_b) - let(:test_second_storage) do - Gitlab::GitalyClient::StorageSettings.new(default_storage_hash.merge('path' => test_second_storage_dir)) - end - - let(:storages) do - { - 'default' => Gitlab.config.repositories.storages.default, - 'test_second_storage' => test_second_storage - } - end - - let!(:project_a) { create(:project, :repository) } - let!(:project_b) { create(:project, :repository, repository_storage: 'test_second_storage') } - let!(:b_storage_dir) { File.join(test_second_storage_dir, File.dirname(project_b.disk_path)) } - - context 'no concurrency' do - it 'includes repositories in all repository storages' do expect { run_rake_task('gitlab:backup:create') }.to output.to_stdout tar_contents, exit_status = Gitlab::Popen.popen( %W{tar -tvf #{backup_tar} repositories} ) + tar_lines = tar_contents.lines.grep(/\.bundle/) + expect(exit_status).to eq(0) - expect(tar_contents).to match("repositories/#{project_a.disk_path}.bundle") - expect(tar_contents).to match("repositories/#{project_b.disk_path}.bundle") + + [ + "#{project_a.disk_path}.bundle", + "#{project_a.disk_path}.wiki.bundle", + "#{project_a.disk_path}.design.bundle", + "#{project_b.disk_path}.bundle", + "#{project_snippet_a.disk_path}.bundle", + "#{project_snippet_b.disk_path}.bundle" + ].each do |repo_name| + expect(tar_lines.grep(/#{repo_name}/).size).to eq 1 + end end + + def move_repository_to_secondary(record) + Gitlab::GitalyClient::StorageSettings.allow_disk_access do + default_shard_legacy_path = Gitlab.config.repositories.storages.default.legacy_disk_path + secondary_legacy_path = Gitlab.config.repositories.storages[second_storage_name].legacy_disk_path + dst_dir = File.join(secondary_legacy_path, File.dirname(record.disk_path)) + + FileUtils.mkdir_p(dst_dir) unless Dir.exist?(dst_dir) + + FileUtils.mv( + File.join(default_shard_legacy_path, record.disk_path + '.git'), + File.join(secondary_legacy_path, record.disk_path + '.git') + ) + end + end + end + + context 'no concurrency' do + it_behaves_like 'includes repositories in all repository storages' end context 'with concurrency' do @@ -347,17 +360,7 @@ RSpec.describe 'gitlab:app namespace rake task', :delete do stub_env('GITLAB_BACKUP_MAX_CONCURRENCY', 4) end - it 'includes repositories in all repository storages' do - expect { run_rake_task('gitlab:backup:create') }.to output.to_stdout - - tar_contents, exit_status = Gitlab::Popen.popen( - %W{tar -tvf #{backup_tar} repositories} - ) - - expect(exit_status).to eq(0) - expect(tar_contents).to match("repositories/#{project_a.disk_path}.bundle") - expect(tar_contents).to match("repositories/#{project_b.disk_path}.bundle") - end + it_behaves_like 'includes repositories in all repository storages' end end @@ -370,7 +373,7 @@ RSpec.describe 'gitlab:app namespace rake task', :delete do end it 'has defaults' do - expect_next_instance_of(::Backup::Repository) do |instance| + expect_next_instance_of(::Backup::Repositories) do |instance| expect(instance).to receive(:dump) .with(max_concurrency: 1, max_storage_concurrency: 1) .and_call_original @@ -383,7 +386,7 @@ RSpec.describe 'gitlab:app namespace rake task', :delete do stub_env('GITLAB_BACKUP_MAX_CONCURRENCY', 5) stub_env('GITLAB_BACKUP_MAX_STORAGE_CONCURRENCY', 2) - expect_next_instance_of(::Backup::Repository) do |instance| + expect_next_instance_of(::Backup::Repositories) do |instance| expect(instance).to receive(:dump) .with(max_concurrency: 5, max_storage_concurrency: 2) .and_call_original |