"""Neo4J cluster verification logic.""" from constants import neo4j_errors from constants import neo4j_queries QUERIES_TO_VERIFY = { 'GET_SERVERS': neo4j_queries.GET_SERVERS_QUERY } class VerifyNeo4JException(Exception): """Error that is raised if neo4j verification fails.""" pass def verify_write_node_exists(query_result): """Verify that we have at least one write node in a cluster. Args: query_result (dict): Returns: dict or None: dictionary with error description or None """ if not any( server for server in query_result.get('servers', []) if server['role'] == 'WRITE'): return { 'query_result': query_result, 'error': neo4j_errors.WRITE_NODE_NOT_AVAILABLE } return None VERIFICATION_FUNCTIONS = { 'GET_SERVERS': verify_write_node_exists } def verify_neo4j_cluster(driver): """Make a number of queries to Neo4J cluster and verify the results. Args: driver: Neo4J driver instance Returns: list: a list with errors found. """ errors = [] with driver.session() as session: for query_name, query in QUERIES_TO_VERIFY.items(): neo4j_result = session.run(query) data = neo4j_result.data()[0] verify_result = VERIFICATION_FUNCTIONS[query_name](data) if verify_result is not None: errors.append(verify_result) return errors