dcbf5e1899
In theory using destruction dependencies one can obtain a new reference to an object that is about to be destroyed. In this case any attempt to call a method on such object should result in exception being raised. This guarantees that the nothing can be done on the object after its .destroy method was executed. Also because the HeatStack instance is owned by the CloudRegion it is going to be destroyed prior to it. But CloudRegion needs to call $stack.delete() in its .destroy method and this will cause error. As a solution HeatStack made not to be owned by the region and instead be an independent object with destruction dependency on it which guarantees that it will be destroyed after the CloudRegion. Targets-blueprint: dependency-driven-resource-deallocation Change-Id: I5650ea672d5f121be69669f27dd5f513fbdd5c44
183 lines
4.9 KiB
Python
183 lines
4.9 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.
|
|
|
|
|
|
class InternalFlowException(Exception):
|
|
pass
|
|
|
|
|
|
class ReturnException(InternalFlowException):
|
|
def __init__(self, value):
|
|
self._value = value
|
|
|
|
@property
|
|
def value(self):
|
|
return self._value
|
|
|
|
|
|
class BreakException(InternalFlowException):
|
|
pass
|
|
|
|
|
|
class ContinueException(InternalFlowException):
|
|
pass
|
|
|
|
|
|
class DslInvalidOperationError(Exception):
|
|
pass
|
|
|
|
|
|
class NoMethodFound(Exception):
|
|
def __init__(self, name):
|
|
super(NoMethodFound, self).__init__('Method "%s" is not found' % name)
|
|
|
|
|
|
class NoPropertyFound(Exception):
|
|
def __init__(self, name):
|
|
super(NoPropertyFound, self).__init__(
|
|
'Property "%s" is not found' % name)
|
|
|
|
|
|
class NoClassFound(Exception):
|
|
def __init__(self, name, packages=None):
|
|
if packages is None:
|
|
packages = []
|
|
packages = ', '.join("{0}/{1}".format(p.name, p.version)
|
|
for p in packages)
|
|
super(NoClassFound, self).__init__(
|
|
'Class "{0}" is not found in {1}'.format(name, packages))
|
|
|
|
|
|
class NoPackageFound(Exception):
|
|
def __init__(self, name):
|
|
super(NoPackageFound, self).__init__(
|
|
'Package "%s" is not found' % name)
|
|
|
|
|
|
class NoPackageForClassFound(Exception):
|
|
def __init__(self, name):
|
|
super(NoPackageForClassFound, self).__init__('Package for class "%s" '
|
|
'is not found' % name)
|
|
|
|
|
|
class NoObjectFoundError(Exception):
|
|
def __init__(self, object_id):
|
|
super(NoObjectFoundError, self).__init__(
|
|
'Object "%s" is not found in object store' % object_id)
|
|
|
|
|
|
class MethodNotExposed(Exception):
|
|
pass
|
|
|
|
|
|
class AmbiguousMethodName(Exception):
|
|
def __init__(self, name):
|
|
super(AmbiguousMethodName, self).__init__(
|
|
'Found more that one method "%s"' % name)
|
|
|
|
|
|
class AmbiguousClassName(Exception):
|
|
def __init__(self, name):
|
|
super(AmbiguousClassName, self).__init__(
|
|
'Found more that one version of class "%s"' % name)
|
|
|
|
|
|
class DslContractSyntaxError(Exception):
|
|
pass
|
|
|
|
|
|
class ContractViolationException(Exception):
|
|
def __init__(self, *args, **kwargs):
|
|
super(ContractViolationException, self).__init__(*args, **kwargs)
|
|
self._path = ''
|
|
|
|
@property
|
|
def path(self):
|
|
return self._path
|
|
|
|
@path.setter
|
|
def path(self, value):
|
|
self._path = value
|
|
|
|
|
|
class ValueIsMissingError(Exception):
|
|
pass
|
|
|
|
|
|
class DslSyntaxError(Exception):
|
|
pass
|
|
|
|
|
|
class PropertyAccessError(Exception):
|
|
pass
|
|
|
|
|
|
class AmbiguousPropertyNameError(PropertyAccessError):
|
|
def __init__(self, name):
|
|
super(AmbiguousPropertyNameError, self).__init__(
|
|
'Found more that one property "%s"' % name)
|
|
|
|
|
|
class NoWriteAccess(PropertyAccessError):
|
|
def __init__(self, name):
|
|
super(NoWriteAccess, self).__init__(
|
|
'Property "%s" is immutable to the caller' % name)
|
|
|
|
|
|
class NoWriteAccessError(PropertyAccessError):
|
|
def __init__(self, name):
|
|
super(NoWriteAccessError, self).__init__(
|
|
'Property "%s" is immutable to the caller' % name)
|
|
|
|
|
|
class PropertyReadError(PropertyAccessError):
|
|
def __init__(self, name, murano_class):
|
|
super(PropertyAccessError, self).__init__(
|
|
'Property "%s" in class "%s" cannot be read' %
|
|
(name, murano_class.name))
|
|
|
|
|
|
class PropertyWriteError(PropertyAccessError):
|
|
def __init__(self, name, murano_class):
|
|
super(PropertyAccessError, self).__init__(
|
|
'Property "%s" in class "%s" cannot be written' %
|
|
(name, murano_class.name))
|
|
|
|
|
|
class UninitializedPropertyAccessError(PropertyAccessError):
|
|
def __init__(self, name, murano_class):
|
|
super(PropertyAccessError, self).__init__(
|
|
'Access to uninitialized property '
|
|
'"%s" in class "%s" is forbidden' % (name, murano_class.name))
|
|
|
|
|
|
class CircularExpressionDependenciesError(Exception):
|
|
pass
|
|
|
|
|
|
class InvalidLhsTargetError(Exception):
|
|
def __init__(self, target):
|
|
super(InvalidLhsTargetError, self).__init__(
|
|
'Invalid assignment target "%s"' % target)
|
|
|
|
|
|
class InvalidInheritanceError(Exception):
|
|
pass
|
|
|
|
|
|
class ObjectDestroyedError(Exception):
|
|
def __init__(self, obj):
|
|
super(ObjectDestroyedError, self).__init__(
|
|
'Object {0} is already destroyed'.format(obj))
|