summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJames Lopez <james@jameslopez.es>2018-06-26 16:47:44 +0200
committerJames Lopez <james@jameslopez.es>2018-06-26 16:47:44 +0200
commit60f1d28d5eb2c6cdd8ae1c0862e6e5126d1207c8 (patch)
tree9f9efb14c8bbdac3da1e38c002a12c6efcdeeb85
parentc182d85bd496ae6f94ed672d5f73e0e51562310c (diff)
downloadgitlab-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.rb29
-rw-r--r--spec/lib/gitlab/import_export/saver_spec.rb42
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