예제 #1
0
    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)
예제 #2
0
    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)
예제 #3
0
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