From 35a48ad11c651ea566d4b6f552c566b6a389bc54 Mon Sep 17 00:00:00 2001 From: Guillaume Lazzara Date: Fri, 1 Jul 2016 14:45:24 +0200 Subject: [PATCH] Add task for cloud storage migration --- Gemfile | 2 + Gemfile.lock | 3 ++ lib/tasks/cloud_storage.rb | 89 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 94 insertions(+) create mode 100644 lib/tasks/cloud_storage.rb diff --git a/Gemfile b/Gemfile index 12229eea2..eea36d384 100644 --- a/Gemfile +++ b/Gemfile @@ -90,6 +90,8 @@ gem 'as_csv' gem 'apipie-rails', '=0.3.1' gem "maruku" # for Markdown support in apipie +gem 'openstack' + group :test do gem 'capybara' gem 'factory_girl' diff --git a/Gemfile.lock b/Gemfile.lock index 31a9b9b55..f51bed510 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -391,6 +391,8 @@ GEM validate_email validate_url webfinger (>= 1.0.1) + openstack (2.0.2) + json orm_adapter (0.5.0) parallel (1.6.1) parallel_tests (1.9.0) @@ -659,6 +661,7 @@ DEPENDENCIES mina! nyan-cat-formatter openid_connect + openstack parallel_tests pg poltergeist diff --git a/lib/tasks/cloud_storage.rb b/lib/tasks/cloud_storage.rb new file mode 100644 index 000000000..743d35995 --- /dev/null +++ b/lib/tasks/cloud_storage.rb @@ -0,0 +1,89 @@ +namespace :cloudstorage do + + task init: :environment do + os_config = (YAML.load_file(Fog.credentials_path))['default'] + @os = OpenStack::Connection.create( + { + username: os_config['openstack_username'], + api_key: os_config['openstack_api_key'], + auth_method: "password", + auth_url: "https://auth.cloud.ovh.net/v2.0/", + authtenant_name: os_config['openstack_tenant'], + service_type: "object-store", + region: os_config['openstack_region'] + } + ) + @cont = @os.container(CarrierWave::Uploader::Base.fog_directory) + end + + desc 'Move local attestations on cloud storage' + task migrate: :environment do + puts 'Starting migration' + + Rake::Task['cloudstorage:init'].invoke + + [Cerfa, PieceJustificative, Procedure].each { |c| + c.all.each { |entry| + content = entry.content + content = entry.logo if c == Procedure + unless content.current_path.nil? || File.exist?(File.dirname(content.current_path) + '/uploaded') + secure_token = SecureRandom.uuid + filename = "#{entry.class.to_s.underscore}-#{secure_token}.pdf" + puts "Uploading #{content.current_path}" + @cont.create_object(filename, { content_type: "application/pdf"}, File.open(content.current_path)) + File.open(File.dirname(content.current_path) + '/uploaded', "w+"){ |f| f.write(File.basename(content.current_path)) } + entry.update_column(c == Procedure ? :logo : :content, filename) + end + } + } + + + puts 'Enf of migration' + end + + desc 'Clear documents in tenant and revert file entries in database' + task :revert do + Rake::Task['cloudstorage:init'].invoke + + @cont.objects.each { |object| + puts "Removing #{object}" + @cont.delete_object(object) + } + + [Cerfa, PieceJustificative, Procedure].each { |c| + c.all.each { |entry| + content = entry.content + content = entry.logo if c == Procedure + unless content.current_path.nil? + if File.exist?(File.dirname(content.current_path) + '/uploaded') + previous_filename = File.read(File.dirname(content.current_path) + '/uploaded') + entry.update_column(c == Procedure ? :logo : :content, filename) + puts "restoring #{content.current_path} db data to #{previous_filename}" + FileUtils.rm(File.dirname(content.current_path) + '/uploaded') + end + end + } + } + end + + + desc 'Clear old documents in tenant' + task :clear do + Rake::Task['cloudstorage:init'].invoke + + @cont.objects.each { |object| + puts "Removing #{object}" + @cont.delete_object(object) + } + end + + task :clear_old_objects do + Rake::Task['cloudstorage:init'].invoke + + @cont.objects_detail.each { |object, details| + last_modified = DateTime.parse(details[:last_modified]) + @cont.delete_object(object) unless last_modified.utc > (Time.now - 2.year).utc + } + end + +end \ No newline at end of file