Commit 494cd42d authored by Valentin Samir's avatar Valentin Samir

[ldap_locks, objets] Juste avant d'écrire dans la base ldap, on vérifie les locks

ils existent toujours et n'ont pas expiré, sinon, il ne faut pas faire
l'enregistrement.
parent 3a3d51e4
......@@ -47,6 +47,12 @@ class LockError(exceptions.StandardError):
"""
pass
class LockExpired(LockError):
"""
Classe d'erreur pour les locks non libéré avant
la durée d'expiration du lock
"""
pass
class LdapLockedByYou(LockError):
"""
Classe d'erreur pour les locks par le process courant
......@@ -164,6 +170,14 @@ class LdapLockHolder:
# S'il a été libéré, banzai, sinon, ça lèvera une exception
return self.addlock(item, value, Id)
def check(self, Id='default', delai=0):
"""Vérifie que l'on a toujours tous nos locks"""
for item, value in self.locks[Id]:
host, pid, begin = self.getlock(item, value)
time_left = self.timeout - (time.time() - begin)
if time_left <= delai:
raise LockExpired("Le lock sur la donnée %r=%r à expiré" % (item, value, time_left))
def removelock(self, item, value, Id='default', force=False):
"""
Libère le lock "$item=$value,$LOCKS_DN".
......
......@@ -369,6 +369,7 @@ class CransLdapObject(object):
modlist = addModlist(ldif)
# Requête LDAP de création de l'objet
try:
self.conn.lockholder.check(self.lockId, delai=10)
self.conn.add_s(self.dn, modlist)
except Exception:
print traceback.format_exc()
......@@ -414,6 +415,7 @@ class CransLdapObject(object):
if not self.in_context:
# forcer l'utilisation d'un context manager permet d'être certain que les locks seront libéré quoi qu'il arrive
cranslib.deprecated.usage("La suppression d'un objet ne devrait être faite qu'avec des contexts managers (with func() as variable)", level=2)
self.conn.lockholder.check(self.lockId, delai=10)
self.bury(comm, login)
self.conn.delete_s(self.dn)
self.conn.lockholder.purge(self.lockId)
......@@ -435,13 +437,12 @@ class CransLdapObject(object):
# On récupère la liste des modifications
modlist = self.get_modlist()
try:
self.conn.lockholder.check(self.lockId, delai=10)
self.conn.modify_s(self.dn, modlist)
self.conn.lockholder.purge(self.lockId)
except Exception as error:
# On nettoie les locks
self.conn.lockholder.purge(self.lockId)
self.cancel()
raise EnvironmentError("Impossible de modifier l'objet, peut-être n'existe-t-il pas ? %r" % error)
raise EnvironmentError("Impossible de modifier l'objet: %r" % error)
# On programme le redémarrage des services
services.services_to_restart(self.conn, self.attrs, self._modifs)
......@@ -455,6 +456,8 @@ class CransLdapObject(object):
"""
old_uldif = lc_ldap.ldif_to_uldif(self.conn.search_s(self.dn, ldap.SCOPE_BASE)[0][1])
self._modifs = attributs.AttrsDict(self.conn, old_uldif, Parent=self)
# On nettoie les locks
self.conn.lockholder.purge(self.lockId)
def check_modifs(self):
"""
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment