diff options
author | James Lopez <james@jameslopez.es> | 2018-06-26 16:47:44 +0200 |
---|---|---|
committer | James Lopez <james@jameslopez.es> | 2018-06-26 16:47:44 +0200 |
commit | 60f1d28d5eb2c6cdd8ae1c0862e6e5126d1207c8 (patch) | |
tree | 9f9efb14c8bbdac3da1e38c002a12c6efcdeeb85 | |
parent | c182d85bd496ae6f94ed672d5f73e0e51562310c (diff) | |
download | gitlab-ce-46246-gitlab-project-export-should-use-object-storage.tar.gz |
update saver to use Object Storage and add specs46246-gitlab-project-export-should-use-object-storage
-rw-r--r-- | lib/gitlab/import_export/saver.rb | 29 | ||||
-rw-r--r-- | spec/lib/gitlab/import_export/saver_spec.rb | 42 |
2 files changed, 68 insertions, 3 deletions
diff --git a/lib/gitlab/import_export/saver.rb b/lib/gitlab/import_export/saver.rb index 2daeba90a51..e2c1fd98945 100644 --- a/lib/gitlab/import_export/saver.rb +++ b/lib/gitlab/import_export/saver.rb @@ -14,16 +14,19 @@ module Gitlab def save if compress_and_save - remove_export_path Rails.logger.info("Saved project export #{archive_file}") - archive_file + + save_on_object_storage if use_object_storage? else - @shared.error(Gitlab::ImportExport::Error.new("Unable to save #{archive_file} into #{@shared.export_path}")) + @shared.error(Gitlab::ImportExport::Error.new(error_message)) false end rescue => e @shared.error(e) false + ensure + remove_export_path + remove_archive if use_object_storage? end private @@ -36,9 +39,29 @@ module Gitlab FileUtils.rm_rf(@shared.export_path) end + def remove_archive + FileUtils.rm_rf(@shared.archive_path) + end + def archive_file @archive_file ||= File.join(@shared.archive_path, Gitlab::ImportExport.export_filename(project: @project)) end + + def save_on_object_storage + upload = ImportExportUpload.new(project: @project) + + File.open(archive_file) { |file| u.project_export = file } + + upload.save! + end + + def use_object_storage? + @object_storage ||= ImportExport.object_storage? + end + + def error_message + "Unable to save #{archive_file} into #{@shared.export_path}. Object storage enabled: #{use_object_storage?}" + end end end end diff --git a/spec/lib/gitlab/import_export/saver_spec.rb b/spec/lib/gitlab/import_export/saver_spec.rb new file mode 100644 index 00000000000..aa199f0072a --- /dev/null +++ b/spec/lib/gitlab/import_export/saver_spec.rb @@ -0,0 +1,42 @@ +require 'spec_helper' +require 'fileutils' + +describe Gitlab::ImportExport::Saver do + let!(:project) { create(:project, :public, name: 'project') } + let(:export_path) { "#{Dir.tmpdir}/project_tree_saver_spec" } + let(:shared) { project.import_export_shared } + + subject { described_class.new(project: project, shared: shared) } + + before do + allow_any_instance_of(Gitlab::ImportExport).to receive(:storage_path).and_return(export_path) + + FileUtils.mkdir_p(shared.export_path) + FileUtils.touch("#{shared.export_path}/tmp.bundle") + end + + after do + FileUtils.rm_rf(export_path) + end + + context 'local archive' do + it 'saves the repo to disk' do + stub_feature_flags(import_export_object_storage: false) + + subject.save + + expect(shared.errors).to be_empty + expect(Dir.empty?(shared.archive_path)).to be false + end + end + + context 'object storage' do + xit 'saves the repo using object storage' do + stub_feature_flags(import_export_object_storage: true) + + stub_uploads_object_storage + + expect(subject.save).to be true + end + end +end |