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

Merge pull request #1935 from jbence/feature/update_AWS_error_handling

[aws] Update aws error handling
This commit is contained in:
Wesley Beary 2013-07-03 10:07:29 -07:00
commit 9cdc2bce09
10 changed files with 126 additions and 138 deletions

View file

@ -301,5 +301,16 @@ module Fog
end end
options options
end end
module Errors
def self.match_error(error)
matcher = lambda {|s| s.match(/(?:.*<Code>(.*)<\/Code>)(?:.*<Message>(.*)<\/Message>)/m)}
[error.message, error.response.body].each(&Proc.new {|s|
match = matcher.call(s)
return {:code => match[1].split('.').last, :message => match[2]} if match
})
{} # we did not match the message or response body
end
end
end end
end end

View file

@ -143,7 +143,7 @@ module Fog
def _request(body, idempotent, parser) def _request(body, idempotent, parser)
begin begin
response = @connection.request({ @connection.request({
:body => body, :body => body,
:expects => 200, :expects => 200,
:idempotent => idempotent, :idempotent => idempotent,
@ -153,24 +153,19 @@ module Fog
:parser => parser :parser => parser
}) })
rescue Excon::Errors::HTTPStatusError => error rescue Excon::Errors::HTTPStatusError => error
if match = error.message.match(/(?:.*<Code>(.*)<\/Code>)(?:.*<Message>(.*)<\/Message>)/m) match = Fog::AWS::Errors.match_error(error)
case match[1] raise if match.empty?
raise case match[:code]
when 'AlreadyExists' when 'AlreadyExists'
#raise Fog::AWS::AutoScaling::IdentifierTaken.new(match[2]) Fog::AWS::AutoScaling::IdentifierTaken.slurp(error, match[:message])
raise Fog::AWS::AutoScaling::IdentifierTaken.slurp(error, match[2])
when 'ResourceInUse' when 'ResourceInUse'
raise Fog::AWS::AutoScaling::ResourceInUse.slurp(error, match[2]) Fog::AWS::AutoScaling::ResourceInUse.slurp(error, match[:message])
when 'ValidationError' when 'ValidationError'
raise Fog::AWS::AutoScaling::ValidationError.slurp(error, match[2]) Fog::AWS::AutoScaling::ValidationError.slurp(error, match[:message])
else else
raise Fog::Compute::AWS::Error.slurp(error, "#{match[1]} => #{match[2]}") Fog::AWS::AutoScaling::Error.slurp(error, "#{match[:code]} => #{match[:message]}")
end
else
raise
end end
end end
response
end end
def setup_credentials(options) def setup_credentials(options)

View file

@ -131,15 +131,13 @@ module Fog
:parser => parser :parser => parser
}) })
rescue Excon::Errors::HTTPStatusError => error rescue Excon::Errors::HTTPStatusError => error
if match = error.message.match(/(?:.*<Code>(.*)<\/Code>)(?:.*<Message>(.*)<\/Message>)/m) match = Fog::AWS::Errors.match_error(error)
raise case match[1].split('.').last raise if match.empty?
raise case match[:code]
when 'InvalidParameterValue' when 'InvalidParameterValue'
Fog::AWS::ElasticBeanstalk::InvalidParameterError.slurp(error, match[2]) Fog::AWS::ElasticBeanstalk::InvalidParameterError.slurp(error, match[:message])
else else
Fog::AWS::ElasticBeanstalk::Error.slurp(error, "#{match[1]} => #{match[2]}") Fog::AWS::ElasticBeanstalk::Error.slurp(error, "#{match[:code]} => #{match[:message]}")
end
else
raise error
end end
end end

View file

@ -98,7 +98,7 @@ module Fog
) )
begin begin
response = @connection.request({ @connection.request({
:body => body, :body => body,
:expects => 200, :expects => 200,
:idempotent => idempotent, :idempotent => idempotent,
@ -108,19 +108,16 @@ module Fog
:parser => parser :parser => parser
}) })
rescue Excon::Errors::HTTPStatusError => error rescue Excon::Errors::HTTPStatusError => error
if match = error.message.match(/(?:.*<Code>(.*)<\/Code>)(?:.*<Message>(.*)<\/Message>)/m) match = Fog::AWS::Errors.match_error(error)
raise case match[1].split('.').last raise if match.empty?
raise case match[:code]
when 'NotFound', 'ValidationError' when 'NotFound', 'ValidationError'
Fog::AWS::CloudFormation::NotFound.slurp(error, match[2]) Fog::AWS::CloudFormation::NotFound.slurp(error, match[:message])
else else
Fog::AWS::CloudFormation::Error.slurp(error, "#{match[1]} => #{match[2]}") Fog::AWS::CloudFormation::Error.slurp(error, "#{match[:code]} => #{match[:message]}")
end
else
raise error
end end
end end
response
end end
end end

View file

@ -392,15 +392,13 @@ module Fog
:parser => parser :parser => parser
}) })
rescue Excon::Errors::HTTPStatusError => error rescue Excon::Errors::HTTPStatusError => error
if match = error.message.match(/(?:.*<Code>(.*)<\/Code>)(?:.*<Message>(.*)<\/Message>)/m) match = Fog::AWS::Errors.match_error(error)
raise case match[1].split('.').last raise if match.empty?
raise case match[:code]
when 'NotFound', 'Unknown' when 'NotFound', 'Unknown'
Fog::Compute::AWS::NotFound.slurp(error, match[2]) Fog::Compute::AWS::NotFound.slurp(error, match[:message])
else else
Fog::Compute::AWS::Error.slurp(error, "#{match[1]} => #{match[2]}") Fog::Compute::AWS::Error.slurp(error, "#{match[:code]} => #{match[:message]}")
end
else
raise error
end end
end end

View file

@ -94,7 +94,7 @@ module Fog
) )
begin begin
response = @connection.request({ @connection.request({
:body => body, :body => body,
:expects => 200, :expects => 200,
:headers => { 'Content-Type' => 'application/x-www-form-urlencoded' }, :headers => { 'Content-Type' => 'application/x-www-form-urlencoded' },
@ -104,24 +104,20 @@ module Fog
:parser => parser :parser => parser
}) })
rescue Excon::Errors::HTTPStatusError => error rescue Excon::Errors::HTTPStatusError => error
if match = error.message.match(/(?:.*<Code>(.*)<\/Code>?)/m) match = Fog::AWS::Errors.match_error(error)
case match[1] raise if match.empty?
when 'CacheSecurityGroupNotFound', 'CacheParameterGroupNotFound', raise case match[:code]
'CacheClusterNotFound' when 'CacheSecurityGroupNotFound', 'CacheParameterGroupNotFound', 'CacheClusterNotFound'
raise Fog::AWS::Elasticache::NotFound Fog::AWS::Elasticache::NotFound.slurp(error, match[:message])
when 'CacheSecurityGroupAlreadyExists' when 'CacheSecurityGroupAlreadyExists'
raise Fog::AWS::Elasticache::IdentifierTaken Fog::AWS::Elasticache::IdentifierTaken.slurp(error, match[:message])
when 'InvalidParameterValue' when 'InvalidParameterValue'
raise Fog::AWS::Elasticache::InvalidInstance Fog::AWS::Elasticache::InvalidInstance.slurp(error, match[:message])
else else
raise Fog::AWS::Elasticache::Error.slurp(error, "#{match[:code]} => #{match[:message]}")
end
else
raise
end end
end end
response
end end
end end

View file

@ -191,36 +191,34 @@ module Fog
:parser => parser :parser => parser
}) })
rescue Excon::Errors::HTTPStatusError => error rescue Excon::Errors::HTTPStatusError => error
if match = error.message.match(/(?:.*<Code>(.*)<\/Code>)(?:.*<Message>(.*)<\/Message>)/m) match = Fog::AWS::Errors.match_error(error)
case match[1] raise if match.empty?
raise case match[:code]
when 'CertificateNotFound' when 'CertificateNotFound'
raise Fog::AWS::IAM::NotFound.slurp(error, match[2]) Fog::AWS::IAM::NotFound.slurp(error, match[:message])
when 'DuplicateLoadBalancerName' when 'DuplicateLoadBalancerName'
raise Fog::AWS::ELB::IdentifierTaken.slurp(error, match[2]) Fog::AWS::ELB::IdentifierTaken.slurp(error, match[:message])
when 'DuplicatePolicyName' when 'DuplicatePolicyName'
raise Fog::AWS::ELB::DuplicatePolicyName.slurp(error, match[2]) Fog::AWS::ELB::DuplicatePolicyName.slurp(error, match[:message])
when 'InvalidInstance' when 'InvalidInstance'
raise Fog::AWS::ELB::InvalidInstance.slurp(error, match[2]) Fog::AWS::ELB::InvalidInstance.slurp(error, match[:message])
when 'InvalidConfigurationRequest' when 'InvalidConfigurationRequest'
# when do they fucking use this shit? # when do they fucking use this shit?
raise Fog::AWS::ELB::InvalidConfigurationRequest.slurp(error, match[2]) Fog::AWS::ELB::InvalidConfigurationRequest.slurp(error, match[:message])
when 'LoadBalancerNotFound' when 'LoadBalancerNotFound'
raise Fog::AWS::ELB::NotFound.slurp(error, match[2]) Fog::AWS::ELB::NotFound.slurp(error, match[:message])
when 'PolicyNotFound' when 'PolicyNotFound'
raise Fog::AWS::ELB::PolicyNotFound.slurp(error, match[2]) Fog::AWS::ELB::PolicyNotFound.slurp(error, match[:message])
when 'PolicyTypeNotFound' when 'PolicyTypeNotFound'
raise Fog::AWS::ELB::PolicyTypeNotFound.slurp(error, match[2]) Fog::AWS::ELB::PolicyTypeNotFound.slurp(error, match[:message])
when 'Throttling' when 'Throttling'
raise Fog::AWS::ELB::Throttled.slurp(error, match[2]) Fog::AWS::ELB::Throttled.slurp(error, match[:message])
when 'TooManyPolicies' when 'TooManyPolicies'
raise Fog::AWS::ELB::TooManyPolicies.slurp(error, match[2]) Fog::AWS::ELB::TooManyPolicies.slurp(error, match[:message])
when 'ValidationError' when 'ValidationError'
raise Fog::AWS::ELB::ValidationError.slurp(error, match[2]) Fog::AWS::ELB::ValidationError.slurp(error, match[:message])
else else
raise Fog::AWS::ELB::Error.slurp(error, "#{match[:code]} => #{match[:message]}")
end
else
raise
end end
end end
end end

View file

@ -208,18 +208,15 @@ module Fog
:parser => parser :parser => parser
}) })
rescue Excon::Errors::HTTPStatusError => error rescue Excon::Errors::HTTPStatusError => error
if match = error.message.match(/(?:.*<Code>(.*)<\/Code>)(?:.*<Message>(.*)<\/Message>)/m) match = Fog::AWS::Errors.match_error(error)
case match[1] raise if match.empty?
raise case match[:code]
when 'CertificateNotFound', 'NoSuchEntity' when 'CertificateNotFound', 'NoSuchEntity'
raise Fog::AWS::IAM::NotFound.slurp(error, match[2]) Fog::AWS::IAM::NotFound.slurp(error, match[:message])
when 'EntityAlreadyExists', 'KeyPairMismatch', 'LimitExceeded', 'MalformedCertificate', 'ValidationError' when 'EntityAlreadyExists', 'KeyPairMismatch', 'LimitExceeded', 'MalformedCertificate', 'ValidationError'
raise Fog::AWS::IAM.const_get(match[1]).slurp(error, match[2]) Fog::AWS::IAM.const_get(match[:code]).slurp(error, match[:message])
else else
raise Fog::AWS::IAM::Error.slurp(error, "#{match[1]} => #{match[2]}") if match[1] Fog::AWS::IAM::Error.slurp(error, "#{match[:code]} => #{match[:message]}")
raise
end
else
raise
end end
end end

View file

@ -197,7 +197,7 @@ module Fog
) )
begin begin
response = @connection.request({ @connection.request({
:body => body, :body => body,
:expects => 200, :expects => 200,
:headers => { 'Content-Type' => 'application/x-www-form-urlencoded' }, :headers => { 'Content-Type' => 'application/x-www-form-urlencoded' },
@ -207,23 +207,27 @@ module Fog
:parser => parser :parser => parser
}) })
rescue Excon::Errors::HTTPStatusError => error rescue Excon::Errors::HTTPStatusError => error
if match = error.response.body.match(/(?:.*<Code>(.*)<\/Code>)(?:.*<Message>(.*)<\/Message>)/m) match = Fog::AWS::Errors.match_error(error)
case match[1].split('.').last if match.empty?
case error.message
when 'Not Found'
raise Fog::AWS::RDS::NotFound.slurp(error, 'RDS Instance not found')
else
raise
end
else
raise case match[:code]
when 'DBInstanceNotFound', 'DBParameterGroupNotFound', 'DBSnapshotNotFound', 'DBSecurityGroupNotFound' when 'DBInstanceNotFound', 'DBParameterGroupNotFound', 'DBSnapshotNotFound', 'DBSecurityGroupNotFound'
raise Fog::AWS::RDS::NotFound.slurp(error, match[2]) Fog::AWS::RDS::NotFound.slurp(error, match[:message])
when 'DBParameterGroupAlreadyExists' when 'DBParameterGroupAlreadyExists'
raise Fog::AWS::RDS::IdentifierTaken.slurp(error, match[2]) Fog::AWS::RDS::IdentifierTaken.slurp(error, match[:message])
when 'AuthorizationAlreadyExists' when 'AuthorizationAlreadyExists'
raise Fog::AWS::RDS::AuthorizationAlreadyExists.slurp(error, match[2]) Fog::AWS::RDS::AuthorizationAlreadyExists.slurp(error, match[:message])
else else
raise Fog::AWS::RDS::Error.slurp(error, "#{match[:code]} => #{match[:message]}")
end end
else
raise
end end
end end
response
end end
end end

View file

@ -102,7 +102,7 @@ module Fog
) )
begin begin
response = @connection.request({ @connection.request({
:body => body, :body => body,
:expects => 200, :expects => 200,
:idempotent => idempotent, :idempotent => idempotent,
@ -111,23 +111,17 @@ module Fog
:method => 'POST', :method => 'POST',
:parser => parser :parser => parser
}) })
response
rescue Excon::Errors::HTTPStatusError => error rescue Excon::Errors::HTTPStatusError => error
if match = error.message.match(/(?:.*<Code>(.*)<\/Code>)(?:.*<Message>(.*)<\/Message>)/m) match = Fog::AWS::Errors.match_error(error)
case match[1] raise if match.empty?
raise case match[:code]
when 'EntityAlreadyExists', 'KeyPairMismatch', 'LimitExceeded', 'MalformedCertificate', 'ValidationError' when 'EntityAlreadyExists', 'KeyPairMismatch', 'LimitExceeded', 'MalformedCertificate', 'ValidationError'
raise Fog::AWS::STS.const_get(match[1]).slurp(error, match[2]) Fog::AWS::STS.const_get(match[:code]).slurp(error, match[:message])
else else
raise Fog::AWS::STS::Error.slurp(error, "#{match[1]} => #{match[2]}") if match[1] Fog::AWS::STS::Error.slurp(error, "#{match[:code]} => #{match[:message]}")
raise
end
else
raise
end end
end end
end end
end end