1
0
Fork 0
mirror of https://github.com/fog/fog.git synced 2022-11-09 13:51:43 -05:00
fog--fog/lib/fog/rackspace/service.rb

133 lines
3.8 KiB
Ruby

module Fog
module Rackspace
class Service
def service_name
raise Fog::Errors::NotImplemented.new("Please implement the #service_name method")
end
def region
raise Fog::Errors::NotImplemented.new("Please implement the #region method")
end
def endpoint_uri(service_endpoint=nil, endpoint_name=nil)
return @uri if @uri
url = service_endpoint
unless url
if v1_authentication?
raise "Service Endpoint must be specified via #{endpoint_name} parameter"
else
url = endpoint_uri_v2
end
end
@uri = URI.parse url
end
def authenticate(options={})
self.send authentication_method, options
end
def request_without_retry(params, parse_json = true, &block)
response = @connection.request(request_params(params), &block)
process_response(response) if parse_json
response
end
def request(params, parse_json = true, &block)
first_attempt = true
begin
response = @connection.request(request_params(params), &block)
rescue Excon::Errors::Unauthorized => error
raise error unless first_attempt
first_attempt = false
authenticate
retry
end
process_response(response) if parse_json
response
end
private
def process_response(response)
if response && response.body && response.body.is_a?(String) && Fog::Rackspace.json_response?(response)
begin
response.body = Fog::JSON.decode(response.body)
rescue MultiJson::DecodeError => e
Fog::Logger.warning("Error Parsing response json - #{e}")
response.body = {}
end
end
end
def headers(options={})
h = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'X-Auth-Token' => auth_token
}.merge(options[:headers] || {})
end
def request_params(params)
params.merge({
:headers => headers(params),
:host => endpoint_uri.host,
:path => "#{endpoint_uri.path}/#{params[:path]}"
})
end
def authentication_method
if v2_authentication?
:authenticate_v2
else
Fog::Logger.deprecation "Authentication using a v1.0/v1.1 endpoint is deprecated. Please specify a v2.0 endpoint using :rackpace_auth_url.\
For a list of v2.0 endpoints refer to http://docs.rackspace.com/auth/api/v2.0/auth-client-devguide/content/Endpoints-d1e180.html"
:authenticate_v1
end
end
def v1_authentication?
!v2_authentication?
end
def v2_authentication?
@rackspace_auth_url.nil? || @rackspace_auth_url =~ /v2(\.\d)?\w*$/
end
def authenticate_v2(identity_options)
hash = {
:rackspace_api_key => identity_options[:rackspace_api_key],
:rackspace_username => identity_options[:rackspace_username],
:rackspace_auth_url => identity_options[:rackspace_auth_url],
:connection_options => identity_options[:connection_options] || {}
}
@identity_service = Fog::Rackspace::Identity.new(hash)
@auth_token = @identity_service.auth_token
end
def authenticate_v1(options)
raise Fog::Errors::NotImplemented.new("Authentication of legacy endpoints is not implemented for this service.")
end
def endpoint_uri_v2
@uri = @identity_service.service_catalog.get_endpoint(service_name, region)
end
def auth_token
@auth_token || @identity_service.auth_token
end
def select_options(keys)
return nil unless @options && keys
@options.select {|k,v| keys.include?(k)}
end
end
end
end