lib/backup/syncer/cloud/cloud_files.rb
# frozen_string_literal: true
require "backup/cloud_io/cloud_files"
module Backup
module Syncer
module Cloud
class CloudFiles < Base
class Error < Backup::Error; end
##
# Rackspace CloudFiles Credentials
attr_accessor :username, :api_key
##
# Rackspace CloudFiles Container
attr_accessor :container
##
# Rackspace AuthURL (optional)
attr_accessor :auth_url
##
# Rackspace Region (optional)
attr_accessor :region
##
# Rackspace Service Net
# (LAN-based transfers to avoid charges and improve performance)
attr_accessor :servicenet
##
# Additional options to pass along to fog.
# e.g. Fog::Storage.new({ :provider => 'Rackspace' }.merge(fog_options))
attr_accessor :fog_options
def initialize(syncer_id = nil)
super
@servicenet ||= false
check_configuration
end
private
def cloud_io
@cloud_io ||= CloudIO::CloudFiles.new(
username: username,
api_key: api_key,
auth_url: auth_url,
region: region,
servicenet: servicenet,
container: container,
max_retries: max_retries,
retry_waitsec: retry_waitsec,
# Syncer can not use SLOs.
segments_container: nil,
segment_size: 0,
fog_options: fog_options
)
end
def get_remote_files(remote_base)
hash = {}
cloud_io.objects(remote_base).each do |object|
relative_path = object.name.sub(remote_base + "/", "")
hash[relative_path] = object.hash
end
hash
end
def check_configuration
required = %w[username api_key container]
raise Error, <<-EOS if required.map { |name| send(name) }.any?(&:nil?)
Configuration Error
#{required.map { |name| "##{name}" }.join(", ")} are all required
EOS
end
end # class Cloudfiles < Base
end # module Cloud
end
end