class Bosh::Blobstore::S3cliBlobstoreClient
Public Class Methods
new(options)
click to toggle source
Blobstore
client for S3, using s3cli Go version @param [Hash] options S3connection options @option options [Symbol] bucket_name
key that is applied before the object is sent to S3
@option options [Symbol, optional] access_key_id @option options [Symbol, optional] secret_access_key @option options [Symbol] s3cli_path
path to s3cli binary
@option options [Symbol, optional] s3cli_config_path
path to store configuration files
@note If access_key_id and secret_access_key are not present, the
blobstore client operates in read only mode
Calls superclass method
Bosh::Blobstore::BaseClient::new
# File lib/blobstore_client/s3cli_blobstore_client.rb, line 24 def initialize(options) super(options) @s3cli_path = @options.fetch(:s3cli_path) unless Kernel.system("#{@s3cli_path} --v", out: "/dev/null", err: "/dev/null") raise BlobstoreError, "Cannot find s3cli executable. Please specify s3cli_path parameter" end @s3cli_options = { bucket_name: @options[:bucket_name], use_ssl: @options.fetch(:use_ssl, true), host: @options[:host], port: @options[:port], region: @options[:region], ssl_verify_peer: @options.fetch(:ssl_verify_peer, true), credentials_source: @options.fetch(:credentials_source, 'none'), access_key_id: @options[:access_key_id], secret_access_key: @options[:secret_access_key], signature_version: @options[:signature_version] } @s3cli_options.reject! {|k,v| v.nil?} if @options[:access_key_id].nil? && @options[:secret_access_key].nil? @options[:credentials_source] = 'none' end @config_file = write_config_file(@options.fetch(:s3cli_config_path, nil)) end
Public Instance Methods
create_file(object_id, file)
click to toggle source
@param [File] file file to store in S3
# File lib/blobstore_client/s3cli_blobstore_client.rb, line 56 def create_file(object_id, file) object_id ||= generate_object_id # in Ruby 1.8 File doesn't respond to :path path = file.respond_to?(:path) ? file.path : file store_in_s3(path, full_oid_path(object_id)) object_id end
delete_object(object_id)
click to toggle source
@param [String] object_id object id to delete
# File lib/blobstore_client/s3cli_blobstore_client.rb, line 78 def delete_object(object_id) begin out, err, status = Open3.capture3("#{@s3cli_path} -c #{@config_file} delete #{object_id}") rescue Exception => e raise BlobstoreError, e.inspect end raise BlobstoreError, "Failed to delete S3 object, code #{status.exitstatus}, output: '#{out}', error: '#{err}'" unless status.success? end
get_file(object_id, file)
click to toggle source
@param [String] object_id object id to retrieve @param [File] file file to store the retrived object in
# File lib/blobstore_client/s3cli_blobstore_client.rb, line 68 def get_file(object_id, file) begin out, err, status = Open3.capture3("#{@s3cli_path} -c #{@config_file} get #{object_id} #{file.path}") rescue Exception => e raise BlobstoreError, e.inspect end raise BlobstoreError, "Failed to download S3 object, code #{status.exitstatus}, output: '#{out}', error: '#{err}'" unless status.success? end
object_exists?(object_id)
click to toggle source
# File lib/blobstore_client/s3cli_blobstore_client.rb, line 87 def object_exists?(object_id) begin out, err, status = Open3.capture3("#{@s3cli_path} -c #{@config_file} exists #{object_id}") if status.exitstatus == 0 return true end if status.exitstatus == 3 return false end rescue Exception => e raise BlobstoreError, e.inspect end raise BlobstoreError, "Failed to check existence of S3 object, code #{status.exitstatus}, output: '#{out}', error: '#{err}'" unless status.success? end
Protected Instance Methods
full_oid_path(object_id)
click to toggle source
# File lib/blobstore_client/s3cli_blobstore_client.rb, line 116 def full_oid_path(object_id) @options[:folder] ? @options[:folder] + '/' + object_id : object_id end
store_in_s3(path, oid)
click to toggle source
@param [String] path path to file which will be stored in S3 @param [String] oid object id @return [void]
# File lib/blobstore_client/s3cli_blobstore_client.rb, line 107 def store_in_s3(path, oid) begin out, err, status = Open3.capture3("#{@s3cli_path} -c #{@config_file} put #{path} #{oid}") rescue Exception => e raise BlobstoreError, e.inspect end raise BlobstoreError, "Failed to create S3 object, code #{status.exitstatus}, output: '#{out}', error: '#{err}'" unless status.success? end
write_config_file(config_file_dir = nil)
click to toggle source
# File lib/blobstore_client/s3cli_blobstore_client.rb, line 120 def write_config_file(config_file_dir = nil) config_file_dir = Dir::tmpdir unless config_file_dir Dir.mkdir(config_file_dir) unless File.exists?(config_file_dir) random_name = "s3_blobstore_config-#{SecureRandom.uuid}" config_file = File.join(config_file_dir, random_name) config_data = JSON.dump(@s3cli_options) File.write(config_file, config_data) config_file end