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 = {}, &block) ⇒ Object
Create a new object.
-
#put_object_manifest(container, object, options = {}) ⇒ Object
Create a new manifest 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.
101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 |
# File 'lib/fog/rackspace/storage.rb', line 101 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.
99 100 101 |
# File 'lib/fog/rackspace/storage.rb', line 99 def rackspace_cdn_ssl @rackspace_cdn_ssl end |
Instance Method Details
#account ⇒ Fog::Storage::Rackspace::Account
Return Account Details
124 125 126 127 |
# File 'lib/fog/rackspace/storage.rb', line 124 def account account = Fog::Storage::Rackspace::Account.new(:service => self) account.reload end |
#authenticate ⇒ Object
179 180 181 182 183 184 185 186 187 188 189 190 191 192 |
# File 'lib/fog/rackspace/storage.rb', line 179 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, :connection_options => @connection_options } 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
18 19 20 21 22 23 24 25 26 |
# File 'lib/fog/rackspace/requests/storage/copy_object.rb', line 18 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
14 15 16 17 18 19 20 |
# File 'lib/fog/rackspace/requests/storage/delete_container.rb', line 14 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
15 16 17 18 19 20 21 |
# File 'lib/fog/rackspace/requests/storage/delete_object.rb', line 15 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
202 203 204 205 206 207 208 |
# File 'lib/fog/rackspace/storage.rb', line 202 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
-
-
-
35 36 37 38 39 40 41 42 43 |
# File 'lib/fog/rackspace/requests/storage/get_container.rb', line 35 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
-
-
-
24 25 26 27 28 29 30 31 32 |
# File 'lib/fog/rackspace/requests/storage/get_containers.rb', line 24 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
15 16 17 18 19 20 21 22 23 24 25 26 27 |
# File 'lib/fog/rackspace/requests/storage/get_object.rb', line 15 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
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
# File 'lib/fog/rackspace/requests/storage/get_object_https_url.rb', line 23 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
-
-
20 21 22 23 24 25 26 27 |
# File 'lib/fog/rackspace/requests/storage/head_container.rb', line 20 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
-
-
17 18 19 20 21 22 23 24 |
# File 'lib/fog/rackspace/requests/storage/head_containers.rb', line 17 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
15 16 17 18 19 20 21 |
# File 'lib/fog/rackspace/requests/storage/head_object.rb', line 15 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
28 29 30 31 32 33 34 |
# File 'lib/fog/rackspace/requests/storage/post_set_meta_temp_url_key.rb', line 28 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 ‘/’
14 15 16 17 18 19 20 21 |
# File 'lib/fog/rackspace/requests/storage/put_container.rb', line 14 def put_container(name, ={}) request( :expects => [201, 202], :method => 'PUT', :headers => , :path => Fog::Rackspace.escape(name) ) end |
#put_object(container, object, data, options = {}, &block) ⇒ 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 {}.
17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
# File 'lib/fog/rackspace/requests/storage/put_object.rb', line 17 def put_object(container, object, data, = {}, &block) data = Fog::Storage.parse_data(data) headers = data[:headers].merge!() params = block_given? ? { :request_block => block } : { :body => data[:body] } params.merge!( :expects => 201, :idempotent => true, :headers => headers, :method => 'PUT', :path => "#{Fog::Rackspace.escape(container)}/#{Fog::Rackspace.escape(object)}" ) request(params) end |
#put_object_manifest(container, object, options = {}) ⇒ Object
Create a new manifest object
Creates an object with a X-Object-Manifest
header that specifies the common prefix (“<container>/<prefix>”) for all uploaded segments. Retrieving the manifest object streams all segments matching this prefix. Segments must sort in the order they should be concatenated. Note that any future objects stored in the container along with the segments that match the prefix will be included when retrieving the manifest object.
All segments must be stored in the same container, but may be in a different container than the manifest object. The default X-Object-Manifest
header is set to “container
/object
”, but may be overridden in options
to specify the prefix and/or the container where segments were stored. If overridden, names should be CGI escaped (excluding spaces) if needed (see Rackspace.escape).
29 30 31 32 33 34 35 36 37 38 |
# File 'lib/fog/rackspace/requests/storage/put_object_manifest.rb', line 29 def put_object_manifest(container, object, = {}) path = "#{Fog::Rackspace.escape(container)}/#{Fog::Rackspace.escape(object)}" headers = {'X-Object-Manifest' => path}.merge() request( :expects => 201, :headers => headers, :method => 'PUT', :path => path ) end |
#region ⇒ Object
198 199 200 |
# File 'lib/fog/rackspace/storage.rb', line 198 def region @rackspace_region end |
#reload ⇒ Object
Resets presistent service connections
137 138 139 |
# File 'lib/fog/rackspace/storage.rb', line 137 def reload @connection.reset end |
#request(params, parse_json = true, &block) ⇒ Object
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 168 169 170 171 172 173 |
# File 'lib/fog/rackspace/storage.rb', line 141 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::NotFound => error raise NotFound.slurp(error, region) rescue Excon::Errors::BadRequest => error raise BadRequest.slurp error rescue Excon::Errors::InternalServerError => error raise InternalServerError.slurp error rescue Excon::Errors::HTTPStatusError => error raise ServiceError.slurp error 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
194 195 196 |
# File 'lib/fog/rackspace/storage.rb', line 194 def service_name :cloudFiles end |
#service_net? ⇒ Boolean
175 176 177 |
# File 'lib/fog/rackspace/storage.rb', line 175 def service_net? @rackspace_servicenet == true end |
#ssl? ⇒ Boolean
Using SSL?
132 133 134 |
# File 'lib/fog/rackspace/storage.rb', line 132 def ssl? !rackspace_cdn_ssl.nil? end |