summaryrefslogtreecommitdiffstats
path: root/nfvparser/toscaparser/common/exception.py
diff options
context:
space:
mode:
Diffstat (limited to 'nfvparser/toscaparser/common/exception.py')
-rw-r--r--nfvparser/toscaparser/common/exception.py246
1 files changed, 246 insertions, 0 deletions
diff --git a/nfvparser/toscaparser/common/exception.py b/nfvparser/toscaparser/common/exception.py
new file mode 100644
index 0000000..13ccabd
--- /dev/null
+++ b/nfvparser/toscaparser/common/exception.py
@@ -0,0 +1,246 @@
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+'''
+TOSCA exception classes
+'''
+import logging
+import sys
+import traceback
+
+from toscaparser.utils.gettextutils import _
+
+
+log = logging.getLogger(__name__)
+
+
+class TOSCAException(Exception):
+ '''Base exception class for TOSCA
+
+ To correctly use this class, inherit from it and define
+ a 'msg_fmt' property.
+
+ '''
+
+ _FATAL_EXCEPTION_FORMAT_ERRORS = False
+
+ message = _('An unknown exception occurred.')
+
+ def __init__(self, **kwargs):
+ try:
+ self.message = self.msg_fmt % kwargs
+ except KeyError:
+ exc_info = sys.exc_info()
+ log.exception(_('Exception in string format operation: %s')
+ % exc_info[1])
+
+ if TOSCAException._FATAL_EXCEPTION_FORMAT_ERRORS:
+ raise exc_info[0]
+
+ def __str__(self):
+ return self.message
+
+ @staticmethod
+ def generate_inv_schema_property_error(self, attr, value, valid_values):
+ msg = (_('Schema definition of "%(propname)s" has '
+ '"%(attr)s" attribute with invalid value '
+ '"%(value1)s". The value must be one of '
+ '"%(value2)s".') % {"propname": self.name,
+ "attr": attr,
+ "value1": value,
+ "value2": valid_values})
+ ExceptionCollector.appendException(
+ InvalidSchemaError(message=msg))
+
+ @staticmethod
+ def set_fatal_format_exception(flag):
+ if isinstance(flag, bool):
+ TOSCAException._FATAL_EXCEPTION_FORMAT_ERRORS = flag
+
+
+class UnsupportedTypeError(TOSCAException):
+ msg_fmt = _('Type "%(what)s" is valid TOSCA type'
+ ' but not supported at this time.')
+
+
+class MissingRequiredFieldError(TOSCAException):
+ msg_fmt = _('%(what)s is missing required field "%(required)s".')
+
+
+class UnknownFieldError(TOSCAException):
+ msg_fmt = _('%(what)s contains unknown field "%(field)s". Refer to the '
+ 'definition to verify valid values.')
+
+
+class TypeMismatchError(TOSCAException):
+ msg_fmt = _('%(what)s must be of type "%(type)s".')
+
+
+class InvalidNodeTypeError(TOSCAException):
+ msg_fmt = _('Node type "%(what)s" is not a valid type.')
+
+
+class InvalidTypeError(TOSCAException):
+ msg_fmt = _('Type "%(what)s" is not a valid type.')
+
+
+class InvalidTypeAdditionalRequirementsError(TOSCAException):
+ msg_fmt = _('Additional requirements for type "%(type)s" not met.')
+
+
+class RangeValueError(TOSCAException):
+ msg_fmt = _('The value "%(pvalue)s" of property "%(pname)s" is out of '
+ 'range "(min:%(vmin)s, max:%(vmax)s)".')
+
+
+class InvalidSchemaError(TOSCAException):
+ msg_fmt = _('%(message)s')
+
+
+class ValidationError(TOSCAException):
+ msg_fmt = _('%(message)s')
+
+
+class UnknownInputError(TOSCAException):
+ msg_fmt = _('Unknown input "%(input_name)s".')
+
+
+class UnknownOutputError(TOSCAException):
+ msg_fmt = _('Unknown output "%(output_name)s" in %(where)s.')
+
+
+class MissingRequiredInputError(TOSCAException):
+ msg_fmt = _('%(what)s is missing required input definition '
+ 'of input "%(input_name)s".')
+
+
+class MissingRequiredParameterError(TOSCAException):
+ msg_fmt = _('%(what)s is missing required parameter for input '
+ '"%(input_name)s".')
+
+
+class MissingDefaultValueError(TOSCAException):
+ msg_fmt = _('%(what)s is missing required default value '
+ 'of input "%(input_name)s".')
+
+
+class MissingRequiredOutputError(TOSCAException):
+ msg_fmt = _('%(what)s is missing required output definition '
+ 'of output "%(output_name)s".')
+
+
+class InvalidPropertyValueError(TOSCAException):
+ msg_fmt = _('Value of property "%(what)s" is invalid.')
+
+
+class InvalidTemplateVersion(TOSCAException):
+ msg_fmt = _('The template version "%(what)s" is invalid. '
+ 'Valid versions are "%(valid_versions)s".')
+
+
+class InvalidTOSCAVersionPropertyException(TOSCAException):
+ msg_fmt = _('Value of TOSCA version property "%(what)s" is invalid.')
+
+
+class URLException(TOSCAException):
+ msg_fmt = _('%(what)s')
+
+
+class ToscaExtImportError(TOSCAException):
+ msg_fmt = _('Unable to import extension "%(ext_name)s". '
+ 'Check to see that it exists and has no '
+ 'language definition errors.')
+
+
+class ToscaExtAttributeError(TOSCAException):
+ msg_fmt = _('Missing attribute in extension "%(ext_name)s". '
+ 'Check to see that it has required attributes '
+ '"%(attrs)s" defined.')
+
+
+class InvalidGroupTargetException(TOSCAException):
+ msg_fmt = _('"%(message)s"')
+
+
+class ExceptionCollector(object):
+
+ exceptions = []
+ collecting = False
+
+ @staticmethod
+ def clear():
+ del ExceptionCollector.exceptions[:]
+
+ @staticmethod
+ def start():
+ ExceptionCollector.clear()
+ ExceptionCollector.collecting = True
+
+ @staticmethod
+ def stop():
+ ExceptionCollector.collecting = False
+
+ @staticmethod
+ def contains(exception):
+ for ex in ExceptionCollector.exceptions:
+ if str(ex) == str(exception):
+ return True
+ return False
+
+ @staticmethod
+ def appendException(exception):
+ if ExceptionCollector.collecting:
+ if not ExceptionCollector.contains(exception):
+ exception.trace = traceback.extract_stack()[:-1]
+ ExceptionCollector.exceptions.append(exception)
+ else:
+ raise exception
+
+ @staticmethod
+ def exceptionsCaught():
+ return len(ExceptionCollector.exceptions) > 0
+
+ @staticmethod
+ def getTraceString(traceList):
+ traceString = ''
+ for entry in traceList:
+ f, l, m, c = entry[0], entry[1], entry[2], entry[3]
+ traceString += (_('\t\tFile %(file)s, line %(line)s, in '
+ '%(method)s\n\t\t\t%(call)s\n')
+ % {'file': f, 'line': l, 'method': m, 'call': c})
+ return traceString
+
+ @staticmethod
+ def getExceptionReportEntry(exception, full=True):
+ entry = exception.__class__.__name__ + ': ' + str(exception)
+ if full:
+ entry += '\n' + ExceptionCollector.getTraceString(exception.trace)
+ return entry
+
+ @staticmethod
+ def getExceptions():
+ return ExceptionCollector.exceptions
+
+ @staticmethod
+ def getExceptionsReport(full=True):
+ report = []
+ for exception in ExceptionCollector.exceptions:
+ report.append(
+ ExceptionCollector.getExceptionReportEntry(exception, full))
+ return report
+
+ @staticmethod
+ def assertExceptionMessage(exception, message):
+ err_msg = exception.__name__ + ': ' + message
+ report = ExceptionCollector.getExceptionsReport(False)
+ assert err_msg in report, (_('Could not find "%(msg)s" in "%(rep)s".')
+ % {'rep': report.__str__(), 'msg': err_msg})