Parent

Class/Module Index [+]

Quicksearch

Fog::Storage::Google::Real

Public Class Methods

new(options={}) click to toggle source

Initialize connection to Google Storage

Notes

options parameter must include values for :google_storage_access_key_id and :google_storage_secret_access_key in order to create a connection

Examples

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
)

Parameters

  • options<~Hash> - config arguments for connection. Defaults to {}.

Returns

  • 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

Public Instance Methods

copy_object(source_bucket_name, source_object_name, target_bucket_name, target_object_name, options = {}) click to toggle source

Copy an object from one Google Storage bucket to another

Parameters

  • 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

Returns

  • 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_bucket(bucket_name) click to toggle source

Delete an Google Storage bucket

Parameters

  • bucket_name<~String> - name of bucket to delete

Returns

  • 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_object(bucket_name, object_name) click to toggle source

Delete an object from Google Storage

Parameters

  • bucket_name<~String> - Name of bucket containing object to delete

  • object_name<~String> - Name of object to delete

Returns

  • 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
get_bucket(bucket_name, options = {}) click to toggle source

List information about objects in an Google Storage bucket

Parameters

  • 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.

Returns

  • 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_object(bucket_name, object_name, options = {}, &block) click to toggle source

Get an object from Google Storage

Parameters

  • 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

Returns

  • 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_object_acl(bucket_name, object_name, options = {}) click to toggle source

Get access control list for an Google Storage object

Parameters

  • 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

Returns

  • 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_object_torrent(bucket_name, object_name) click to toggle source

Get torrent for an Google Storage object

Parameters

  • bucket_name<~String> - name of bucket containing object

  • object_name<~String> - name of object to get torrent for

Returns

  • 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_object_url(bucket_name, object_name, expires) click to toggle source

Get an expiring object url from Google Storage

Parameters

  • 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

Returns

  • response<~Excon::Response>:

    • body<~String> - url for object

See Also

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
get_service() click to toggle source

List information about Google Storage buckets for authorized user

Returns

  • 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
head_object(bucket_name, object_name, options={}) click to toggle source

Get headers for an object from Google Storage

Parameters

  • 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

Returns

  • 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
put_bucket(bucket_name, options = {}) click to toggle source

Create an Google Storage bucket

Parameters

  • 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']

Returns

  • 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
put_bucket_acl(bucket_name, acl) click to toggle source

Change access control list for an Google Storage bucket

Parameters

  • 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
put_object(bucket_name, object_name, data, options = {}) click to toggle source

Create an object in an Google Storage bucket

Parameters

  • bucket_name<~String> - Name of bucket to create object in

  • object_name<~String> - Name of object to create

  • data<~File> - File or String to create object from

  • 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.

Returns

  • 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
put_object_url(bucket_name, object_name, expires, headers = {}) click to toggle source

Get an expiring object url from Google Storage for putting an object

Parameters

  • 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

Returns

  • 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
reload() click to toggle source
# File lib/fog/google/storage.rb, line 201
def reload
  @connection.reset
end
signature(params) click to toggle source
# 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

[Validate]

Generated with the Darkfish Rdoc Generator 2.