2017-02-24 00:43:48 +00:00
from __future__ import unicode_literals
2015-02-10 13:31:28 +00:00
from werkzeug . exceptions import HTTPException
from jinja2 import DictLoader , Environment
2016-07-08 19:32:34 +00:00
SINGLE_ERROR_RESPONSE = u """ <?xml version= " 1.0 " encoding= " UTF-8 " ?>
< Error >
< Code > { { error_type } } < / Code >
< Message > { { message } } < / Message >
{ % block extra % } { % endblock % }
< RequestID > 7 a62c49f - 347e-4 fc4 - 9331 - 6e8 eEXAMPLE < / RequestID >
< / Error >
"""
2015-02-10 13:31:28 +00:00
ERROR_RESPONSE = u """ <?xml version= " 1.0 " encoding= " UTF-8 " ?>
< Response >
< Errors >
< Error >
2016-01-17 23:00:57 +00:00
< Code > { { error_type } } < / Code >
2015-02-10 13:31:28 +00:00
< Message > { { message } } < / Message >
{ % block extra % } { % endblock % }
< / Error >
< / Errors >
< RequestID > 7 a62c49f - 347e-4 fc4 - 9331 - 6e8 eEXAMPLE < / RequestID >
< / Response >
"""
2016-01-17 23:00:57 +00:00
ERROR_JSON_RESPONSE = u """ {
" message " : " {{ message}} " ,
" __type " : " {{ error_type}} "
}
"""
2015-02-10 13:31:28 +00:00
2017-02-24 02:37:43 +00:00
2015-02-10 13:31:28 +00:00
class RESTError ( HTTPException ) :
2017-10-28 19:17:34 +00:00
code = 400
2015-02-10 13:31:28 +00:00
templates = {
2016-07-08 19:32:34 +00:00
' single_error ' : SINGLE_ERROR_RESPONSE ,
2016-01-17 23:00:57 +00:00
' error ' : ERROR_RESPONSE ,
' error_json ' : ERROR_JSON_RESPONSE ,
2015-02-10 13:31:28 +00:00
}
2016-01-17 23:00:57 +00:00
def __init__ ( self , error_type , message , template = ' error ' , * * kwargs ) :
2015-02-10 13:31:28 +00:00
super ( RESTError , self ) . __init__ ( )
env = Environment ( loader = DictLoader ( self . templates ) )
2016-01-17 23:00:57 +00:00
self . error_type = error_type
self . message = message
2015-02-10 13:31:28 +00:00
self . description = env . get_template ( template ) . render (
2016-01-17 23:00:57 +00:00
error_type = error_type , message = message , * * kwargs )
2017-02-24 00:43:48 +00:00
class DryRunClientError ( RESTError ) :
code = 400
2016-01-17 23:00:57 +00:00
class JsonRESTError ( RESTError ) :
def __init__ ( self , error_type , message , template = ' error_json ' , * * kwargs ) :
2017-02-24 02:37:43 +00:00
super ( JsonRESTError , self ) . __init__ (
error_type , message , template , * * kwargs )
2016-01-17 23:00:57 +00:00
def get_headers ( self , * args , * * kwargs ) :
return [ ( ' Content-Type ' , ' application/json ' ) ]
def get_body ( self , * args , * * kwargs ) :
return self . description
2019-07-02 15:40:08 +00:00
class SignatureDoesNotMatchError ( RESTError ) :
2019-07-24 15:21:33 +00:00
code = 403
2019-07-02 15:40:08 +00:00
def __init__ ( self ) :
super ( SignatureDoesNotMatchError , self ) . __init__ (
' SignatureDoesNotMatch ' ,
" The request signature we calculated does not match the signature you provided. Check your AWS Secret Access Key and signing method. Consult the service documentation for details. " )
class InvalidClientTokenIdError ( RESTError ) :
2019-07-24 15:21:33 +00:00
code = 403
2019-07-02 15:40:08 +00:00
def __init__ ( self ) :
super ( InvalidClientTokenIdError , self ) . __init__ (
' InvalidClientTokenId ' ,
" The security token included in the request is invalid. " )
class AccessDeniedError ( RESTError ) :
code = 403
2019-07-08 17:57:14 +00:00
def __init__ ( self , user_arn , action ) :
2019-07-02 15:40:08 +00:00
super ( AccessDeniedError , self ) . __init__ (
' AccessDenied ' ,
2019-07-08 17:57:14 +00:00
" User: {user_arn} is not authorized to perform: {operation} " . format (
user_arn = user_arn ,
2019-07-02 15:40:08 +00:00
operation = action
) )
2019-07-08 17:57:14 +00:00
class AuthFailureError ( RESTError ) :
2019-07-24 15:21:33 +00:00
code = 401
2019-07-08 17:57:14 +00:00
def __init__ ( self ) :
super ( AuthFailureError , self ) . __init__ (
' AuthFailure ' ,
" AWS was not able to validate the provided access credentials " )