mirror of
https://github.com/fog/fog.git
synced 2022-11-09 13:51:43 -05:00
aa06767a89
closes #515
81 lines
2.8 KiB
Ruby
81 lines
2.8 KiB
Ruby
require(File.expand_path(File.join(File.dirname(__FILE__), 'core')))
|
|
|
|
module Fog
|
|
module Rackspace
|
|
extend Fog::Provider
|
|
|
|
module Errors
|
|
class ServiceError < Fog::Errors::Error
|
|
attr_reader :response_data
|
|
|
|
def self.slurp(error)
|
|
if error.response.body.empty?
|
|
data = nil
|
|
message = nil
|
|
else
|
|
data = MultiJson.decode(error.response.body)
|
|
message = data['message']
|
|
end
|
|
|
|
new_error = super(error, message)
|
|
new_error.instance_variable_set(:@response_data, data)
|
|
new_error
|
|
end
|
|
end
|
|
|
|
class InternalServerError < ServiceError; end
|
|
class Conflict < ServiceError; end
|
|
class NotFound < ServiceError; end
|
|
class ServiceUnavailable < ServiceError; end
|
|
|
|
class BadRequest < ServiceError
|
|
#TODO - Need to find a bette way to print out these validation errors when they are thrown
|
|
attr_reader :validation_errors
|
|
|
|
def self.slurp(error)
|
|
new_error = super(error)
|
|
unless new_error.response_data.nil?
|
|
new_error.instance_variable_set(:@validation_errors, new_error.response_data['validationErrors'])
|
|
end
|
|
new_error
|
|
end
|
|
end
|
|
end
|
|
|
|
service(:cdn, 'rackspace/cdn', 'CDN')
|
|
service(:compute, 'rackspace/compute', 'Compute')
|
|
service(:dns, 'rackspace/dns', 'DNS')
|
|
service(:storage, 'rackspace/storage', 'Storage')
|
|
service(:load_balancers, 'rackspace/load_balancers', 'LoadBalancers')
|
|
|
|
def self.authenticate(options, connection_options = {})
|
|
rackspace_auth_url = options[:rackspace_auth_url] || "auth.api.rackspacecloud.com"
|
|
url = rackspace_auth_url.match(/^https?:/) ? \
|
|
rackspace_auth_url : 'https://' + rackspace_auth_url
|
|
uri = URI.parse(url)
|
|
connection = Fog::Connection.new(url, false, connection_options)
|
|
@rackspace_api_key = options[:rackspace_api_key]
|
|
@rackspace_username = options[:rackspace_username]
|
|
response = connection.request({
|
|
:expects => [200, 204],
|
|
:headers => {
|
|
'X-Auth-Key' => @rackspace_api_key,
|
|
'X-Auth-User' => @rackspace_username
|
|
},
|
|
:host => uri.host,
|
|
:method => 'GET',
|
|
:path => (uri.path and not uri.path.empty?) ? uri.path : 'v1.0'
|
|
})
|
|
response.headers.reject do |key, value|
|
|
!['X-Server-Management-Url', 'X-Storage-Url', 'X-CDN-Management-Url', 'X-Auth-Token'].include?(key)
|
|
end
|
|
end
|
|
|
|
# CGI.escape, but without special treatment on spaces
|
|
def self.escape(str,extra_exclude_chars = '')
|
|
str.gsub(/([^a-zA-Z0-9_.-#{extra_exclude_chars}]+)/) do
|
|
'%' + $1.unpack('H2' * $1.bytesize).join('%').upcase
|
|
end
|
|
end
|
|
end
|
|
end
|