Class: Fog::Storage::Rackspace::Real

Inherits:
Object
  • Object
show all
Includes:
Utils
Defined in:
lib/fog/rackspace/storage.rb,
lib/fog/rackspace/requests/storage/get_object.rb,
lib/fog/rackspace/requests/storage/put_object.rb,
lib/fog/rackspace/requests/storage/copy_object.rb,
lib/fog/rackspace/requests/storage/head_object.rb,
lib/fog/rackspace/requests/storage/delete_object.rb,
lib/fog/rackspace/requests/storage/get_container.rb,
lib/fog/rackspace/requests/storage/put_container.rb,
lib/fog/rackspace/requests/storage/get_containers.rb,
lib/fog/rackspace/requests/storage/head_container.rb,
lib/fog/rackspace/requests/storage/head_containers.rb,
lib/fog/rackspace/requests/storage/delete_container.rb,
lib/fog/rackspace/requests/storage/put_object_manifest.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Utils

#cdn

Constructor Details

#initialize(options = {}) ⇒ Real

Returns a new instance of Real.



80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
# File 'lib/fog/rackspace/storage.rb', line 80

def initialize(options={})
  require 'mime/types'
  require 'multi_json'
  @rackspace_api_key = options[:rackspace_api_key]
  @rackspace_username = options[:rackspace_username]
  @rackspace_cdn_ssl = options[:rackspace_cdn_ssl]
  @rackspace_auth_url = options[:rackspace_auth_url]
  @connection_options     = options[:connection_options] || {}
  credentials = Fog::Rackspace.authenticate(options, @connection_options)
  @auth_token = credentials['X-Auth-Token']

  uri = URI.parse(credentials['X-Storage-Url'])
  @host       = options[:rackspace_servicenet] == true ? "snet-#{uri.host}" : uri.host
  @path       = uri.path
  @persistent = options[:persistent] || false
  @port       = uri.port
  @scheme     = uri.scheme
  Excon.ssl_verify_peer = false if options[:rackspace_servicenet] == true
  @connection = Fog::Connection.new("#{@scheme}://#{@host}:#{@port}", @persistent, @connection_options)
end

Instance Attribute Details

#rackspace_cdn_sslObject (readonly)

Returns the value of attribute rackspace_cdn_ssl.



78
79
80
# File 'lib/fog/rackspace/storage.rb', line 78

def rackspace_cdn_ssl
  @rackspace_cdn_ssl
end

Instance Method Details

#copy_object(source_container_name, source_object_name, target_container_name, target_object_name, options = {}) ⇒ Object

Copy object

Parameters

  • source_container_name<~String> - Name of source bucket

  • source_object_name<~String> - Name of source object

  • target_container_name<~String> - Name of bucket to create copy in

  • target_object_name<~String> - Name for new copy of object

  • options<~Hash> - Additional headers



14
15
16
17
18
19
20
21
22
# File 'lib/fog/rackspace/requests/storage/copy_object.rb', line 14

def copy_object(source_container_name, source_object_name, target_container_name, target_object_name, options={})
  headers = { 'X-Copy-From' => "/#{source_container_name}/#{source_object_name}" }.merge(options)
  request({
    :expects  => 201,
    :headers  => headers,
    :method   => 'PUT',
    :path     => "#{Fog::Rackspace.escape(target_container_name)}/#{Fog::Rackspace.escape(target_object_name)}"
  })
end

#delete_container(name) ⇒ Object

Delete an existing container

Parameters

  • name<~String> - Name of container to delete



11
12
13
14
15
16
17
# File 'lib/fog/rackspace/requests/storage/delete_container.rb', line 11

def delete_container(name)
  request(
    :expects  => 204,
    :method   => 'DELETE',
    :path     => Fog::Rackspace.escape(name)
  )
end

#delete_object(container, object) ⇒ Object

Delete an existing container

Parameters

  • container<~String> - Name of container to delete

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



12
13
14
15
16
17
18
# File 'lib/fog/rackspace/requests/storage/delete_object.rb', line 12

def delete_object(container, object)
  request(
    :expects  => 204,
    :method   => 'DELETE',
    :path     => "#{Fog::Rackspace.escape(container)}/#{Fog::Rackspace.escape(object)}"
  )
end

#get_container(container, options = {}) ⇒ Object

Get details for container and total bytes stored

Parameters

  • container<~String> - Name of container to retrieve info for

  • options<~String>:

    • ‘limit’<~String> - Maximum number of objects to return

    • ‘marker’<~String> - Only return objects whose name is greater than marker

    • ‘prefix’<~String> - Limits results to those starting with prefix

    • ‘path’<~String> - Return objects nested in the pseudo path

Returns

  • response<~Excon::Response>:

    • headers<~Hash>:

      • ‘X-Account-Container-Count’<~String> - Count of containers

      • ‘X-Account-Bytes-Used’<~String> - Bytes used

    • body<~Array>:

      • ‘bytes’<~Integer> - Number of bytes used by container

      • ‘count’<~Integer> - Number of items in container

      • ‘name’<~String> - Name of container

      • item<~Hash>:

        • ‘bytes’<~String> - Size of object

        • ‘content_type’<~String> Content-Type of object

        • ‘hash’<~String> - Hash of object (etag?)

        • ‘last_modified’<~String> - Last modified timestamp

        • ‘name’<~String> - Name of object



31
32
33
34
35
36
37
38
39
# File 'lib/fog/rackspace/requests/storage/get_container.rb', line 31

def get_container(container, options = {})
  options = options.reject {|key, value| value.nil?}
  request(
    :expects  => 200,
    :method   => 'GET',
    :path     => Fog::Rackspace.escape(container),
    :query    => {'format' => 'json'}.merge!(options)
  )
end

#get_containers(options = {}) ⇒ Object

List existing storage containers

Parameters

  • options<~Hash>:

    • ‘limit’<~Integer> - Upper limit to number of results returned

    • ‘marker’<~String> - Only return objects with name greater than this value

Returns

  • response<~Excon::Response>:

    • body<~Array>:

      • container<~Hash>:

        • ‘bytes’<~Integer>: - Number of bytes used by container

        • ‘count’<~Integer>: - Number of items in container

        • ‘name’<~String>: - Name of container



20
21
22
23
24
25
26
27
28
# File 'lib/fog/rackspace/requests/storage/get_containers.rb', line 20

def get_containers(options = {})
  options = options.reject {|key, value| value.nil?}
  request(
    :expects  => [200, 204],
    :method   => 'GET',
    :path     => '',
    :query    => {'format' => 'json'}.merge!(options)
  )
end

#get_object(container, object, &block) ⇒ Object

Get details for object

Parameters

  • container<~String> - Name of container to look in

  • object<~String> - Name of object to look for



12
13
14
15
16
17
18
19
20
21
22
23
24
25
# File 'lib/fog/rackspace/requests/storage/get_object.rb', line 12

def get_object(container, object, &block)
  params = {}

  if block_given?
    params[:response_block] = Proc.new
  end

  request(params.merge!({
    :block    => block,
    :expects  => 200,
    :method   => 'GET',
    :path     => "#{Fog::Rackspace.escape(container)}/#{Fog::Rackspace.escape(object)}"
  }), false)
end

#head_container(container) ⇒ Object

List number of objects and total bytes stored

Parameters

  • container<~String> - Name of container to retrieve info for

Returns

  • response<~Excon::Response>:

    • headers<~Hash>:

      • ‘X-Container-Object-Count’<~String> - Count of containers

      • ‘X-Container-Bytes-Used’<~String> - Bytes used



16
17
18
19
20
21
22
23
# File 'lib/fog/rackspace/requests/storage/head_container.rb', line 16

def head_container(container)
  request(
    :expects  => 204,
    :method   => 'HEAD',
    :path     => Fog::Rackspace.escape(container),
    :query    => {'format' => 'json'}
  )
end

#head_containersObject

List number of containers and total bytes stored

Returns

  • response<~Excon::Response>:

    • headers<~Hash>:

      • ‘X-Account-Container-Count’<~String> - Count of containers

      • ‘X-Account-Bytes-Used’<~String> - Bytes used



13
14
15
16
17
18
19
20
# File 'lib/fog/rackspace/requests/storage/head_containers.rb', line 13

def head_containers
  request(
    :expects  => 204,
    :method   => 'HEAD',
    :path     => '',
    :query    => {'format' => 'json'}
  )
end

#head_object(container, object) ⇒ Object

Get headers for object

Parameters

  • container<~String> - Name of container to look in

  • object<~String> - Name of object to look for



12
13
14
15
16
17
18
# File 'lib/fog/rackspace/requests/storage/head_object.rb', line 12

def head_object(container, object)
  request({
    :expects  => 200,
    :method   => 'HEAD',
    :path     => "#{Fog::Rackspace.escape(container)}/#{Fog::Rackspace.escape(object)}"
  }, false)
end

#put_container(name) ⇒ Object

Create a new container

Parameters

  • name<~String> - Name for container, should be < 256 bytes and must not contain ‘/’



11
12
13
14
15
16
17
# File 'lib/fog/rackspace/requests/storage/put_container.rb', line 11

def put_container(name)
  request(
    :expects  => [201, 202],
    :method   => 'PUT',
    :path     => Fog::Rackspace.escape(name)
  )
end

#put_object(container, object, data, options = {}) ⇒ Object

Create a new object

Parameters

  • container<~String> - Name for container, should be < 256 bytes and must not contain ‘/’

  • object<~String> - Name for object

  • data<~String|File> - data to upload

  • options<~Hash> - config headers for object. Defaults to {}.



14
15
16
17
18
19
20
21
22
23
24
25
# File 'lib/fog/rackspace/requests/storage/put_object.rb', line 14

def put_object(container, object, data, options = {})
  data = Fog::Storage.parse_data(data)
  headers = data[:headers].merge!(options)
  request(
    :body       => data[:body],
    :expects    => 201,
    :idempotent => true,
    :headers    => headers,
    :method     => 'PUT',
    :path       => "#{Fog::Rackspace.escape(container)}/#{Fog::Rackspace.escape(object)}"
  )
end

#put_object_manifest(container, object) ⇒ Object

Create a new object

Parameters

  • container<~String> - Name for container, should be < 256 bytes and must not contain ‘/’

  • object<~String> - Name for object



12
13
14
15
16
17
18
19
20
# File 'lib/fog/rackspace/requests/storage/put_object_manifest.rb', line 12

def put_object_manifest(container, object)
  path = "#{Fog::Rackspace.escape(container)}/#{Fog::Rackspace.escape(object)}"
  request(
    :expects  => 201,
    :headers  => {'X-Object-Manifest' => path},
    :method   => 'PUT',
    :path     => path
  )
end

#reloadObject



101
102
103
# File 'lib/fog/rackspace/storage.rb', line 101

def reload
  @connection.reset
end

#request(params, parse_json = true, &block) ⇒ Object



105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
# File 'lib/fog/rackspace/storage.rb', line 105

def request(params, parse_json = true, &block)
  begin
    response = @connection.request(params.merge!({
      :headers  => {
        'Content-Type' => 'application/json',
        'X-Auth-Token' => @auth_token
      }.merge!(params[:headers] || {}),
      :host     => @host,
      :path     => "#{@path}/#{params[:path]}",
    }), &block)
  rescue Excon::Errors::HTTPStatusError => error
    raise case error
    when Excon::Errors::NotFound
      Fog::Storage::Rackspace::NotFound.slurp(error)
    else
      error
    end
  end
  if !response.body.empty? && parse_json && response.headers['Content-Type'] =~ %r{application/json}
    response.body = MultiJson.decode(response.body)
  end
  response
end