diff --git a/lib/fog/rackspace.rb b/lib/fog/rackspace.rb index 6132fbc84..ddf810613 100644 --- a/lib/fog/rackspace.rb +++ b/lib/fog/rackspace.rb @@ -1,6 +1,7 @@ require File.join(File.dirname(__FILE__), 'core') require 'fog/rackspace/mock_data' require 'fog/rackspace/service' +require 'fog/rackspace/errors' module Fog module Rackspace @@ -25,21 +26,24 @@ module Fog if error.response status_code = error.response.status unless error.response.body.empty? - data = Fog::JSON.decode(error.response.body) - message = data.values.first ? data.values.first['message'] : data['message'] + begin + data = Fog::JSON.decode(error.response.body) + message = data.values.first ? data.values.first['message'] : data['message'] + rescue Fog::JSON::LoadError => e + data = error.response.body + end end end new_error = super(error, message) new_error.instance_variable_set(:@response_data, data) - new_error.instance_variable_set(:@status_code, status_code) + new_error.instance_variable_set(:@status_code, status_code) new_error end end class InternalServerError < ServiceError; end class Conflict < ServiceError; end - class NotFound < ServiceError; end class ServiceUnavailable < ServiceError; end class BadRequest < ServiceError diff --git a/lib/fog/rackspace/block_storage.rb b/lib/fog/rackspace/block_storage.rb index 6b8f78bf8..eeea7034d 100644 --- a/lib/fog/rackspace/block_storage.rb +++ b/lib/fog/rackspace/block_storage.rb @@ -3,6 +3,7 @@ require File.expand_path(File.join(File.dirname(__FILE__), '..', 'rackspace')) module Fog module Rackspace class BlockStorage < Fog::Service + include Fog::Rackspace::Errors class IdentifierTaken < Fog::Errors::Error; end class ServiceError < Fog::Rackspace::Errors::ServiceError; end @@ -98,7 +99,7 @@ module Fog :path => "#{endpoint_uri.path}/#{params[:path]}" })) rescue Excon::Errors::NotFound => error - raise NotFound.slurp error + raise NotFound.slurp(error, region) rescue Excon::Errors::BadRequest => error raise BadRequest.slurp error rescue Excon::Errors::InternalServerError => error diff --git a/lib/fog/rackspace/cdn.rb b/lib/fog/rackspace/cdn.rb index 80ef386d9..2bc8f559b 100644 --- a/lib/fog/rackspace/cdn.rb +++ b/lib/fog/rackspace/cdn.rb @@ -4,7 +4,6 @@ require 'fog/cdn' module Fog module CDN class Rackspace < Fog::Service - requires :rackspace_api_key, :rackspace_username recognizes :rackspace_auth_url, :persistent, :rackspace_cdn_ssl, :rackspace_region, :rackspace_cdn_url @@ -167,7 +166,7 @@ module Fog rescue Excon::Errors::HTTPStatusError => error raise case error when Excon::Errors::NotFound - Fog::Storage::Rackspace::NotFound.slurp(error) + Fog::Storage::Rackspace::NotFound.slurp(error, region) else error end diff --git a/lib/fog/rackspace/compute.rb b/lib/fog/rackspace/compute.rb index 8621ea460..0d61e7c92 100644 --- a/lib/fog/rackspace/compute.rb +++ b/lib/fog/rackspace/compute.rb @@ -4,6 +4,7 @@ require 'fog/compute' module Fog module Compute class Rackspace < Fog::Service + include Fog::Rackspace::Errors requires :rackspace_api_key, :rackspace_username recognizes :rackspace_auth_url, :rackspace_servicenet, :persistent @@ -223,7 +224,7 @@ module Fog rescue Excon::Errors::HTTPStatusError => error raise case error when Excon::Errors::NotFound - Fog::Compute::Rackspace::NotFound.slurp(error) + NotFound.slurp(error, region) else error end diff --git a/lib/fog/rackspace/compute_v2.rb b/lib/fog/rackspace/compute_v2.rb index 113765c09..1b66ff6f1 100644 --- a/lib/fog/rackspace/compute_v2.rb +++ b/lib/fog/rackspace/compute_v2.rb @@ -3,6 +3,7 @@ require 'fog/compute' module Fog module Compute class RackspaceV2 < Fog::Service + include Fog::Rackspace::Errors class ServiceError < Fog::Rackspace::Errors::ServiceError; end class InternalServerError < Fog::Rackspace::Errors::InternalServerError; end @@ -148,7 +149,7 @@ module Fog :path => "#{endpoint_uri.path}/#{params[:path]}" })) rescue Excon::Errors::NotFound => error - raise NotFound.slurp error + raise NotFound.slurp(error, region) rescue Excon::Errors::BadRequest => error raise BadRequest.slurp error rescue Excon::Errors::InternalServerError => error diff --git a/lib/fog/rackspace/databases.rb b/lib/fog/rackspace/databases.rb index 4a8368881..ae5c0564a 100644 --- a/lib/fog/rackspace/databases.rb +++ b/lib/fog/rackspace/databases.rb @@ -3,6 +3,7 @@ require File.expand_path(File.join(File.dirname(__FILE__), '..', 'rackspace')) module Fog module Rackspace class Databases < Fog::Service + include Fog::Rackspace::Errors class ServiceError < Fog::Rackspace::Errors::ServiceError; end class InternalServerError < Fog::Rackspace::Errors::InternalServerError; end @@ -96,7 +97,7 @@ module Fog :path => "#{endpoint_uri.path}/#{params[:path]}" })) rescue Excon::Errors::NotFound => error - raise NotFound.slurp error + raise NotFound.slurp(error, region) rescue Excon::Errors::BadRequest => error raise BadRequest.slurp error rescue Excon::Errors::InternalServerError => error diff --git a/lib/fog/rackspace/errors.rb b/lib/fog/rackspace/errors.rb new file mode 100644 index 000000000..a0196bd40 --- /dev/null +++ b/lib/fog/rackspace/errors.rb @@ -0,0 +1,27 @@ +module Fog + module Rackspace + module Errors + + def self.included(mod) + mod.class_eval <<-'EOS', __FILE__, __LINE__ + class NotFound < Fog::Service::NotFound + attr_reader :region, :status_code + + def to_s + status = status_code ? "[HTTP #{status_code}] " : "" + message = region ? "resource not found in #{region} region" : super + "#{status}#{message}" + end + + def self.slurp(error, region=nil) + exception = NotFound.new + exception.instance_variable_set(:@region, region) + exception.instance_variable_set(:@status_code, error.response.status) rescue nil + exception + end + end + EOS + end + end + end +end \ No newline at end of file diff --git a/lib/fog/rackspace/load_balancers.rb b/lib/fog/rackspace/load_balancers.rb index 9fdcfe8d5..7108f81d3 100644 --- a/lib/fog/rackspace/load_balancers.rb +++ b/lib/fog/rackspace/load_balancers.rb @@ -3,6 +3,7 @@ require 'fog/rackspace' module Fog module Rackspace class LoadBalancers < Fog::Service + include Fog::Rackspace::Errors #These references exist for backwards compatibility class ServiceError < Fog::Rackspace::Errors::ServiceError; end @@ -131,7 +132,7 @@ module Fog :path => "#{endpoint_uri.path}/#{params[:path]}" })) rescue Excon::Errors::NotFound => error - raise NotFound.slurp error + raise NotFound.slurp(error, region) rescue Excon::Errors::BadRequest => error raise BadRequest.slurp error rescue Excon::Errors::InternalServerError => error diff --git a/lib/fog/rackspace/storage.rb b/lib/fog/rackspace/storage.rb index 074763894..665ff116e 100644 --- a/lib/fog/rackspace/storage.rb +++ b/lib/fog/rackspace/storage.rb @@ -4,6 +4,7 @@ require 'fog/storage' module Fog module Storage class Rackspace < Fog::Service + include Fog::Rackspace::Errors requires :rackspace_api_key, :rackspace_username recognizes :rackspace_auth_url, :rackspace_servicenet, :rackspace_cdn_ssl, :persistent, :rackspace_region @@ -155,7 +156,7 @@ module Fog rescue Excon::Errors::HTTPStatusError => error raise case error when Excon::Errors::NotFound - Fog::Storage::Rackspace::NotFound.slurp(error) + NotFound.slurp(error, region) else error end