summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPavel Zuna <pzuna@redhat.com>2010-05-10 14:26:51 +0200
committerRob Crittenden <rcritten@redhat.com>2010-05-14 11:06:59 -0400
commit7993719329c675d8227bc612a2f8f0db5523c073 (patch)
tree3d74acca3fae48c8d0344c1f698f0f6f6c993610
parent792f58fae3c65b2ec8375cca0878222560821f64 (diff)
downloadfreeipa-7993719329c675d8227bc612a2f8f0db5523c073.tar.gz
freeipa-7993719329c675d8227bc612a2f8f0db5523c073.tar.xz
freeipa-7993719329c675d8227bc612a2f8f0db5523c073.zip
Add exception callback (exc_callback) to baseldap.py classes.
It enables plugin authors to supply their own handlers for ExecutionError exceptions generated by calls to ldap2 made from the execute method of baseldap.py classes that extend CallbackInterface.
-rw-r--r--ipalib/plugins/baseldap.py183
1 files changed, 150 insertions, 33 deletions
diff --git a/ipalib/plugins/baseldap.py b/ipalib/plugins/baseldap.py
index e4841376..ffd60e7e 100644
--- a/ipalib/plugins/baseldap.py
+++ b/ipalib/plugins/baseldap.py
@@ -144,10 +144,14 @@ class CallbackInterface(Method):
self.__class__.PRE_CALLBACKS = []
if not hasattr(self.__class__, 'POST_CALLBACKS'):
self.__class__.POST_CALLBACKS = []
+ if not hasattr(self.__class__, 'EXC_CALLBACKS'):
+ self.__class__.EXC_CALLBACKS = []
if hasattr(self, 'pre_callback'):
self.register_pre_callback(self.pre_callback, True)
if hasattr(self, 'post_callback'):
self.register_post_callback(self.post_callback, True)
+ if hasattr(self, 'exc_callback'):
+ self.register_exc_callback(self.exc_callback, True)
super(Method, self).__init__()
@classmethod
@@ -170,6 +174,37 @@ class CallbackInterface(Method):
else:
klass.POST_CALLBACKS.append(callback)
+ @classmethod
+ def register_exc_callback(klass, callback, first=False):
+ assert callable(callback)
+ if not hasattr(klass, 'EXC_CALLBACKS'):
+ klass.EXC_CALLBACKS = []
+ if first:
+ klass.EXC_CALLBACKS.insert(0, callback)
+ else:
+ klass.EXC_CALLBACKS.append(callback)
+
+ def _call_exc_callbacks(self, args, options, exc, call_func, *call_args, **call_kwargs):
+ rv = None
+ for i in xrange(len(getattr(self, 'EXC_CALLBACKS', []))):
+ callback = self.EXC_CALLBACKS[i]
+ try:
+ if hasattr(callback, 'im_self'):
+ rv = callback(
+ args, options, exc, call_func, *call_args, **call_kwargs
+ )
+ else:
+ rv = callback(
+ self, args, options, exc, call_func, *call_args,
+ **call_kwargs
+ )
+ except errors.ExecutionError, e:
+ if (i + 1) < len(self.EXC_CALLBACKS):
+ exc = e
+ continue
+ raise e
+ return rv
+
class LDAPCreate(CallbackInterface, crud.Create):
"""
@@ -219,27 +254,39 @@ class LDAPCreate(CallbackInterface, crud.Create):
try:
ldap.add_entry(dn, entry_attrs, normalize=self.obj.normalize_dn)
- except errors.NotFound:
- parent = self.obj.parent_object
- if parent:
+ except errors.ExecutionError, e:
+ try:
+ self._call_exc_callbacks(
+ keys, options, e, ldap.add_entry, dn, entry_attrs,
+ normalize=self.obj.normalize_dn
+ )
+ except errors.NotFound:
+ parent = self.obj.parent_object
+ if parent:
+ raise errors.NotFound(
+ reason=self.obj.parent_not_found_msg % {
+ 'parent': keys[-2],
+ 'oname': self.api.Object[parent].object_name,
+ }
+ )
raise errors.NotFound(
- reason=self.obj.parent_not_found_msg % {
- 'parent': keys[-2],
- 'oname': self.api.Object[parent].object_name,
+ reason=self.obj.container_not_found_msg % {
+ 'container': self.obj.container_dn,
}
)
- raise errors.NotFound(
- reason=self.obj.container_not_found_msg % {
- 'container': self.obj.container_dn,
- }
- )
try:
(dn, entry_attrs) = ldap.get_entry(
dn, attrs_list, normalize=self.obj.normalize_dn
)
- except errors.NotFound:
- self.obj.handle_not_found(*keys)
+ except errors.ExecutionError, e:
+ try:
+ (dn, entry_attrs) = self._call_exc_callbacks(
+ keys, options, e, ldap.get_entry, dn, attrs_list,
+ normalize=self.obj.normalize_dn
+ )
+ except errors.NotFound:
+ self.obj.handle_not_found(*keys)
for callback in self.POST_CALLBACKS:
if hasattr(callback, 'im_self'):
@@ -260,6 +307,9 @@ class LDAPCreate(CallbackInterface, crud.Create):
def post_callback(self, ldap, dn, entry_attrs, *keys, **options):
return dn
+ def exc_callback(self, keys, options, exc, call_func, *call_args, **call_kwargs):
+ raise exc
+
class LDAPQuery(CallbackInterface, crud.PKQuery):
"""
@@ -298,8 +348,14 @@ class LDAPRetrieve(LDAPQuery):
(dn, entry_attrs) = ldap.get_entry(
dn, attrs_list, normalize=self.obj.normalize_dn
)
- except errors.NotFound:
- self.obj.handle_not_found(*keys)
+ except errors.ExecutionError, e:
+ try:
+ (dn, entry_attrs) = self._call_exc_callbacks(
+ keys, options, e, ldap.get_entry, dn, attrs_list,
+ normalize=self.obj.normalize_dn
+ )
+ except errors.NotFound:
+ self.obj.handle_not_found(*keys)
for callback in self.POST_CALLBACKS:
if hasattr(callback, 'im_self'):
@@ -319,6 +375,9 @@ class LDAPRetrieve(LDAPQuery):
def post_callback(self, ldap, dn, entry_attrs, *keys, **options):
return dn
+ def exc_callback(self, keys, options, exc, call_func, *call_args, **call_kwargs):
+ raise exc
+
class LDAPUpdate(LDAPQuery, crud.Update):
"""
@@ -366,8 +425,14 @@ class LDAPUpdate(LDAPQuery, crud.Update):
(dn, old_entry) = ldap.get_entry(
dn, attrs_list, normalize=self.obj.normalize_dn
)
- except errors.NotFound:
- self.obj.handle_not_found(*keys)
+ except errors.ExecutionError, e:
+ try:
+ (dn, old_entry) = self._call_exc_callbacks(
+ keys, options, e, ldap.get_entry, dn, attrs_list,
+ normalize=self.obj.normalize_dn
+ )
+ except errors.NotFound:
+ self.obj.handle_not_found(*keys)
attrlist = get_attributes(options['addattr'])
for attr in attrlist:
if attr in old_entry:
@@ -379,17 +444,29 @@ class LDAPUpdate(LDAPQuery, crud.Update):
try:
ldap.update_entry(dn, entry_attrs, normalize=self.obj.normalize_dn)
- except errors.NotFound:
- self.obj.handle_not_found(*keys)
+ except errors.ExecutionError, e:
+ try:
+ self._call_exc_callbacks(
+ keys, options, e, ldap.update_entry, dn, entry_attrs,
+ normalize=self.obj.normalize_dn
+ )
+ except errors.NotFound:
+ self.obj.handle_not_found(*keys)
try:
(dn, entry_attrs) = ldap.get_entry(
dn, attrs_list, normalize=self.obj.normalize_dn
)
- except errors.NotFound:
- raise errors.MidairCollision(
- format=_('the entry was deleted while being modified')
- )
+ except errors.ExecutionError, e:
+ try:
+ (dn, entry_attrs) = self._call_exc_callbacks(
+ keys, options, e, ldap.get_entry, dn, attrs_list,
+ normalize=self.obj.normalize_dn
+ )
+ except errors.NotFound:
+ raise errors.MidairCollision(
+ format=_('the entry was deleted while being modified')
+ )
for callback in self.POST_CALLBACKS:
if hasattr(callback, 'im_self'):
@@ -408,6 +485,9 @@ class LDAPUpdate(LDAPQuery, crud.Update):
def post_callback(self, ldap, dn, entry_attrs, *keys, **options):
return dn
+ def exc_callback(self, keys, options, exc, call_func, *call_args, **call_kwargs):
+ raise exc
+
class LDAPDelete(LDAPQuery):
"""
@@ -440,8 +520,14 @@ class LDAPDelete(LDAPQuery):
delete_subtree(dn_)
try:
ldap.delete_entry(base_dn, normalize=self.obj.normalize_dn)
- except errors.NotFound:
- self.obj.handle_not_found(*keys)
+ except errors.ExecutionError, e:
+ try:
+ self._call_exc_callbacks(
+ keys, options, e, ldap.delete_entry, base_dn,
+ normalize=self.obj.normalize_dn
+ )
+ except errors.NotFound:
+ self.obj.handle_not_found(*keys)
delete_subtree(dn)
@@ -461,6 +547,9 @@ class LDAPDelete(LDAPQuery):
def post_callback(self, ldap, dn, *keys, **options):
return True
+ def exc_callback(self, keys, options, exc, call_func, *call_args, **call_kwargs):
+ raise exc
+
class LDAPModMember(LDAPQuery):
"""
@@ -561,16 +650,22 @@ class LDAPAddMember(LDAPModMember):
(dn, entry_attrs) = ldap.get_entry(
dn, attrs_list, normalize=self.obj.normalize_dn
)
- except errors.NotFound:
- self.obj.handle_not_found(*keys)
+ except errors.ExecutionError, e:
+ try:
+ (dn, entry_attrs) = self._call_exc_callbacks(
+ keys, options, e, ldap.get_entry, dn, attrs_list,
+ normalize=self.obj.normalize_dn
+ )
+ except errors.NotFound:
+ self.obj.handle_not_found(*keys)
for callback in self.POST_CALLBACKS:
if hasattr(callback, 'im_self'):
- (completed, dn) = self.post_callback(
+ (completed, dn) = callback(
ldap, completed, failed, dn, entry_attrs, *keys, **options
)
else:
- (completed, dn) = self.post_callback(
+ (completed, dn) = callback(
self, ldap, completed, failed, dn, entry_attrs, *keys,
**options
)
@@ -589,6 +684,9 @@ class LDAPAddMember(LDAPModMember):
def post_callback(self, ldap, completed, failed, dn, entry_attrs, *keys, **options):
return (completed, dn)
+ def exc_callback(self, keys, options, exc, call_func, *call_args, **call_kwargs):
+ raise exc
+
class LDAPRemoveMember(LDAPModMember):
"""
@@ -651,8 +749,14 @@ class LDAPRemoveMember(LDAPModMember):
(dn, entry_attrs) = ldap.get_entry(
dn, attrs_list, normalize=self.obj.normalize_dn
)
- except errors.NotFound:
- self.obj.handle_not_found(*keys)
+ except errors.ExecutionError, e:
+ try:
+ (dn, entry_attrs) = self._call_exc_callbacks(
+ keys, options, e, ldap.get_entry, dn, attrs_list,
+ normalize=self.obj.normalize_dn
+ )
+ except errors.NotFound:
+ self.obj.handle_not_found(*keys)
for callback in self.POST_CALLBACKS:
if hasattr(callback, 'im_self'):
@@ -680,6 +784,9 @@ class LDAPRemoveMember(LDAPModMember):
def post_callback(self, ldap, completed, failed, dn, entry_attrs, *keys, **options):
return (completed, dn)
+ def exc_callback(self, keys, options, exc, call_func, *call_args, **call_kwargs):
+ raise exc
+
class LDAPSearch(CallbackInterface, crud.Search):
"""
@@ -738,8 +845,15 @@ class LDAPSearch(CallbackInterface, crud.Search):
(entries, truncated) = ldap.find_entries(
filter, attrs_list, base_dn, scope=ldap.SCOPE_ONELEVEL
)
- except errors.NotFound:
- (entries, truncated) = ([], False)
+ except errors.ExecutionError, e:
+ try:
+ (entries, truncated) = self._call_exc_callbacks(
+ args, options, e, ldap.find_entries, filter, attrs_list,
+ base_dn, scoope=ldap.SCOPE_ONELEVEL,
+ normalize=self.obj.normalize_dn
+ )
+ except errors.NotFound:
+ (entries, truncated) = ([], False)
for callback in self.POST_CALLBACKS:
if hasattr(callback, 'im_self'):
@@ -767,3 +881,6 @@ class LDAPSearch(CallbackInterface, crud.Search):
def post_callback(self, ldap, entries, truncated, *args, **options):
pass
+ def exc_callback(self, args, options, exc, call_func, *call_args, **call_kwargs):
+ raise exc
+