Class: Fog::Storage::Rackspace::Real
- Inherits:
-
Rackspace::Service
- Object
- Rackspace::Service
- Fog::Storage::Rackspace::Real
- 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,
lib/fog/rackspace/requests/storage/get_object_https_url.rb,
lib/fog/rackspace/requests/storage/post_set_meta_temp_url_key.rb
Instance Attribute Summary collapse
-
#rackspace_cdn_ssl ⇒ Object
readonly
Returns the value of attribute rackspace_cdn_ssl.
Instance Method Summary collapse
-
#account ⇒ Fog::Storage::Rackspace::Account
Return Account Details.
- #authenticate ⇒ Object
-
#copy_object(source_container_name, source_object_name, target_container_name, target_object_name, options = {}) ⇒ Object
Copy object.
-
#delete_container(name) ⇒ Object
Delete an existing container.
-
#delete_object(container, object) ⇒ Object
Delete an existing object.
- #endpoint_uri(service_endpoint_url = nil) ⇒ Object
-
#get_container(container, options = {}) ⇒ Object
Get details for container and total bytes stored.
-
#get_containers(options = {}) ⇒ Object
List existing storage containers.
-
#get_object(container, object, &block) ⇒ Object
Get details for object.
-
#get_object_https_url(container, object, expires, options = {}) ⇒ Object
Get an expiring object https url from Cloud Files.
-
#head_container(container) ⇒ Object
List number of objects and total bytes stored.
-
#head_containers ⇒ Object
List number of containers and total bytes stored.
-
#head_object(container, object) ⇒ Object
Get headers for object.
-
#initialize(options = {}) ⇒ Real
constructor
A new instance of Real.
-
#post_set_meta_temp_url_key(key) ⇒ Object
Set the account wide Temp URL Key.
-
#put_container(name, options = {}) ⇒ Object
Create a new container.
-
#put_object(container, object, data, options = {}) ⇒ Object
Create a new object.
-
#put_object_manifest(container, object) ⇒ Object
Create a new object.
- #region ⇒ Object
-
#reload ⇒ Object
Resets presistent service connections.
- #request(params, parse_json = true, &block) ⇒ Object
- #service_name ⇒ Object
- #service_net? ⇒ Boolean
-
#ssl? ⇒ Boolean
Using SSL?.
Methods included from Utils
Constructor Details
#initialize(options = {}) ⇒ Real
Returns a new instance of Real.
96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 |
# File 'lib/fog/rackspace/storage.rb', line 96 def initialize(={}) require 'mime/types' @rackspace_api_key = [:rackspace_api_key] @rackspace_username = [:rackspace_username] @rackspace_cdn_ssl = [:rackspace_cdn_ssl] @rackspace_auth_url = [:rackspace_auth_url] @rackspace_servicenet = [:rackspace_servicenet] @rackspace_auth_token = [:rackspace_auth_token] @rackspace_storage_url = [:rackspace_storage_url] @rackspace_cdn_url = [:rackspace_cdn_url] @rackspace_region = [:rackspace_region] || :dfw @rackspace_temp_url_key = [:rackspace_temp_url_key] @rackspace_must_reauthenticate = false @connection_options = [:connection_options] || {} authenticate @persistent = [:persistent] || false Excon.defaults[:ssl_verify_peer] = false if service_net? @connection = Fog::Connection.new(endpoint_uri.to_s, @persistent, @connection_options) end |
Instance Attribute Details
#rackspace_cdn_ssl ⇒ Object (readonly)
Returns the value of attribute rackspace_cdn_ssl.
94 95 96 |
# File 'lib/fog/rackspace/storage.rb', line 94 def rackspace_cdn_ssl @rackspace_cdn_ssl end |
Instance Method Details
#account ⇒ Fog::Storage::Rackspace::Account
Return Account Details
119 120 121 122 |
# File 'lib/fog/rackspace/storage.rb', line 119 def account account = Fog::Storage::Rackspace::Account.new(:service => self) account.reload end |
#authenticate ⇒ Object
173 174 175 176 177 178 179 180 181 182 183 184 185 |
# File 'lib/fog/rackspace/storage.rb', line 173 def authenticate if @rackspace_must_reauthenticate || @rackspace_auth_token.nil? = { :rackspace_api_key => @rackspace_api_key, :rackspace_username => @rackspace_username, :rackspace_auth_url => @rackspace_auth_url } super() else @auth_token = @rackspace_auth_token @uri = URI.parse(@rackspace_storage_url) end end |
#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, ={}) headers = { 'X-Copy-From' => "/#{source_container_name}/#{source_object_name}" }.merge() 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 object
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 |
#endpoint_uri(service_endpoint_url = nil) ⇒ Object
195 196 197 198 199 200 201 |
# File 'lib/fog/rackspace/storage.rb', line 195 def endpoint_uri(service_endpoint_url=nil) return @uri if @uri @uri = super(@rackspace_storage_url || service_endpoint_url, :rackspace_storage_url) @uri.host = "snet-#{@uri.host}" if service_net? @uri 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, = {}) = .reject {|key, value| value.nil?} request( :expects => 200, :method => 'GET', :path => Fog::Rackspace.escape(container), :query => {'format' => 'json'}.merge!() ) 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( = {}) = .reject {|key, value| value.nil?} request( :expects => [200, 204], :method => 'GET', :path => '', :query => {'format' => 'json'}.merge!() ) 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 |
# 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!({ :expects => 200, :method => 'GET', :path => "#{Fog::Rackspace.escape(container)}/#{Fog::Rackspace.escape(object)}" }), false) end |
#get_object_https_url(container, object, expires, options = {}) ⇒ Object
Get an expiring object https url from Cloud Files
Parameters
-
container<~String> - Name of container containing object
-
object<~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.rackspace.com/files/api/v1/cf-devguide/content/Create_TempURL-d1a444.html
20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
# File 'lib/fog/rackspace/requests/storage/get_object_https_url.rb', line 20 def get_object_https_url(container, object, expires, = {}) if @rackspace_temp_url_key.nil? raise ArgumentError, "Storage must my instantiated with the :rackspace_temp_url_key option" end method = 'GET' expires = expires.to_i object_path_escaped = "#{@uri.path}/#{Fog::Rackspace.escape(container)}/#{Fog::Rackspace.escape(object,"/")}" object_path_unescaped = "#{@uri.path}/#{Fog::Rackspace.escape(container)}/#{object}" string_to_sign = "#{method}\n#{expires}\n#{object_path_unescaped}" hmac = Fog::HMAC.new('sha1', @rackspace_temp_url_key) sig = sig_to_hex(hmac.sign(string_to_sign)) "https://#{@uri.host}#{object_path_escaped}?temp_url_sig=#{sig}&temp_url_expires=#{expires}" 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_containers ⇒ Object
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 |
#post_set_meta_temp_url_key(key) ⇒ Object
Set the account wide Temp URL Key. This is a secret key that’s used to generate signed expiring URLs.
Once the key has been set with this request you should create new Storage objects with the :rackspace_temp_url_key option then use the get_object_https_url method to generate expiring URLs.
*** CAUTION *** changing this secret key will invalidate any expiring URLS generated with old keys.
Parameters
-
key<~String> - The new Temp URL Key
Returns
-
response<~Excon::Response>
See Also
docs.rackspace.com/files/api/v1/cf-devguide/content/Set_Account_Metadata-d1a4460.html
25 26 27 28 29 30 31 |
# File 'lib/fog/rackspace/requests/storage/post_set_meta_temp_url_key.rb', line 25 def (key) request( :expects => [201, 202, 204], :method => 'POST', :headers => {'X-Account-Meta-Temp-Url-Key' => key} ) end |
#put_container(name, options = {}) ⇒ 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 18 |
# File 'lib/fog/rackspace/requests/storage/put_container.rb', line 11 def put_container(name, ={}) request( :expects => [201, 202], :method => 'PUT', :headers => , :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, = {}) data = Fog::Storage.parse_data(data) headers = data[:headers].merge!() 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 |
#region ⇒ Object
191 192 193 |
# File 'lib/fog/rackspace/storage.rb', line 191 def region @rackspace_region end |
#reload ⇒ Object
Resets presistent service connections
132 133 134 |
# File 'lib/fog/rackspace/storage.rb', line 132 def reload @connection.reset end |
#request(params, parse_json = true, &block) ⇒ Object
136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 |
# File 'lib/fog/rackspace/storage.rb', line 136 def request(params, parse_json = true, &block) begin response = @connection.request(params.merge({ :headers => { 'Content-Type' => 'application/json', 'Accept' => 'application/json', 'X-Auth-Token' => auth_token }.merge!(params[:headers] || {}), :host => endpoint_uri.host, :path => "#{endpoint_uri.path}/#{params[:path]}", }), &block) rescue Excon::Errors::Unauthorized => error if error.response.body != 'Bad username or password' # token expiration @rackspace_must_reauthenticate = true authenticate retry else # bad credentials raise error end 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 = Fog::JSON.decode(response.body) end response end |
#service_name ⇒ Object
187 188 189 |
# File 'lib/fog/rackspace/storage.rb', line 187 def service_name :cloudFiles end |
#service_net? ⇒ Boolean
169 170 171 |
# File 'lib/fog/rackspace/storage.rb', line 169 def service_net? @rackspace_servicenet == true end |
#ssl? ⇒ Boolean
Using SSL?
127 128 129 |
# File 'lib/fog/rackspace/storage.rb', line 127 def ssl? !rackspace_cdn_ssl.nil? end |