return _get_intent(data) == Intent.PRESENT
+class InvalidResourceError(ValueError):
+ def __init__(self, msg: str, data: Simplified) -> None:
+ super().__init__(msg)
+ self.resource_data = data
+
+ @classmethod
+ def wrap(cls, err: Exception, data: Simplified) -> Exception:
+ if isinstance(err, ValueError) and not isinstance(
+ err, resourcelib.ResourceTypeError
+ ):
+ return cls(str(err), data)
+ return err
+
+
class _RBase:
# mypy doesn't currently (well?) support class decorators adding methods
# so we use a base class to add this method to all our resource classes.
@resourcelib.customize
def _customize_resource(rc: resourcelib.Resource) -> resourcelib.Resource:
rc.on_condition(_removed)
+ rc.on_construction_error(InvalidResourceError.wrap)
return rc
@resourcelib.customize
def _customize_resource(rc: resourcelib.Resource) -> resourcelib.Resource:
rc.on_condition(_present)
+ rc.on_construction_error(InvalidResourceError.wrap)
return rc
@resourcelib.customize
def _customize_resource(rc: resourcelib.Resource) -> resourcelib.Resource:
rc.on_condition(_removed)
+ rc.on_construction_error(InvalidResourceError.wrap)
return rc
def validate(self) -> None:
@resourcelib.customize
def _customize_resource(rc: resourcelib.Resource) -> resourcelib.Resource:
rc.on_condition(_present)
+ rc.on_construction_error(InvalidResourceError.wrap)
return rc
@resourcelib.customize
def _customize_resource(rc: resourcelib.Resource) -> resourcelib.Resource:
rc.linked_to_cluster.quiet = True
+ rc.on_construction_error(InvalidResourceError.wrap)
return rc
@resourcelib.customize
def _customize_resource(rc: resourcelib.Resource) -> resourcelib.Resource:
rc.linked_to_cluster.quiet = True
+ rc.on_construction_error(InvalidResourceError.wrap)
return rc