def check_status(self, instance=None): with self.redis(instance=instance) as client: try: ok = client.ping() except Exception as e: raise ConnectionError( 'Error connection to infra {}: {}'.format( self.databaseinfra, str(e))) if not ok: raise ConnectionError( 'Invalid status for ping command to infra {}'.format( self.databaseinfra)) return True
def redis(self, instance=None, database=None): try: client = self.__redis_client__(instance) return_value = client yield return_value except Exception as e: raise ConnectionError('Error connecting to infra {}: {}'.format( self.databaseinfra, str(e)))
def check_instance_is_master(self, instance): with self.redis(instance=instance) as client: try: info = client.info() except Exception as e: raise ConnectionError( 'Error connection to infra {}: {}'.format( self.databaseinfra, str(e))) else: return info['role'] == 'master'
def check_instance_is_master(self, instance): if instance.instance_type == Instance.REDIS_SENTINEL: return False with self.redis(instance=instance) as client: try: info = client.info() return info['role'] != 'slave' except Exception as e: raise ConnectionError( 'Error connection to infra {}: {}'.format( self.databaseinfra, str(e)))
def mysqldb(self, instance=None, database=None): client = None try: yield self.__mysql_client__(instance) except _mysql_exceptions.OperationalError as e: if e.args[0] == ER_ACCESS_DENIED_ERROR: raise AuthenticationError(e.args[1]) elif e.args[0] == ER_CAN_NOT_CONNECT: raise ConnectionError(e.args[1]) elif e.args[0] == LOST_CONNECTION: raise ConnectionError(e.args[1]) else: raise GenericDriverError(e.args) finally: try: if client: LOG.debug( 'Disconnecting mysql databaseinfra %s', self.databaseinfra) client.close() except: LOG.warn('Error disconnecting from databaseinfra %s. Ignoring...', self.databaseinfra, exc_info=True)
def list_databases(self, instance=None): dbs_names = [] with self.redis(instance=instance) as client: try: keyspace = client.info('keyspace') if len(keyspace) == 0: dbs_names.append('db0') else: for db in keyspace: dbs_names.append(db) except Exception as e: raise ConnectionError( 'Error connection to infra {}: {}'.format( self.databaseinfra, str(e))) return dbs_names
def get_slave_for(self, instance): with self.redis(instance=instance) as client: try: info = client.info() except Exception as e: raise ConnectionError( 'Error connection to infra {}: {}'.format( self.databaseinfra, str(e))) if info['role'] != 'master': return address = info['slave0']['ip'] port = info['slave0']['port'] return self.databaseinfra.instances.filter( hostname__address=address, port=port).first()