diff options
| author | Yuriy Taraday <yorik.sar@gmail.com> | 2011-06-24 15:20:24 +0400 |
|---|---|---|
| committer | Yuriy Taraday <yorik.sar@gmail.com> | 2011-06-24 15:20:24 +0400 |
| commit | 178ddd56da98f5baf5e9d232bdab8d5565e7e98b (patch) | |
| tree | 39d23ea1e15421e57cede7be0d1887f81f03991d /nova/auth | |
| parent | 654350a1cf93e8ecf8d38f07802e0c3ed7039562 (diff) | |
| download | nova-178ddd56da98f5baf5e9d232bdab8d5565e7e98b.tar.gz nova-178ddd56da98f5baf5e9d232bdab8d5565e7e98b.tar.xz nova-178ddd56da98f5baf5e9d232bdab8d5565e7e98b.zip | |
Add reconnect on server fail to LDAP driver.
Diffstat (limited to 'nova/auth')
| -rw-r--r-- | nova/auth/ldapdriver.py | 39 |
1 files changed, 37 insertions, 2 deletions
diff --git a/nova/auth/ldapdriver.py b/nova/auth/ldapdriver.py index e9532473d..4af91b613 100644 --- a/nova/auth/ldapdriver.py +++ b/nova/auth/ldapdriver.py @@ -101,6 +101,41 @@ def sanitize(fn): return _wrapped +class LDAPWrapper(object): + def __init__(self, ldap, url, user, password): + self.ldap = ldap + self.url = url + self.user = user + self.password = password + self.conn = None + + def __wrap_reconnect(f): + def inner(self, *args, **kwargs): + if self.conn is None: + self.connect() + return f(self.conn)(*args, **kwargs) + else: + try: + return f(self.conn)(*args, **kwargs) + except self.ldap.SERVER_DOWN: + self.connect() + return f(self.conn)(*args, **kwargs) + return inner + + def connect(self): + try: + self.conn = self.ldap.initialize(self.url) + self.conn.bind_s(self.user, self.password) + except self.ldap.SERVER_DOWN: + self.conn = None + raise + + search_s = __wrap_reconnect(lambda conn: conn.search_s) + add_s = __wrap_reconnect(lambda conn: conn.add_s) + delete_s = __wrap_reconnect(lambda conn: conn.delete_s) + modify_s = __wrap_reconnect(lambda conn: conn.modify_s) + + class LdapDriver(object): """Ldap Auth driver @@ -124,8 +159,8 @@ class LdapDriver(object): LdapDriver.project_objectclass = 'novaProject' self.__cache = None if LdapDriver.conn is None: - LdapDriver.conn = self.ldap.initialize(FLAGS.ldap_url) - LdapDriver.conn.simple_bind_s(FLAGS.ldap_user_dn, + LdapDriver.conn = LDAPWrapper(self.ldap, FLAGS.ldap_url, + FLAGS.ldap_user_dn, FLAGS.ldap_password) if LdapDriver.mc is None: LdapDriver.mc = memcache.Client(FLAGS.memcached_servers, debug=0) |
