Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'spec/services/projects/hashed_storage')
-rw-r--r--spec/services/projects/hashed_storage/migrate_repository_service_spec.rb152
-rw-r--r--spec/services/projects/hashed_storage/migration_service_spec.rb44
-rw-r--r--spec/services/projects/hashed_storage/rollback_attachments_service_spec.rb106
-rw-r--r--spec/services/projects/hashed_storage/rollback_repository_service_spec.rb152
-rw-r--r--spec/services/projects/hashed_storage/rollback_service_spec.rb78
5 files changed, 0 insertions, 532 deletions
diff --git a/spec/services/projects/hashed_storage/migrate_repository_service_spec.rb b/spec/services/projects/hashed_storage/migrate_repository_service_spec.rb
deleted file mode 100644
index e21d8b6fa83..00000000000
--- a/spec/services/projects/hashed_storage/migrate_repository_service_spec.rb
+++ /dev/null
@@ -1,152 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Projects::HashedStorage::MigrateRepositoryService, feature_category: :groups_and_projects do
- let(:gitlab_shell) { Gitlab::Shell.new }
- let(:project) { create(:project, :legacy_storage, :repository, :wiki_repo, :design_repo) }
- let(:legacy_storage) { Storage::LegacyProject.new(project) }
- let(:hashed_storage) { Storage::Hashed.new(project) }
-
- subject(:service) { described_class.new(project: project, old_disk_path: project.disk_path) }
-
- describe '#execute' do
- let(:old_disk_path) { legacy_storage.disk_path }
- let(:new_disk_path) { hashed_storage.disk_path }
-
- before do
- allow(service).to receive(:gitlab_shell) { gitlab_shell }
- end
-
- context 'repository lock' do
- it 'tries to lock the repository' do
- expect(service).to receive(:try_to_set_repository_read_only!)
-
- service.execute
- end
-
- it 'fails when a git operation is in progress' do
- allow(project).to receive(:git_transfer_in_progress?) { true }
-
- expect { service.execute }.to raise_error(Projects::HashedStorage::RepositoryInUseError)
- end
- end
-
- context 'when repository doesnt exist on disk' do
- let(:project) { create(:project, :legacy_storage) }
-
- it 'skips the disk change but increase the version' do
- service.execute
-
- expect(project.hashed_storage?(:repository)).to be_truthy
- end
- end
-
- context 'when succeeds' do
- it 'renames project, wiki and design repositories' do
- service.execute
-
- expect(gitlab_shell.repository_exists?(project.repository_storage, "#{new_disk_path}.git")).to be_truthy
- expect(gitlab_shell.repository_exists?(project.repository_storage, "#{new_disk_path}.wiki.git")).to be_truthy
- expect(gitlab_shell.repository_exists?(project.repository_storage, "#{new_disk_path}.design.git")).to be_truthy
- end
-
- it 'updates project to be hashed and not read-only' do
- service.execute
-
- expect(project.hashed_storage?(:repository)).to be_truthy
- expect(project.repository_read_only).to be_falsey
- end
-
- it 'move operation is called for all repositories' do
- expect_move_repository(old_disk_path, new_disk_path)
- expect_move_repository("#{old_disk_path}.wiki", "#{new_disk_path}.wiki")
- expect_move_repository("#{old_disk_path}.design", "#{new_disk_path}.design")
-
- service.execute
- end
-
- it 'writes project full path to gitaly' do
- service.execute
-
- expect(project.repository.full_path).to eq project.full_path
- end
- end
-
- context 'when exception happens' do
- it 'handles OpenSSL::Cipher::CipherError' do
- expect(project).to receive(:ensure_runners_token).and_raise(OpenSSL::Cipher::CipherError)
-
- expect { service.execute }.not_to raise_exception
- end
-
- it 'ensures rollback when OpenSSL::Cipher::CipherError' do
- expect(project).to receive(:ensure_runners_token).and_raise(OpenSSL::Cipher::CipherError)
- expect(service).to receive(:rollback_folder_move).and_call_original
-
- service.execute
- project.reload
-
- expect(project.legacy_storage?).to be_truthy
- expect(project.repository_read_only?).to be_falsey
- end
-
- it 'handles Gitlab::Git::CommandError' do
- expect(project).to receive(:set_full_path).and_raise(Gitlab::Git::CommandError)
-
- expect { service.execute }.not_to raise_exception
- end
-
- it 'ensures rollback when Gitlab::Git::CommandError' do
- expect(project).to receive(:set_full_path).and_raise(Gitlab::Git::CommandError)
- expect(service).to receive(:rollback_folder_move).and_call_original
-
- service.execute
- project.reload
-
- expect(project.legacy_storage?).to be_truthy
- expect(project.repository_read_only?).to be_falsey
- end
- end
-
- context 'when one move fails' do
- it 'rollsback repositories to original name' do
- allow(service).to receive(:move_repository).and_call_original
- allow(service).to receive(:move_repository).with(old_disk_path, new_disk_path).once { false } # will disable first move only
-
- expect(service).to receive(:rollback_folder_move).and_call_original
-
- service.execute
-
- expect(gitlab_shell.repository_exists?(project.repository_storage, "#{new_disk_path}.git")).to be_falsey
- expect(gitlab_shell.repository_exists?(project.repository_storage, "#{new_disk_path}.wiki.git")).to be_falsey
- expect(gitlab_shell.repository_exists?(project.repository_storage, "#{new_disk_path}.design.git")).to be_falsey
- expect(project.repository_read_only?).to be_falsey
- end
-
- context 'when rollback fails' do
- before do
- gitlab_shell.mv_repository(project.repository_storage, old_disk_path, new_disk_path)
- end
-
- it 'does not try to move nil repository over existing' do
- expect(gitlab_shell).not_to receive(:mv_repository).with(project.repository_storage, old_disk_path, new_disk_path)
- expect_move_repository("#{old_disk_path}.wiki", "#{new_disk_path}.wiki")
- expect_move_repository("#{old_disk_path}.design", "#{new_disk_path}.design")
-
- service.execute
- end
- end
- end
-
- it 'works even when project validation fails' do
- allow(project).to receive(:valid?) { false }
-
- expect { service.execute }.to change { project.hashed_storage?(:repository) }.to(true)
- end
-
- def expect_move_repository(from_name, to_name)
- expect(gitlab_shell).to receive(:mv_repository).with(project.repository_storage, from_name, to_name).and_call_original
- end
- end
-end
diff --git a/spec/services/projects/hashed_storage/migration_service_spec.rb b/spec/services/projects/hashed_storage/migration_service_spec.rb
index ffbd5c2500a..d5b04688322 100644
--- a/spec/services/projects/hashed_storage/migration_service_spec.rb
+++ b/spec/services/projects/hashed_storage/migration_service_spec.rb
@@ -14,43 +14,6 @@ RSpec.describe Projects::HashedStorage::MigrationService, feature_category: :gro
subject(:service) { described_class.new(project, project.full_path, logger: logger) }
describe '#execute' do
- context 'repository migration' do
- let(:repository_service) do
- Projects::HashedStorage::MigrateRepositoryService.new(
- project: project,
- old_disk_path: project.full_path,
- logger: logger
- )
- end
-
- it 'delegates migration to Projects::HashedStorage::MigrateRepositoryService' do
- expect(service).to receive(:migrate_repository_service).and_return(repository_service)
- expect(repository_service).to receive(:execute)
-
- service.execute
- end
-
- it 'does not delegate migration if repository is already migrated' do
- project.storage_version = ::Project::LATEST_STORAGE_VERSION
- expect(Projects::HashedStorage::MigrateRepositoryService).not_to receive(:new)
-
- service.execute
- end
-
- it 'migrates legacy repositories to hashed storage' do
- legacy_attachments_path = FileUploader.absolute_base_dir(project)
- hashed_project = project.dup.tap { |p| p.id = project.id }
- hashed_project.storage_version = ::Project::HASHED_STORAGE_FEATURES[:attachments]
- hashed_attachments_path = FileUploader.absolute_base_dir(hashed_project)
-
- expect(logger).to receive(:info).with(/Repository moved from '#{project_legacy_path}' to '#{project_hashed_path}'/)
- expect(logger).to receive(:info).with(/Repository moved from '#{wiki_legacy_path}' to '#{wiki_hashed_path}'/)
- expect(logger).to receive(:info).with(/Project attachments moved from '#{legacy_attachments_path}' to '#{hashed_attachments_path}'/)
-
- expect { service.execute }.to change { project.storage_version }.from(nil).to(2)
- end
- end
-
context 'attachments migration' do
let(:project) { create(:project, :empty_repo, :wiki_repo, storage_version: ::Project::HASHED_STORAGE_FEATURES[:repository]) }
@@ -62,13 +25,6 @@ RSpec.describe Projects::HashedStorage::MigrationService, feature_category: :gro
)
end
- it 'delegates migration to Projects::HashedStorage::MigrateRepositoryService' do
- expect(service).to receive(:migrate_attachments_service).and_return(attachments_service)
- expect(attachments_service).to receive(:execute)
-
- service.execute
- end
-
it 'does not delegate migration if attachments are already migrated' do
project.storage_version = ::Project::LATEST_STORAGE_VERSION
expect(Projects::HashedStorage::MigrateAttachmentsService).not_to receive(:new)
diff --git a/spec/services/projects/hashed_storage/rollback_attachments_service_spec.rb b/spec/services/projects/hashed_storage/rollback_attachments_service_spec.rb
deleted file mode 100644
index d1a68503fa3..00000000000
--- a/spec/services/projects/hashed_storage/rollback_attachments_service_spec.rb
+++ /dev/null
@@ -1,106 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Projects::HashedStorage::RollbackAttachmentsService, feature_category: :groups_and_projects do
- subject(:service) { described_class.new(project: project, old_disk_path: project.disk_path, logger: nil) }
-
- let(:project) { create(:project, :repository, skip_disk_validation: true) }
- let(:legacy_storage) { Storage::LegacyProject.new(project) }
- let(:hashed_storage) { Storage::Hashed.new(project) }
-
- let!(:upload) { Upload.find_by(path: file_uploader.upload_path) }
- let(:file_uploader) { build(:file_uploader, project: project) }
- let(:old_disk_path) { File.join(base_path(hashed_storage), upload.path) }
- let(:new_disk_path) { File.join(base_path(legacy_storage), upload.path) }
-
- describe '#execute' do
- context 'when succeeds' do
- it 'moves attachments to legacy storage layout' do
- expect(File.file?(old_disk_path)).to be_truthy
- expect(File.file?(new_disk_path)).to be_falsey
- expect(File.exist?(base_path(hashed_storage))).to be_truthy
- expect(File.exist?(base_path(legacy_storage))).to be_falsey
- expect(FileUtils).to receive(:mv).with(base_path(hashed_storage), base_path(legacy_storage)).and_call_original
-
- service.execute
-
- expect(File.exist?(base_path(legacy_storage))).to be_truthy
- expect(File.exist?(base_path(hashed_storage))).to be_falsey
- expect(File.file?(old_disk_path)).to be_falsey
- expect(File.file?(new_disk_path)).to be_truthy
- end
-
- it 'returns true' do
- expect(service.execute).to be_truthy
- end
-
- it 'sets skipped to false' do
- service.execute
-
- expect(service.skipped?).to be_falsey
- end
- end
-
- context 'when original folder does not exist anymore' do
- before do
- FileUtils.rm_rf(base_path(hashed_storage))
- end
-
- it 'skips moving folders and go to next' do
- expect(FileUtils).not_to receive(:mv).with(base_path(hashed_storage), base_path(legacy_storage))
-
- service.execute
-
- expect(File.exist?(base_path(legacy_storage))).to be_falsey
- expect(File.file?(new_disk_path)).to be_falsey
- end
-
- it 'returns true' do
- expect(service.execute).to be_truthy
- end
-
- it 'sets skipped to true' do
- service.execute
-
- expect(service.skipped?).to be_truthy
- end
- end
-
- context 'when target folder already exists' do
- before do
- FileUtils.mkdir_p(base_path(legacy_storage))
- end
-
- it 'raises AttachmentCannotMoveError' do
- expect(FileUtils).not_to receive(:mv).with(base_path(legacy_storage), base_path(hashed_storage))
-
- expect { service.execute }.to raise_error(Projects::HashedStorage::AttachmentCannotMoveError)
- end
- end
-
- it 'works even when project validation fails' do
- allow(project).to receive(:valid?) { false }
-
- expect { service.execute }.to change { project.hashed_storage?(:attachments) }.to(false)
- end
- end
-
- describe '#old_disk_path' do
- it 'returns old disk_path for project' do
- expect(service.old_disk_path).to eq(project.disk_path)
- end
- end
-
- describe '#new_disk_path' do
- it 'returns new disk_path for project' do
- service.execute
-
- expect(service.new_disk_path).to eq(project.full_path)
- end
- end
-
- def base_path(storage)
- File.join(FileUploader.root, storage.disk_path)
- end
-end
diff --git a/spec/services/projects/hashed_storage/rollback_repository_service_spec.rb b/spec/services/projects/hashed_storage/rollback_repository_service_spec.rb
deleted file mode 100644
index 1e5d4ae4d20..00000000000
--- a/spec/services/projects/hashed_storage/rollback_repository_service_spec.rb
+++ /dev/null
@@ -1,152 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Projects::HashedStorage::RollbackRepositoryService, :clean_gitlab_redis_shared_state, feature_category: :groups_and_projects do
- let(:gitlab_shell) { Gitlab::Shell.new }
- let(:project) { create(:project, :repository, :wiki_repo, :design_repo, storage_version: ::Project::HASHED_STORAGE_FEATURES[:repository]) }
- let(:legacy_storage) { Storage::LegacyProject.new(project) }
- let(:hashed_storage) { Storage::Hashed.new(project) }
-
- subject(:service) { described_class.new(project: project, old_disk_path: project.disk_path) }
-
- describe '#execute' do
- let(:old_disk_path) { hashed_storage.disk_path }
- let(:new_disk_path) { legacy_storage.disk_path }
-
- before do
- allow(service).to receive(:gitlab_shell) { gitlab_shell }
- end
-
- context 'repository lock' do
- it 'tries to lock the repository' do
- expect(service).to receive(:try_to_set_repository_read_only!)
-
- service.execute
- end
-
- it 'fails when a git operation is in progress' do
- allow(project).to receive(:git_transfer_in_progress?) { true }
-
- expect { service.execute }.to raise_error(Projects::HashedStorage::RepositoryInUseError)
- end
- end
-
- context 'when repository doesnt exist on disk' do
- let(:project) { create(:project) }
-
- it 'skips the disk change but decrease the version' do
- service.execute
-
- expect(project.legacy_storage?).to be_truthy
- end
- end
-
- context 'when succeeds' do
- it 'renames project, wiki and design repositories' do
- service.execute
-
- expect(gitlab_shell.repository_exists?(project.repository_storage, "#{new_disk_path}.git")).to be_truthy
- expect(gitlab_shell.repository_exists?(project.repository_storage, "#{new_disk_path}.wiki.git")).to be_truthy
- expect(gitlab_shell.repository_exists?(project.repository_storage, "#{new_disk_path}.design.git")).to be_truthy
- end
-
- it 'updates project to be legacy and not read-only' do
- service.execute
-
- expect(project.legacy_storage?).to be_truthy
- expect(project.repository_read_only).to be_falsey
- end
-
- it 'move operation is called for both repositories' do
- expect_move_repository(old_disk_path, new_disk_path)
- expect_move_repository("#{old_disk_path}.wiki", "#{new_disk_path}.wiki")
- expect_move_repository("#{old_disk_path}.design", "#{new_disk_path}.design")
-
- service.execute
- end
-
- it 'writes project full path to gitaly' do
- service.execute
-
- expect(project.repository.full_path).to eq project.full_path
- end
- end
-
- context 'when exception happens' do
- it 'handles OpenSSL::Cipher::CipherError' do
- expect(project).to receive(:ensure_runners_token).and_raise(OpenSSL::Cipher::CipherError)
-
- expect { service.execute }.not_to raise_exception
- end
-
- it 'ensures rollback when OpenSSL::Cipher::CipherError' do
- expect(project).to receive(:ensure_runners_token).and_raise(OpenSSL::Cipher::CipherError)
- expect(service).to receive(:rollback_folder_move).and_call_original
-
- service.execute
- project.reload
-
- expect(project.hashed_storage?(:repository)).to be_truthy
- expect(project.repository_read_only?).to be_falsey
- end
-
- it 'handles Gitlab::Git::CommandError' do
- expect(project).to receive(:set_full_path).and_raise(Gitlab::Git::CommandError)
-
- expect { service.execute }.not_to raise_exception
- end
-
- it 'ensures rollback when Gitlab::Git::CommandError' do
- expect(project).to receive(:set_full_path).and_raise(Gitlab::Git::CommandError)
- expect(service).to receive(:rollback_folder_move).and_call_original
-
- service.execute
- project.reload
-
- expect(project.hashed_storage?(:repository)).to be_truthy
- expect(project.repository_read_only?).to be_falsey
- end
- end
-
- context 'when one move fails' do
- it 'rolls repositories back to original name' do
- allow(service).to receive(:move_repository).and_call_original
- allow(service).to receive(:move_repository).with(old_disk_path, new_disk_path).once { false } # will disable first move only
-
- expect(service).to receive(:rollback_folder_move).and_call_original
-
- service.execute
-
- expect(gitlab_shell.repository_exists?(project.repository_storage, "#{new_disk_path}.git")).to be_falsey
- expect(gitlab_shell.repository_exists?(project.repository_storage, "#{new_disk_path}.wiki.git")).to be_falsey
- expect(gitlab_shell.repository_exists?(project.repository_storage, "#{new_disk_path}.design.git")).to be_falsey
- expect(project.repository_read_only?).to be_falsey
- end
-
- context 'when rollback fails' do
- before do
- gitlab_shell.mv_repository(project.repository_storage, old_disk_path, new_disk_path)
- end
-
- it 'does not try to move nil repository over existing' do
- expect(gitlab_shell).not_to receive(:mv_repository).with(project.repository_storage, old_disk_path, new_disk_path)
- expect_move_repository("#{old_disk_path}.wiki", "#{new_disk_path}.wiki")
- expect_move_repository("#{old_disk_path}.design", "#{new_disk_path}.design")
-
- service.execute
- end
- end
- end
-
- it 'works even when project validation fails' do
- allow(project).to receive(:valid?) { false }
-
- expect { service.execute }.to change { project.legacy_storage? }.to(true)
- end
-
- def expect_move_repository(from_name, to_name)
- expect(gitlab_shell).to receive(:mv_repository).with(project.repository_storage, from_name, to_name).and_call_original
- end
- end
-end
diff --git a/spec/services/projects/hashed_storage/rollback_service_spec.rb b/spec/services/projects/hashed_storage/rollback_service_spec.rb
deleted file mode 100644
index 088eb9d2734..00000000000
--- a/spec/services/projects/hashed_storage/rollback_service_spec.rb
+++ /dev/null
@@ -1,78 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Projects::HashedStorage::RollbackService, feature_category: :groups_and_projects do
- let(:project) { create(:project, :empty_repo, :wiki_repo) }
- let(:logger) { double }
- let!(:project_attachment) { build(:file_uploader, project: project) }
- let(:project_hashed_path) { Storage::Hashed.new(project).disk_path }
- let(:project_legacy_path) { Storage::LegacyProject.new(project).disk_path }
- let(:wiki_hashed_path) { "#{project_hashed_path}.wiki" }
- let(:wiki_legacy_path) { "#{project_legacy_path}.wiki" }
-
- subject(:service) { described_class.new(project, project.disk_path, logger: logger) }
-
- describe '#execute' do
- context 'attachments rollback' do
- let(:attachments_service_class) { Projects::HashedStorage::RollbackAttachmentsService }
- let(:attachments_service) { attachments_service_class.new(project: project, old_disk_path: project.disk_path, logger: logger) }
-
- it 'delegates rollback to Projects::HashedStorage::RollbackAttachmentsService' do
- expect(service).to receive(:rollback_attachments_service).and_return(attachments_service)
- expect(attachments_service).to receive(:execute)
-
- service.execute
- end
-
- it 'does not delegate rollback if repository is in legacy storage already' do
- project.storage_version = nil
- expect(attachments_service_class).not_to receive(:new)
-
- service.execute
- end
-
- it 'rollbacks to legacy storage' do
- hashed_attachments_path = FileUploader.absolute_base_dir(project)
- legacy_project = project.dup
- legacy_project.storage_version = nil
- legacy_attachments_path = FileUploader.absolute_base_dir(legacy_project)
-
- expect(logger).to receive(:info).with(/Project attachments moved from '#{hashed_attachments_path}' to '#{legacy_attachments_path}'/)
-
- expect(logger).to receive(:info).with(/Repository moved from '#{project_hashed_path}' to '#{project_legacy_path}'/)
- expect(logger).to receive(:info).with(/Repository moved from '#{wiki_hashed_path}' to '#{wiki_legacy_path}'/)
-
- expect { service.execute }.to change { project.storage_version }.from(2).to(nil)
- end
- end
-
- context 'repository rollback' do
- let(:project) { create(:project, :empty_repo, :wiki_repo, storage_version: ::Project::HASHED_STORAGE_FEATURES[:repository]) }
- let(:repository_service_class) { Projects::HashedStorage::RollbackRepositoryService }
- let(:repository_service) { repository_service_class.new(project: project, old_disk_path: project.disk_path, logger: logger) }
-
- it 'delegates rollback to RollbackRepositoryService' do
- expect(service).to receive(:rollback_repository_service).and_return(repository_service)
- expect(repository_service).to receive(:execute)
-
- service.execute
- end
-
- it 'does not delegate rollback if repository is in legacy storage already' do
- project.storage_version = nil
-
- expect(repository_service_class).not_to receive(:new)
-
- service.execute
- end
-
- it 'rollbacks to legacy storage' do
- expect(logger).to receive(:info).with(/Repository moved from '#{project_hashed_path}' to '#{project_legacy_path}'/)
- expect(logger).to receive(:info).with(/Repository moved from '#{wiki_hashed_path}' to '#{wiki_legacy_path}'/)
-
- expect { service.execute }.to change { project.storage_version }.from(1).to(nil)
- end
- end
- end
-end