def test_get_session_new_session(self, mock_client, mock_pooled_qldb_session, mock_create_new_session, mock_release_session, mock_bounded_semaphore, mock_atomic_integer): mock_pooled_qldb_session.return_value = mock_pooled_qldb_session mock_client.return_value = mock_client mock_client.max_pool_connections = DEFAULT_POOL_LIMIT pooled_qldb_driver = PooledQldbDriver(MOCK_LEDGER_NAME) session = pooled_qldb_driver.get_session() mock_bounded_semaphore().acquire.assert_called_once_with(timeout=DEFAULT_TIMEOUT_SECONDS) mock_atomic_integer().decrement.assert_called_once_with() mock_pooled_qldb_session.assert_called_once_with(mock_create_new_session(), mock_release_session) self.assertEqual(session, mock_pooled_qldb_session)
def test_get_session_existing_session(self, mock_client, mock_qldb_session, mock_pooled_qldb_session, mock_release_session, mock_bounded_semaphore, mock_atomic_integer, mock_logger_debug): mock_pooled_qldb_session.return_value = mock_pooled_qldb_session mock_client.return_value = mock_client mock_client.max_pool_connections = DEFAULT_POOL_LIMIT pooled_qldb_driver = PooledQldbDriver(MOCK_LEDGER_NAME) pooled_qldb_driver._pool = Queue() pooled_qldb_driver._pool.put(mock_qldb_session) session = pooled_qldb_driver.get_session() mock_qldb_session._abort_or_close.assert_called_once_with() mock_pooled_qldb_session.assert_called_once_with(mock_qldb_session, mock_release_session) self.assertEqual(session, mock_pooled_qldb_session) mock_bounded_semaphore().acquire.assert_called_once_with(timeout=DEFAULT_TIMEOUT_SECONDS) mock_atomic_integer().decrement.assert_called_once_with() self.assertEqual(mock_logger_debug.call_count, 2)
class QLDBDriver(): def __init__(self, ledger_name=LEDGER_NAME, region_name=REGION, endpoint_url=None, boto3_session=None, aws_access_key_id=ACCESSID, aws_secret_access_key=ACCESSSECRETKEY): self.bd = PooledQldbDriver(ledger_name=ledger_name, region_name=region_name, endpoint_url=endpoint_url, boto3_session=boto3_session, aws_access_key_id=aws_access_key_id, aws_secret_access_key=aws_secret_access_key) self.logger = getLogger() self.logger.info('Instanciando driver') def create_qldb_session(self): self.logger.info('Creando session') qldb_session = self.bd.get_session() return qldb_session def execute_query(self, executor, query): self.logger.info('Ejecutando query {}...'.format(query)) return executor.execute_statement(query) def execute_insert(self, executor, table, data): data_json = json.dumps(data).replace("\"", "'").replace("[", "").replace("]", "") query = "INSERT INTO {} << {} >>".format(table, data_json) self.logger.info('Ejecutando Insert {}...'.format(query)) return executor.execute_statement(query) def create_insert(self, table, data): try: with self.create_qldb_session() as session: query_lambda = lambda executor: self.execute_insert( executor, table, data) query_retry = lambda retry_attempt: self.logger.info( 'Existen conflictos con este insert, intento: {}'.format( retry_attempt)) return session.execute_lambda(query_lambda, query_retry) except Exception: self.logger.exception('Error en query, tabla: {}'.format(table)) return None def create_query(self, query): try: with self.create_qldb_session() as session: query_lambda = lambda executor: self.execute_query( executor, query) query_retry = lambda retry_attempt: self.logger.info( 'Existen conflictos con este query, intento: {}'.format( retry_attempt)) cursor = session.execute_lambda(query_lambda, query_retry) rows = [] for row in cursor: r = ion.dumps(row, binary=False, omit_version_marker=True) r = ion.loads(r) rows.append(dict(r)) return rows except Exception: self.logger.exception('Error en query: {}'.format(query)) return None