Statistics
| Branch: | Tag: | Revision:

root / snf-django-lib / snf_django / lib / api / faults.py @ fde7b7cb

History | View | Annotate | Download (2.8 kB)

1
# Copyright 2012, 2013 GRNET S.A. All rights reserved.
2
#
3
# Redistribution and use in source and binary forms, with or
4
# without modification, are permitted provided that the following
5
# conditions are met:
6
#
7
#   1. Redistributions of source code must retain the above
8
#      copyright notice, this list of conditions and the following
9
#      disclaimer.
10
#
11
#   2. Redistributions in binary form must reproduce the above
12
#      copyright notice, this list of conditions and the following
13
#      disclaimer in the documentation and/or other materials
14
#      provided with the distribution.
15
#
16
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27
# POSSIBILITY OF SUCH DAMAGE.
28
#
29
# The views and conclusions contained in the software and
30
# documentation are those of the authors and should not be
31
# interpreted as representing official policies, either expressed
32
# or implied, of GRNET S.A.
33

    
34

    
35
"""Common API faults."""
36

    
37

    
38
def camel_case(s):
39
    return s[0].lower() + s[1:]
40

    
41

    
42
class Fault(Exception):
43
    def __init__(self, message='', details='', name='', code=None):
44
        self.message = message
45
        self.details = details
46
        if not hasattr(self, 'code'):
47
            self.code = code
48
        self.name = name or camel_case(self.__class__.__name__)
49
        Exception.__init__(self, message, details, self.name, self.code)
50

    
51

    
52
# 2xx
53
class NotModified(Fault):
54
    code = 304
55

    
56

    
57
# 4xx
58
class BadRequest(Fault):
59
    code = 400
60

    
61

    
62
class Unauthorized(Fault):
63
    code = 401
64

    
65

    
66
class Forbidden(Fault):
67
    code = 403
68

    
69

    
70
class ResizeNotAllowed(Forbidden):
71
    pass
72

    
73

    
74
class ItemNotFound(Fault):
75
    code = 404
76

    
77

    
78
class Conflict(Fault):
79
    code = 409
80

    
81

    
82
class BuildInProgress(Conflict):
83
    pass
84

    
85

    
86
class LengthRequired(Fault):
87
    code = 411
88

    
89

    
90
class PreconditionFailed(Fault):
91
    code = 412
92

    
93

    
94
class RequestEntityTooLarge(Fault):
95
    code = 413
96

    
97

    
98
class OverLimit(RequestEntityTooLarge):
99
    pass
100

    
101

    
102
class BadMediaType(Fault):
103
    code = 415
104

    
105

    
106
class RangeNotSatisfiable(Fault):
107
    code = 416
108

    
109

    
110
class NetworkInUse(Fault):
111
    code = 421
112

    
113

    
114
class UnprocessableEntity(Fault):
115
    code = 422
116

    
117

    
118
# 5xx
119
class InternalServerError(Fault):
120
    code = 500
121

    
122

    
123
class NotImplemented(Fault):
124
    code = 501
125

    
126

    
127
class ServiceUnavailable(Fault):
128
    code = 503