diff options
Diffstat (limited to 'spec/services/projects/hashed_storage')
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 |