murano/murano/dsl/dsl_exception.py

84 lines
2.6 KiB
Python

# Copyright (c) 2014 Mirantis, Inc.
#
# 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.
import sys
from murano.dsl.principal_objects import stack_trace
class MuranoPlException(Exception):
def __init__(self, names, message, stacktrace, extra=None, cause=None):
super(MuranoPlException, self).__init__(
u'[{0}]: {1}'.format(', '.join(names), message))
if not isinstance(names, list):
names = [names]
self._names = names
self._message = message
self._stacktrace = stacktrace
self._extra = extra or {}
self._cause = cause
@property
def names(self):
return self._names
@property
def message(self):
return self._message
@property
def stacktrace(self):
return self._stacktrace
@property
def extra(self):
return self._extra
@property
def cause(self):
return self._cause
@staticmethod
def from_python_exception(exception, context):
stacktrace = stack_trace.create_stack_trace(context)
exception_type = type(exception)
names = ['{0}.{1}'.format(exception_type.__module__,
exception_type.__name__)]
result = MuranoPlException(
names, str(exception), stacktrace)
_, _, exc_traceback = sys.exc_info()
result.original_exception = exception
result.original_traceback = exc_traceback
return result
def _format_name(self):
if not self._names:
return ''
elif len(self._names) == 1:
return self._names[0]
else:
return self._names
def format(self, prefix=''):
text = ('{3}{0}: {1}\n'
'{3}Traceback (most recent call last):\n'
'{2}').format(
self._format_name(), self.message,
self.stacktrace().toString(prefix + ' '), prefix)
if self._cause is not None:
text += '\n\n{0} Caused by {1}'.format(
prefix, self._cause.format(prefix + ' ').lstrip())
return text