Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (3.2 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=500):
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 NotAllowed(Fault):
75
    code = 405
76

    
77
    def __init__(self, message='', details='', name='', code=500,
78
                 allowed_methods=None):
79
        """
80
        :param allowed_methods: (list) the valid methods
81
        """
82
        super(NotAllowed, self).__init__(message, details, name, code)
83
        self.allowed_methods = allowed_methods or []
84

    
85

    
86
class ItemNotFound(Fault):
87
    code = 404
88

    
89

    
90
class Conflict(Fault):
91
    code = 409
92

    
93

    
94
class BuildInProgress(Conflict):
95
    pass
96

    
97

    
98
class LengthRequired(Fault):
99
    code = 411
100

    
101

    
102
class PreconditionFailed(Fault):
103
    code = 412
104

    
105

    
106
class RequestEntityTooLarge(Fault):
107
    code = 413
108

    
109

    
110
class OverLimit(RequestEntityTooLarge):
111
    pass
112

    
113

    
114
class BadMediaType(Fault):
115
    code = 415
116

    
117

    
118
class RangeNotSatisfiable(Fault):
119
    code = 416
120

    
121

    
122
class NetworkInUse(Fault):
123
    code = 421
124

    
125

    
126
class UnprocessableEntity(Fault):
127
    code = 422
128

    
129

    
130
# 5xx
131
class InternalServerError(Fault):
132
    code = 500
133

    
134

    
135
class NotImplemented(Fault):
136
    code = 501
137

    
138

    
139
class ServiceUnavailable(Fault):
140
    code = 503