[ldap_locks] Mise en place des locks. Cf commentaires pour les détails.

* Malheureusement lc_ldap._create_entity et objet.create sont un peu
 sales, mais j'ai pas trouvé mieux.
 * L'historique contient désormais les secondes.
This commit is contained in:
Pierre-Elliott Bécue 2013-05-30 15:22:11 +02:00
parent 17efae121c
commit d6efff30de
7 changed files with 123 additions and 58 deletions

View file

@ -84,6 +84,8 @@ class lc_ldap(ldap.ldapobject.LDAPObject, object):
"""
ldap.ldapobject.LDAPObject.__init__(self, uri)
self.lockholder = ldap_locks.LdapLockHolder(self)
if user and not re.match('[a-z_][a-z0-9_-]*', user):
raise ValueError('Invalid user name: %r' % user)
@ -205,7 +207,7 @@ class lc_ldap(ldap.ldapobject.LDAPObject, object):
s'éxécuter le plus rapidement possible. On dumpe malgré tout
toute la base, c'est pour pouvoir aussi rajouter à moindre coût
les propriétaires."""
machines,_ = self.allMachinesAdherents(mode)
machines, _ = self.allMachinesAdherents(mode)
return machines
def allAdherents(self, mode='ro'):
@ -213,7 +215,7 @@ class lc_ldap(ldap.ldapobject.LDAPObject, object):
s'éxécuter le plus rapidement possible. On dumpe malgré tout
toute la base, c'est pour pouvoir aussi rajouter à moindre coût
les machines."""
_,adherents = self.allMachinesAdherents(mode)
_, adherents = self.allMachinesAdherents(mode)
return adherents
def newMachine(self, parent, realm, uldif, login=None):
@ -295,6 +297,13 @@ class lc_ldap(ldap.ldapobject.LDAPObject, object):
'''Crée une nouvelle entité ldap avec le dn ``dn`` et les
attributs de ``ldif``. Attention, ldif doit contenir des
données encodées.'''
for key, values in uldif.iteritems():
if key.endswith('id'):
continue
attribs = [attributs.attrify(val, key, self) for val in values]
for attribut in attribs:
if attribut.unique:
self.lockholder.addlock(key, str(attribut))
return objets.new_cransldapobject(self, dn, 'rw', uldif)
def _find_id(self, attr, plage=None):
@ -314,12 +323,17 @@ class lc_ldap(ldap.ldapobject.LDAPObject, object):
if my_id.value != i:
continue
else:
break
try:
self.lockholder.addlock(attr, str(i))
break
except:
continue
else:
raise EnvironmentError('Aucun %s libre dans la plage [%d, %d]' %
(attr, plage[0], i))
else:
i = nonfree[-1]+1
self.lockholder.addlock(attr, str(i))
return i
def _check_parent(self, objdn):