Add reconnect on server fail to LDAP driver.
This commit is contained in:
		| @@ -101,6 +101,41 @@ def sanitize(fn): | |||||||
|     return _wrapped |     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): | class LdapDriver(object): | ||||||
|     """Ldap Auth driver |     """Ldap Auth driver | ||||||
|  |  | ||||||
| @@ -124,8 +159,8 @@ class LdapDriver(object): | |||||||
|             LdapDriver.project_objectclass = 'novaProject' |             LdapDriver.project_objectclass = 'novaProject' | ||||||
|         self.__cache = None |         self.__cache = None | ||||||
|         if LdapDriver.conn is None: |         if LdapDriver.conn is None: | ||||||
|             LdapDriver.conn = self.ldap.initialize(FLAGS.ldap_url) |             LdapDriver.conn = LDAPWrapper(self.ldap, FLAGS.ldap_url, | ||||||
|             LdapDriver.conn.simple_bind_s(FLAGS.ldap_user_dn, |                                           FLAGS.ldap_user_dn, | ||||||
|                                           FLAGS.ldap_password) |                                           FLAGS.ldap_password) | ||||||
|         if LdapDriver.mc is None: |         if LdapDriver.mc is None: | ||||||
|             LdapDriver.mc = memcache.Client(FLAGS.memcached_servers, debug=0) |             LdapDriver.mc = memcache.Client(FLAGS.memcached_servers, debug=0) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Yuriy Taraday
					Yuriy Taraday