class Fog::Storage::AWS::Mock

Public Class Methods

acls(type) click to toggle source
# File lib/fog/aws/storage.rb, line 117
def self.acls(type)
  case type
  when 'private'
    {
      "AccessControlList" => [
        {
          "Permission" => "FULL_CONTROL",
          "Grantee" => {"DisplayName" => "me", "ID" => "2744ccd10c7533bd736ad890f9dd5cab2adb27b07d500b9493f29cdc420cb2e0"}
        }
      ],
      "Owner" => {"DisplayName" => "me", "ID" => "2744ccd10c7533bd736ad890f9dd5cab2adb27b07d500b9493f29cdc420cb2e0"}
    }
  when 'public-read'
    {
      "AccessControlList" => [
        {
          "Permission" => "FULL_CONTROL",
          "Grantee" => {"DisplayName" => "me", "ID" => "2744ccd10c7533bd736ad890f9dd5cab2adb27b07d500b9493f29cdc420cb2e0"}
        },
        {
          "Permission" => "READ",
          "Grantee" => {"URI" => "http://acs.amazonaws.com/groups/global/AllUsers"}
        }
      ],
      "Owner" => {"DisplayName" => "me", "ID" => "2744ccd10c7533bd736ad890f9dd5cab2adb27b07d500b9493f29cdc420cb2e0"}
    }
  when 'public-read-write'
    {
      "AccessControlList" => [
        {
          "Permission" => "FULL_CONTROL",
          "Grantee" => {"DisplayName" => "me", "ID" => "2744ccd10c7533bd736ad890f9dd5cab2adb27b07d500b9493f29cdc420cb2e0"}
        },
        {
          "Permission" => "READ",
          "Grantee" => {"URI" => "http://acs.amazonaws.com/groups/global/AllUsers"}
        },
        {
          "Permission" => "WRITE",
          "Grantee" => {"URI" => "http://acs.amazonaws.com/groups/global/AllUsers"}
        }
      ],
      "Owner" => {"DisplayName" => "me", "ID" => "2744ccd10c7533bd736ad890f9dd5cab2adb27b07d500b9493f29cdc420cb2e0"}
    }
  when 'authenticated-read'
    {
      "AccessControlList" => [
        {
          "Permission" => "FULL_CONTROL",
          "Grantee" => {"DisplayName" => "me", "ID" => "2744ccd10c7533bd736ad890f9dd5cab2adb27b07d500b9493f29cdc420cb2e0"}
        },
        {
          "Permission" => "READ",
          "Grantee" => {"URI" => "http://acs.amazonaws.com/groups/global/AuthenticatedUsers"}
        }
      ],
      "Owner" => {"DisplayName" => "me", "ID" => "2744ccd10c7533bd736ad890f9dd5cab2adb27b07d500b9493f29cdc420cb2e0"}
    }
  end
end
data() click to toggle source
# File lib/fog/aws/storage.rb, line 178
def self.data
  @data ||= Hash.new do |hash, region|
    hash[region] = Hash.new do |region_hash, key|
      region_hash[key] = {
        :acls => {
          :bucket => {},
          :object => {}
        },
        :buckets => {}
      }
    end
  end
end
new(options={}) click to toggle source
# File lib/fog/aws/storage.rb, line 196
def initialize(options={})
  require 'mime/types'
  @aws_access_key_id = options[:aws_access_key_id]
  @aws_secret_access_key = options[:aws_secret_access_key]
  options[:region] ||= 'us-east-1'
  @host = options[:host] || case options[:region]
  when 'us-east-1'
    's3.amazonaws.com'
  else
    "s3-#{options[:region]}.amazonaws.com"
  end
  @scheme = options[:scheme] || 'https'
  @region = options[:region]
end
reset() click to toggle source
# File lib/fog/aws/storage.rb, line 192
def self.reset
  @data = nil
end

Public Instance Methods

data() click to toggle source
# File lib/fog/aws/storage.rb, line 211
def data
  self.class.data[@region][@aws_access_key_id]
end
get_bucket_object_versions(bucket_name, options = {}) click to toggle source
# File lib/fog/aws/requests/storage/get_bucket_object_versions.rb, line 74
def get_bucket_object_versions(bucket_name, options = {})
  delimiter, key_marker, max_keys, prefix, version_id_marker =              options['delimiter'], options['key-marker'], options['max-keys'],options['prefix'],options['version-id-marker']

  unless bucket_name
    raise ArgumentError.new('bucket_name is required')
  end

  response = Excon::Response.new

  # Invalid arguments.
  if version_id_marker && !key_marker
    response.status = 400
    response.body = {
      'Error' => {
        'Code' => 'InvalidArgument',
        'Message' => 'A version-id marker cannot be specified without a key marker.',
        'ArgumentValue' => version_id_marker,
        'RequestId' => Fog::Mock.random_hex(16),
        'HostId' => Fog::Mock.random_base64(65)
      }
    }

  # Valid case.
  # TODO: (nirvdrum 12/15/11) It's not clear to me how to actually use version-id-marker, so I didn't implement it below.
  elsif bucket = self.data[:buckets][bucket_name]
    # We need to order results by S3 key, but since our data store is key => [versions], we want to ensure the integrity
    # of the versions as well.  So, sort the keys, then fetch the versions, and then combine them all as a sorted list by
    # flattening the results.
    contents = bucket[:objects].keys.sort.collect { |key| bucket[:objects][key] }.flatten.reject do |object|
        (prefix      && object['Key'][0...prefix.length] != prefix) ||
        (key_marker  && object['Key'] <= key_marker) ||
        (delimiter   && object['Key'][(prefix ? prefix.length : 0)..-1].include?(delimiter)                               && common_prefixes << object['Key'].sub(%r^(#{prefix}[^#{delimiter}]+.).*/, '\1'))
      end.map do |object|
        if object.has_key?(:delete_marker)
          tag_name = 'DeleteMarker'
          extracted_attrs = ['Key', 'VersionId']
        else
          tag_name = 'Version'
          extracted_attrs = ['ETag', 'Key', 'StorageClass', 'VersionId']
        end

        data = {}
        data[tag_name] = object.reject { |key, value| !extracted_attrs.include?(key) }
        data[tag_name].merge!({
          'LastModified' => Time.parse(object['Last-Modified']),
          'Owner'        => bucket['Owner'],
          'IsLatest'     => object == bucket[:objects][object['Key']].first
        })

        data[tag_name]['Size'] = object['Content-Length'].to_i if tag_name == 'Version'
      data
    end

    max_keys = max_keys || 1000
    size = [max_keys, 1000].min
    truncated_contents = contents[0...size]

    response.status = 200
    response.body = {
      'Versions'        => truncated_contents,
      'IsTruncated'     => truncated_contents.size != contents.size,
      'KeyMarker'       => key_marker,
      'VersionIdMarker' => version_id_marker,
      'MaxKeys'         => max_keys,
      'Name'            => bucket['Name'],
      'Prefix'          => prefix
    }
    if max_keys && max_keys < response.body['Versions'].length
        response.body['IsTruncated'] = true
        response.body['Versions'] = response.body['Versions'][0...max_keys]
    end

  # Missing bucket case.
  else
    response.status = 404
    response.body = {
      'Error' => {
        'Code' => 'NoSuchBucket',
        'Message' => 'The specified bucket does not exist',
        'BucketName' => bucket_name,
        'RequestId' => Fog::Mock.random_hex(16),
        'HostId' => Fog::Mock.random_base64(65)
      }
    }

    raise(Excon::Errors.status_error({:expects => 200}, response))
  end
  response
end
get_bucket_versioning(bucket_name) click to toggle source
# File lib/fog/aws/requests/storage/get_bucket_versioning.rb, line 39
def get_bucket_versioning(bucket_name)
  response = Excon::Response.new
  bucket = self.data[:buckets][bucket_name]

  if bucket
    response.status = 200

    if bucket[:versioning]
      response.body = { 'VersioningConfiguration' => { 'Status' => bucket[:versioning] } }
    else
      response.body = { 'VersioningConfiguration' => {} }
    end

  else
    response.status = 404
    response.body = {
      'Error' => {
        'Code' => 'NoSuchBucket',
        'Message' => 'The specified bucket does not exist',
        'BucketName' => bucket_name,
        'RequestId' => Fog::Mock.random_hex(16),
        'HostId' => Fog::Mock.random_base64(65)
      }
    }

    raise(Excon::Errors.status_error({:expects => 200}, response))
  end

  response
end
put_bucket_acl(bucket_name, acl) click to toggle source
# File lib/fog/aws/requests/storage/put_bucket_acl.rb, line 59
def put_bucket_acl(bucket_name, acl)
  if acl.is_a?(Hash)
    self.data[:acls][:bucket][bucket_name] = Fog::Storage::AWS.hash_to_acl(acl)
  else
    if !['private', 'public-read', 'public-read-write', 'authenticated-read'].include?(acl)
      raise Excon::Errors::BadRequest.new('invalid x-amz-acl')
    end
    self.data[:acls][:bucket][bucket_name] = acl
  end        
end
put_bucket_versioning(bucket_name, status) click to toggle source
# File lib/fog/aws/requests/storage/put_bucket_versioning.rb, line 35
def put_bucket_versioning(bucket_name, status)
  response = Excon::Response.new
  bucket = self.data[:buckets][bucket_name]

  if bucket
    if ['Enabled', 'Suspended'].include?(status)
      bucket[:versioning] = status

      response.status = 200
    else
      response.status = 400
      response.body = {
        'Error' => {
          'Code' => 'MalformedXML',
          'Message' => 'The XML you provided was not well-formed or did not validate against our published schema',
          'RequestId' => Fog::Mock.random_hex(16),
          'HostId' => Fog::Mock.random_base64(65)
        }
      }

      raise(Excon::Errors.status_error({:expects => 200}, response))
    end
  else
    response.status = 404
    response.body = {
      'Error' => {
        'Code' => 'NoSuchBucket',
        'Message' => 'The specified bucket does not exist',
        'BucketName' => bucket_name,
        'RequestId' => Fog::Mock.random_hex(16),
        'HostId' => Fog::Mock.random_base64(65)
      }
    }

    raise(Excon::Errors.status_error({:expects => 200}, response))
  end

  response
end
put_object_acl(bucket_name, object_name, acl, options = {}) click to toggle source
# File lib/fog/aws/requests/storage/put_object_acl.rb, line 68
def put_object_acl(bucket_name, object_name, acl, options = {})
  if acl.is_a?(Hash)
    self.data[:acls][:object][bucket_name][object_name] = Fog::Storage::AWS.hash_to_acl(acl)
  else
    if !['private', 'public-read', 'public-read-write', 'authenticated-read'].include?(acl)
      raise Excon::Errors::BadRequest.new('invalid x-amz-acl')
    end
    self.data[:acls][:object][bucket_name][object_name] = acl
  end        
end
reset_data() click to toggle source
# File lib/fog/aws/storage.rb, line 215
def reset_data
  self.class.data[@region].delete(@aws_access_key_id)
end
signature(params) click to toggle source
# File lib/fog/aws/storage.rb, line 219
def signature(params)
  "foo"
end