Initialize connection to Google Storage
options parameter must include values for :google_storage_access_key_id and :google_storage_secret_access_key in order to create a connection
google_storage = Storage.new( :google_storage_access_key_id => your_google_storage_access_key_id, :google_storage_secret_access_key => your_google_storage_secret_access_key )
options<~Hash> - config arguments for connection. Defaults to {}.
Storage object with connection to google.
# File lib/fog/google/storage.rb, line 186 def initialize(options={}) require 'fog/core/parser' require 'mime/types' @google_storage_access_key_id = options[:google_storage_access_key_id] @google_storage_secret_access_key = options[:google_storage_secret_access_key] @connection_options = options[:connection_options] || {} @hmac = Fog::HMAC.new('sha1', @google_storage_secret_access_key) @host = options[:host] || 'storage.googleapis.com' @persistent = options.fetch(:persistent, true) @port = options[:port] || 443 @scheme = options[:scheme] || 'https' @connection = Fog::Connection.new("#{@scheme}://#{@host}:#{@port}", @persistent, @connection_options) end
Copy an object from one Google Storage bucket to another
source_bucket_name<~String> - Name of source bucket
source_object_name<~String> - Name of source object
target_bucket_name<~String> - Name of bucket to create copy in
target_object_name<~String> - Name for new copy of object
options<~Hash>:
'x-goog-metadata-directive'<~String> - Specifies whether to copy metadata from source or replace with data in request. Must be in ['COPY', 'REPLACE']
'x-goog-copy_source-if-match'<~String> - Copies object if its etag matches this value
'x-goog-copy_source-if-modified_since'<~Time> - Copies object it it has been modified since this time
'x-goog-copy_source-if-none-match'<~String> - Copies object if its etag does not match this value
'x-goog-copy_source-if-unmodified-since'<~Time> - Copies object it it has not been modified since this time
response<~Excon::Response>:
body<~Hash>:
'ETag'<~String> - etag of new object
'LastModified'<~Time> - date object was last modified
# File lib/fog/google/requests/storage/copy_object.rb, line 28 def copy_object(source_bucket_name, source_object_name, target_bucket_name, target_object_name, options = {}) headers = { 'x-goog-copy-source' => "/#{source_bucket_name}/#{source_object_name}" }.merge!(options) request({ :expects => 200, :headers => headers, :host => "#{target_bucket_name}.#{@host}", :method => 'PUT', :parser => Fog::Parsers::Storage::Google::CopyObject.new, :path => CGI.escape(target_object_name) }) end
Delete an Google Storage bucket
bucket_name<~String> - name of bucket to delete
response<~Excon::Response>:
status<~Integer> - 204
# File lib/fog/google/requests/storage/delete_bucket.rb, line 14 def delete_bucket(bucket_name) request({ :expects => 204, :headers => {}, :host => "#{bucket_name}.#{@host}", :method => 'DELETE' }) end
Delete an object from Google Storage
bucket_name<~String> - Name of bucket containing object to delete
object_name<~String> - Name of object to delete
response<~Excon::Response>:
status<~Integer> - 204
# File lib/fog/google/requests/storage/delete_object.rb, line 15 def delete_object(bucket_name, object_name) request({ :expects => 204, :headers => {}, :host => "#{bucket_name}.#{@host}", :idempotent => true, :method => 'DELETE', :path => CGI.escape(object_name) }) end
List information about objects in an Google Storage bucket
bucket_name<~String> - name of bucket to list object keys from
options<~Hash> - config arguments for list. Defaults to {}.
'delimiter'<~String> - causes keys with the same string between the prefix value and the first occurence of delimiter to be rolled up
'marker'<~String> - limits object keys to only those that appear lexicographically after its value.
'max-keys'<~Integer> - limits number of object keys returned
'prefix'<~String> - limits object keys to those beginning with its value.
response<~Excon::Response>:
body<~Hash>:
'Delimeter'<~String> - Delimiter specified for query
'IsTruncated'<~Boolean> - Whether or not the listing is truncated
'Marker'<~String> - Marker specified for query
'MaxKeys'<~Integer> - Maximum number of keys specified for query
'Name'<~String> - Name of the bucket
'Prefix'<~String> - Prefix specified for query
'CommonPrefixes'<~Array> - Array of strings for common prefixes
'Contents'<~Array>:
'ETag'<~String>: Etag of object
'Key'<~String>: Name of object
'LastModified'<~String>: Timestamp of last modification of object
'Owner'<~Hash>:
'DisplayName'<~String> - Display name of object owner
'ID'<~String> - Id of object owner
'Size'<~Integer> - Size of object
# File lib/fog/google/requests/storage/get_bucket.rb, line 40 def get_bucket(bucket_name, options = {}) unless bucket_name raise ArgumentError.new('bucket_name is required') end request({ :expects => 200, :headers => {}, :host => "#{bucket_name}.#{@host}", :idempotent => true, :method => 'GET', :parser => Fog::Parsers::Storage::Google::GetBucket.new, :query => options }) end
Get an object from Google Storage
bucket_name<~String> - Name of bucket to read from
object_name<~String> - Name of object to read
options<~Hash>:
'If-Match'<~String> - Returns object only if its etag matches this value, otherwise returns 412 (Precondition Failed).
'If-Modified-Since'<~Time> - Returns object only if it has been modified since this time, otherwise returns 304 (Not Modified).
'If-None-Match'<~String> - Returns object only if its etag differs from this value, otherwise returns 304 (Not Modified)
'If-Unmodified-Since'<~Time> - Returns object only if it has not been modified since this time, otherwise returns 412 (Precodition Failed).
'Range'<~String> - Range of object to download
'versionId'<~String> - specify a particular version to retrieve
response<~Excon::Response>:
body<~String> - Contents of object
headers<~Hash>:
'Content-Length'<~String> - Size of object contents
'Content-Type'<~String> - MIME type of object
'ETag'<~String> - Etag of object
'Last-Modified'<~String> - Last modified timestamp for object
# File lib/fog/google/requests/storage/get_object.rb, line 28 def get_object(bucket_name, object_name, options = {}, &block) unless bucket_name raise ArgumentError.new('bucket_name is required') end unless object_name raise ArgumentError.new('object_name is required') end params = { :headers => {} } if version_id = options.delete('versionId') params[:query] = {'versionId' => version_id} end params[:headers].merge!(options) if options['If-Modified-Since'] params[:headers]['If-Modified-Since'] = Fog::Time.at(options['If-Modified-Since'].to_i).to_date_header end if options['If-Modified-Since'] params[:headers]['If-Unmodified-Since'] = Fog::Time.at(options['If-Unmodified-Since'].to_i).to_date_header end if block_given? params[:response_block] = Proc.new end request(params.merge!({ :expects => 200, :host => "#{bucket_name}.#{@host}", :idempotent => true, :method => 'GET', :path => CGI.escape(object_name), })) end
Get access control list for an Google Storage object
bucket_name<~String> - name of bucket containing object
object_name<~String> - name of object to get access control list for
options<~Hash>:
'versionId'<~String> - specify a particular version to retrieve
response<~Excon::Response>:
body<~Hash>:
'AccessControlPolicy'<~Hash>
'Owner'<~Hash>:
'DisplayName'<~String> - Display name of object owner
'ID'<~String> - Id of object owner
'AccessControlList'<~Array>:
'Grant'<~Hash>:
'Grantee'<~Hash>:
* 'DisplayName'<~String> - Display name of grantee * 'ID'<~String> - Id of grantee
or
* 'URI'<~String> - URI of group to grant access for
'Permission'<~String> - Permission, in [FULL_CONTROL, WRITE, WRITE_ACP, READ, READ_ACP]
# File lib/fog/google/requests/storage/get_object_acl.rb, line 32 def get_object_acl(bucket_name, object_name, options = {}) unless bucket_name raise ArgumentError.new('bucket_name is required') end unless object_name raise ArgumentError.new('object_name is required') end query = {'acl' => nil} if version_id = options.delete('versionId') query['versionId'] = version_id end request({ :expects => 200, :headers => {}, :host => "#{bucket_name}.#{@host}", :idempotent => true, :method => 'GET', :parser => Fog::Parsers::Storage::Google::AccessControlList.new, :path => CGI.escape(object_name), :query => query }) end
Get torrent for an Google Storage object
bucket_name<~String> - name of bucket containing object
object_name<~String> - name of object to get torrent for
response<~Excon::Response>:
body<~Hash>:
'AccessControlPolicy'<~Hash>
'Owner'<~Hash>:
'DisplayName'<~String> - Display name of object owner
'ID'<~String> - Id of object owner
'AccessControlList'<~Array>:
'Grant'<~Hash>:
'Grantee'<~Hash>:
'DisplayName'<~String> - Display name of grantee
'ID'<~String> - Id of grantee
'Permission'<~String> - Permission, in [FULL_CONTROL, WRITE, WRITE_ACP, READ, READ_ACP]
# File lib/fog/google/requests/storage/get_object_torrent.rb, line 26 def get_object_torrent(bucket_name, object_name) unless bucket_name raise ArgumentError.new('bucket_name is required') end unless object_name raise ArgumentError.new('object_name is required') end request({ :expects => 200, :headers => {}, :host => "#{bucket_name}.#{@host}", :idempotent => true, :method => 'GET', :path => CGI.escape(object_name), :query => {'torrent' => nil} }) end
Get an expiring object url from Google Storage
bucket_name<~String> - Name of bucket containing object
object_name<~String> - Name of object to get expiring url for
expires<~Time> - An expiry time for this url
response<~Excon::Response>:
body<~String> - url for object
docs.amazonwebservices.com/AmazonS3/latest/dev/S3_QSAuth.html
# File lib/fog/google/requests/storage/get_object_url.rb, line 20 def get_object_url(bucket_name, object_name, expires) Fog::Logger.deprecation("Fog::Storage::Google => ##{get_object_url} is deprecated, use ##{get_object_https_url} instead[/] [light_black](#{caller.first})") get_object_https_url(bucket_name, object_name, expires) end
List information about Google Storage buckets for authorized user
response<~Excon::Response>:
body<~Hash>:
'Buckets'<~Hash>:
'Name'<~String> - Name of bucket
'CreationTime'<~Time> - Timestamp of bucket creation
'Owner'<~Hash>:
'DisplayName'<~String> - Display name of bucket owner
'ID'<~String> - Id of bucket owner
# File lib/fog/google/requests/storage/get_service.rb, line 19 def get_service request({ :expects => 200, :headers => {}, :host => @host, :idempotent => true, :method => 'GET', :parser => Fog::Parsers::Storage::Google::GetService.new, :url => @host }) end
Get headers for an object from Google Storage
bucket_name<~String> - Name of bucket to read from
object_name<~String> - Name of object to read
options<~Hash>:
'If-Match'<~String> - Returns object only if its etag matches this value, otherwise returns 412 (Precondition Failed).
'If-Modified-Since'<~Time> - Returns object only if it has been modified since this time, otherwise returns 304 (Not Modified).
'If-None-Match'<~String> - Returns object only if its etag differs from this value, otherwise returns 304 (Not Modified)
'If-Unmodified-Since'<~Time> - Returns object only if it has not been modified since this time, otherwise returns 412 (Precodition Failed).
'Range'<~String> - Range of object to download
'versionId'<~String> - specify a particular version to retrieve
response<~Excon::Response>:
body<~String> - Contents of object
headers<~Hash>:
'Content-Length'<~String> - Size of object contents
'Content-Type'<~String> - MIME type of object
'ETag'<~String> - Etag of object
'Last-Modified'<~String> - Last modified timestamp for object
# File lib/fog/google/requests/storage/head_object.rb, line 27 def head_object(bucket_name, object_name, options={}) unless bucket_name raise ArgumentError.new('bucket_name is required') end unless object_name raise ArgumentError.new('object_name is required') end if version_id = options.delete('versionId') query = {'versionId' => version_id} end headers = {} headers['If-Modified-Since'] = Fog::Time.at(options['If-Modified-Since'].to_i).to_date_header if options['If-Modified-Since'] headers['If-Unmodified-Since'] = Fog::Time.at(options['If-Unmodified-Since'].to_i).to_date_header if options['If-Modified-Since'] headers.merge!(options) request({ :expects => 200, :headers => headers, :host => "#{bucket_name}.#{@host}", :method => 'HEAD', :path => CGI.escape(object_name), :query => query }) end
Create an Google Storage bucket
bucket_name<~String> - name of bucket to create
options<~Hash> - config arguments for bucket. Defaults to {}.
'LocationConstraint'<~Symbol> - sets the location for the bucket
'x-amz-acl'<~String> - Permissions, must be in ['private', 'public-read', 'public-read-write', 'authenticated-read']
response<~Excon::Response>:
status<~Integer> - 200
# File lib/fog/google/requests/storage/put_bucket.rb, line 17 def put_bucket(bucket_name, options = {}) if location_constraint = options.delete('LocationConstraint') data = <CreateBucketConfiguration> <LocationConstraint>#{location_constraint}</LocationConstraint> </CreateBucketConfiguration> else data = nil end request({ :expects => 200, :body => data, :headers => options, :idempotent => true, :host => "#{bucket_name}.#{@host}", :method => 'PUT' }) end
Change access control list for an Google Storage bucket
bucket_name<~String> - name of bucket to modify
acl<~Hash>:
Owner<~Hash>:
ID<~String>: id of owner
DisplayName<~String>: display name of owner
AccessControlList<~Array>:
scope<~Hash>:
* 'type'<~String> - 'UserById' * 'ID'<~String> - Id of grantee
or
* 'type'<~String> - 'UserByEmail' * 'EmailAddress'<~String> - Email address of grantee
or
* 'type'<~String> - type of user to grant permission to
Permission<~String> - Permission, in [FULL_CONTROL, WRITE, WRITE_ACP, READ, READ_ACP]
# File lib/fog/google/requests/storage/put_bucket_acl.rb, line 24 def put_bucket_acl(bucket_name, acl) data = <AccessControlPolicy> <Owner> <ID>#{acl['Owner']['ID']}</ID> <DisplayName>#{acl['Owner']['DisplayName']}</DisplayName> </Owner> <AccessControlList> acl['AccessControlList'].each do |grant| data << " <Grant>" type = case grant['Grantee'].keys.sort when ['DisplayName', 'ID'] 'CanonicalUser' when ['EmailAddress'] 'AmazonCustomerByEmail' when ['URI'] 'Group' end data << " <Grantee xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:type=\"#{type}\">" for key, value in grant['Grantee'] data << " <#{key}>#{value}</#{key}>" end data << " </Grantee>" data << " <Permission>#{grant['Permission']}</Permission>" data << " </Grant>" end data << </AccessControlList></AccessControlPolicy> request({ :body => data, :expects => 200, :headers => {}, :host => "#{bucket_name}.#{@host}", :method => 'PUT', :query => {'acl' => nil} }) end
Create an object in an Google Storage bucket
bucket_name<~String> - Name of bucket to create object in
object_name<~String> - Name of object to create
options<~Hash>:
'Cache-Control'<~String> - Caching behaviour
'Content-Disposition'<~String> - Presentational information for the object
'Content-Encoding'<~String> - Encoding of object data
'Content-Length'<~String> - Size of object in bytes (defaults to object.read.length)
'Content-MD5'<~String> - Base64 encoded 128-bit MD5 digest of message (defaults to Base64 encoded MD5 of object.read)
'Content-Type'<~String> - Standard MIME type describing contents (defaults to MIME::Types.of.first)
'x-goog-acl'<~String> - Permissions, must be in ['private', 'public-read', 'public-read-write', 'authenticated-read']
"x-goog-meta-#{name}" - Headers to be returned with object, note total size of request without body must be less than 8 KB.
response<~Excon::Response>:
headers<~Hash>:
'ETag'<~String> - etag of new object
# File lib/fog/google/requests/storage/put_object.rb, line 26 def put_object(bucket_name, object_name, data, options = {}) data = Fog::Storage.parse_data(data) headers = data[:headers].merge!(options) request({ :body => data[:body], :expects => 200, :headers => headers, :host => "#{bucket_name}.#{@host}", :idempotent => true, :method => 'PUT', :path => CGI.escape(object_name) }) end
Get an expiring object url from Google Storage for putting an object
bucket_name<~String> - Name of bucket containing object
object_name<~String> - Name of object to get expiring url for
expires<~Time> - An expiry time for this url
response<~Excon::Response>:
body<~String> - url for object
# File lib/fog/google/requests/storage/put_object_url.rb, line 17 def put_object_url(bucket_name, object_name, expires, headers = {}) unless bucket_name raise ArgumentError.new('bucket_name is required') end unless object_name raise ArgumentError.new('object_name is required') end https_url({ :headers => headers, :host => @host, :method => 'PUT', :path => "#{bucket_name}/#{object_name}" }, expires) end
# File lib/fog/google/storage.rb, line 201 def reload @connection.reset end
# File lib/fog/google/storage.rb, line 205 def signature(params) string_to_sign = #{params[:method]}#{params[:headers]['Content-MD5']}#{params[:headers]['Content-Type']}#{params[:headers]['Date']} google_headers, canonical_google_headers = {}, '' for key, value in params[:headers] if key[0..6] == 'x-goog-' google_headers[key] = value end end google_headers = google_headers.sort {|x, y| x[0] <=> y[0]} for key, value in google_headers canonical_google_headers << "#{key}:#{value}\n" end string_to_sign << "#{canonical_google_headers}" subdomain = params[:host].split(".#{@host}").first unless subdomain =~ /^(?!goog)(?:[a-z]|\d(?!\d{0,2}(?:\.\d{1,3}){3}$))(?:[a-z0-9]|\.(?![\.\-])|\-(?![\.])){1,61}[a-z0-9]$/ if subdomain =~ /_/ # https://github.com/fog/fog/pull/1258#issuecomment-10248620. Fog::Logger.warning("fog: the specified google storage bucket name (#{subdomain}) is not DNS compliant (only characters a through z, digits 0 through 9, and the hyphen).") else # - Bucket names must contain only lowercase letters, numbers, dashes (-), underscores (_), and dots (.). Names containing dots require verification. # - Bucket names must start and end with a number or letter. # - Bucket names must contain 3 to 63 characters. Names containing dots can contain up to 222 characters, but each dot-separated component can be no longer than 63 characters. # - Bucket names cannot be represented as an IP address in dotted-decimal notation (for example, 192.168.5.4). # - Bucket names cannot begin with the "goog" prefix. # - Also, for DNS compliance, you should not have a period adjacent to another period or dash. For example, ".." or "-." or ".-" are not acceptable. Fog::Logger.warning("fog: the specified google storage bucket name (#{subdomain}) is not a valid dns name. See: https://developers.google.com/storage/docs/bucketnaming") end params[:host] = params[:host].split("#{subdomain}.")[-1] if params[:path] params[:path] = "#{subdomain}/#{params[:path]}" else params[:path] = "#{subdomain}" end subdomain = nil end canonical_resource = "/" unless subdomain.nil? || subdomain == @host canonical_resource << "#{CGI.escape(subdomain).downcase}/" end canonical_resource << "#{params[:path]}" canonical_resource << '?' for key in (params[:query] || {}).keys if ['acl', 'cors', 'location', 'logging', 'requestPayment', 'torrent', 'versions', 'versioning'].include?(key) canonical_resource << "#{key}&" end end canonical_resource.chop! string_to_sign << "#{canonical_resource}" signed_string = @hmac.sign(string_to_sign) Base64.encode64(signed_string).chomp! end
Generated with the Darkfish Rdoc Generator 2.