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 UnsupportedTypeError(TOSCAException):
71 msg_fmt = _('Type "%(what)s" is valid TOSCA type'
72 ' but not supported at this time.')
75 class MissingRequiredFieldError(TOSCAException):
76 msg_fmt = _('%(what)s is missing required field "%(required)s".')
79 class UnknownFieldError(TOSCAException):
80 msg_fmt = _('%(what)s contains unknown field "%(field)s". Refer to the '
81 'definition to verify valid values.')
84 class TypeMismatchError(TOSCAException):
85 msg_fmt = _('%(what)s must be of type "%(type)s".')
88 class InvalidNodeTypeError(TOSCAException):
89 msg_fmt = _('Node type "%(what)s" is not a valid type.')
92 class InvalidTypeError(TOSCAException):
93 msg_fmt = _('Type "%(what)s" is not a valid type.')
96 class InvalidTypeAdditionalRequirementsError(TOSCAException):
97 msg_fmt = _('Additional requirements for type "%(type)s" not met.')
100 class RangeValueError(TOSCAException):
101 msg_fmt = _('The value "%(pvalue)s" of property "%(pname)s" is out of '
102 'range "(min:%(vmin)s, max:%(vmax)s)".')
105 class InvalidSchemaError(TOSCAException):
106 msg_fmt = _('%(message)s')
109 class ValidationError(TOSCAException):
110 msg_fmt = _('%(message)s')
113 class UnknownInputError(TOSCAException):
114 msg_fmt = _('Unknown input "%(input_name)s".')
117 class MissingRequiredInputError(TOSCAException):
118 msg_fmt = _('%(what)s is missing required input definition '
119 'of input "%(input_name)s".')
122 class MissingRequiredParameterError(TOSCAException):
123 msg_fmt = _('%(what)s is missing required parameter for input '
127 class MissingDefaultValueError(TOSCAException):
128 msg_fmt = _('%(what)s is missing required default value '
129 'of input "%(input_name)s".')
132 class InvalidPropertyValueError(TOSCAException):
133 msg_fmt = _('Value of property "%(what)s" is invalid.')
136 class InvalidTemplateVersion(TOSCAException):
137 msg_fmt = _('The template version "%(what)s" is invalid. '
138 'Valid versions are "%(valid_versions)s".')
141 class InvalidTOSCAVersionPropertyException(TOSCAException):
142 msg_fmt = _('Value of TOSCA version property "%(what)s" is invalid.')
145 class URLException(TOSCAException):
146 msg_fmt = _('%(what)s')
149 class ToscaExtImportError(TOSCAException):
150 msg_fmt = _('Unable to import extension "%(ext_name)s". '
151 'Check to see that it exists and has no '
152 'language definition errors.')
155 class ToscaExtAttributeError(TOSCAException):
156 msg_fmt = _('Missing attribute in extension "%(ext_name)s". '
157 'Check to see that it has required attributes '
158 '"%(attrs)s" defined.')
161 class InvalidGroupTargetException(TOSCAException):
162 msg_fmt = _('"%(message)s"')
165 class ExceptionCollector(object):
172 del ExceptionCollector.exceptions[:]
176 ExceptionCollector.clear()
177 ExceptionCollector.collecting = True
181 ExceptionCollector.collecting = False
184 def contains(exception):
185 for ex in ExceptionCollector.exceptions:
186 if str(ex) == str(exception):
191 def appendException(exception):
192 if ExceptionCollector.collecting:
193 if not ExceptionCollector.contains(exception):
194 exception.trace = traceback.extract_stack()[:-1]
195 ExceptionCollector.exceptions.append(exception)
200 def exceptionsCaught():
201 return len(ExceptionCollector.exceptions) > 0
204 def getTraceString(traceList):
206 for entry in traceList:
207 f, l, m, c = entry[0], entry[1], entry[2], entry[3]
208 traceString += (_('\t\tFile %(file)s, line %(line)s, in '
209 '%(method)s\n\t\t\t%(call)s\n')
210 % {'file': f, 'line': l, 'method': m, 'call': c})
214 def getExceptionReportEntry(exception, full=True):
215 entry = exception.__class__.__name__ + ': ' + str(exception)
217 entry += '\n' + ExceptionCollector.getTraceString(exception.trace)
222 return ExceptionCollector.exceptions
225 def getExceptionsReport(full=True):
227 for exception in ExceptionCollector.exceptions:
229 ExceptionCollector.getExceptionReportEntry(exception, full))
233 def assertExceptionMessage(exception, message):
234 err_msg = exception.__name__ + ': ' + message
235 report = ExceptionCollector.getExceptionsReport(False)
236 assert err_msg in report, (_('Could not find "%(msg)s" in "%(rep)s".')
237 % {'rep': report.__str__(), 'msg': err_msg})