1 # Licensed under the Apache License, Version 2.0 (the "License"); you may
2 # not use this file except in compliance with the License. You may obtain
3 # a copy of the License at
5 # http://www.apache.org/licenses/LICENSE-2.0
7 # Unless required by applicable law or agreed to in writing, software
8 # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
9 # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
10 # License for the specific language governing permissions and limitations
14 TOSCA exception classes
20 from toscaparser.utils.gettextutils import _
23 log = logging.getLogger(__name__)
26 class TOSCAException(Exception):
27 '''Base exception class for TOSCA
29 To correctly use this class, inherit from it and define
34 _FATAL_EXCEPTION_FORMAT_ERRORS = False
36 message = _('An unknown exception occurred.')
38 def __init__(self, **kwargs):
40 self.message = self.msg_fmt % kwargs
42 exc_info = sys.exc_info()
43 log.exception(_('Exception in string format operation: %s')
46 if TOSCAException._FATAL_EXCEPTION_FORMAT_ERRORS:
53 def generate_inv_schema_property_error(self, attr, value, valid_values):
54 msg = (_('Schema definition of "%(propname)s" has '
55 '"%(attr)s" attribute with invalid value '
56 '"%(value1)s". The value must be one of '
57 '"%(value2)s".') % {"propname": self.name,
60 "value2": valid_values})
61 ExceptionCollector.appendException(
62 InvalidSchemaError(message=msg))
65 def set_fatal_format_exception(flag):
66 if isinstance(flag, bool):
67 TOSCAException._FATAL_EXCEPTION_FORMAT_ERRORS = flag
70 class MissingRequiredFieldError(TOSCAException):
71 msg_fmt = _('%(what)s is missing required field "%(required)s".')
74 class UnknownFieldError(TOSCAException):
75 msg_fmt = _('%(what)s contains unknown field "%(field)s". Refer to the '
76 'definition to verify valid values.')
79 class TypeMismatchError(TOSCAException):
80 msg_fmt = _('%(what)s must be of type "%(type)s".')
83 class InvalidNodeTypeError(TOSCAException):
84 msg_fmt = _('Node type "%(what)s" is not a valid type.')
87 class InvalidTypeError(TOSCAException):
88 msg_fmt = _('Type "%(what)s" is not a valid type.')
91 class InvalidSchemaError(TOSCAException):
92 msg_fmt = _('%(message)s')
95 class ValidationError(TOSCAException):
96 msg_fmt = _('%(message)s')
99 class UnknownInputError(TOSCAException):
100 msg_fmt = _('Unknown input "%(input_name)s".')
103 class InvalidPropertyValueError(TOSCAException):
104 msg_fmt = _('Value of property "%(what)s" is invalid.')
107 class InvalidTemplateVersion(TOSCAException):
108 msg_fmt = _('The template version "%(what)s" is invalid. '
109 'Valid versions are "%(valid_versions)s".')
112 class InvalidTOSCAVersionPropertyException(TOSCAException):
113 msg_fmt = _('Value of TOSCA version property "%(what)s" is invalid.')
116 class URLException(TOSCAException):
117 msg_fmt = _('%(what)s')
120 class ToscaExtImportError(TOSCAException):
121 msg_fmt = _('Unable to import extension "%(ext_name)s". '
122 'Check to see that it exists and has no '
123 'language definition errors.')
126 class ToscaExtAttributeError(TOSCAException):
127 msg_fmt = _('Missing attribute in extension "%(ext_name)s". '
128 'Check to see that it has required attributes '
129 '"%(attrs)s" defined.')
132 class InvalidGroupTargetException(TOSCAException):
133 msg_fmt = _('"%(message)s"')
136 class ExceptionCollector(object):
143 del ExceptionCollector.exceptions[:]
147 ExceptionCollector.clear()
148 ExceptionCollector.collecting = True
152 ExceptionCollector.collecting = False
155 def contains(exception):
156 for ex in ExceptionCollector.exceptions:
157 if str(ex) == str(exception):
162 def appendException(exception):
163 if ExceptionCollector.collecting:
164 if not ExceptionCollector.contains(exception):
165 exception.trace = traceback.extract_stack()[:-1]
166 ExceptionCollector.exceptions.append(exception)
171 def exceptionsCaught():
172 return len(ExceptionCollector.exceptions) > 0
175 def getTraceString(traceList):
177 for entry in traceList:
178 f, l, m, c = entry[0], entry[1], entry[2], entry[3]
179 traceString += (_('\t\tFile %(file)s, line %(line)s, in '
180 '%(method)s\n\t\t\t%(call)s\n')
181 % {'file': f, 'line': l, 'method': m, 'call': c})
185 def getExceptionReportEntry(exception, full=True):
186 entry = exception.__class__.__name__ + ': ' + str(exception)
188 entry += '\n' + ExceptionCollector.getTraceString(exception.trace)
193 return ExceptionCollector.exceptions
196 def getExceptionsReport(full=True):
198 for exception in ExceptionCollector.exceptions:
200 ExceptionCollector.getExceptionReportEntry(exception, full))
204 def assertExceptionMessage(exception, message):
205 err_msg = exception.__name__ + ': ' + message
206 report = ExceptionCollector.getExceptionsReport(False)
207 assert err_msg in report, (_('Could not find "%(msg)s" in "%(rep)s".')
208 % {'rep': report.__str__(), 'msg': err_msg})