Exemplo n.º 1
0
 def test_psycopg2_args_dict(self):
     config, intxn_table_map = parse_test_db_config()
     adapter = Psycopg2Adapter(
         Psycopg2Adapter.to_psycopg_args(config),
         intxn_table_map
     )
     adapter.db_connection.cursor().execute("SELECT 1")
Exemplo n.º 2
0
def run(args, config):
    # set up database connection
    db_logger = logging.getLogger()
    db_config, intxn_table_mappings = parse_config(config)
    db_pars = Psycopg2Adapter.to_psycopg_args(db_config)

    if db_config is None:
        error("could not read DB configuration")

    if intxn_table_mappings is None:
        error("table mappings are not defined")

    try:
        db_adapter = Psycopg2Adapter(db_pars,
                                     intxn_table_mappings,
                                     logger=db_logger)
    except py_tag2domain.exceptions.AdapterConnectionException as e:
        error("could not connect to database - %s" % str(e))

    # create MeasruementToTags object
    msm2tags_logger = logging.getLogger()
    max_measurement_age_int = config.getint("tag2domain",
                                            "max_measurement_age",
                                            fallback=None)
    if max_measurement_age_int is None:
        max_measurement_age = None
        logging.info(
            "setting up MeasurementToTags without a max measurement age")
    else:
        max_measurement_age = datetime.timedelta(
            minutes=max_measurement_age_int)
        logging.info("setting up MeasurementToTags with max measurement "
                     "age of %i minutes" % (max_measurement_age_int))
    msm2tags = MeasurementToTags(db_adapter,
                                 logger=msm2tags_logger,
                                 max_measurement_age=max_measurement_age)

    def msm_handler(msm):
        try:
            result = msm2tags.handle_measurement(msm)
        except py_tag2domain.exceptions.InvalidMeasurementException as e:
            logging.warning("invalid measurement - %s" % str(e))
            raise
        except py_tag2domain.exceptions.StaleMeasurementException as e:
            logging.warning("stale measurement - %s" % str(e))
            return True, None
        except Exception as e:
            bt = traceback.format_exc()
            error("unknown exception - %s\n%s" % (str(e), bt))

        return True, result

    msm_looper = get_msm_looper(args, config, msm_handler)

    msm_looper.loop()

    logging.info("all measurements consumed - exiting")
Exemplo n.º 3
0
 def test_get_stmt_unknown_stmt_fail(self):
     config, intxn_table_map = parse_test_db_config()
     connection_args = Psycopg2Adapter.to_psycopg_args(config)
     conn = psycopg2.connect(**connection_args)
     adapter = Psycopg2Adapter(conn, intxn_table_map)
     self.assertRaises(
         ValueError,
         adapter.get_compiled_stmt,
         "some unknown stmt",
         "domain"
     )
Exemplo n.º 4
0
 def test_get_stmt_unknown_type_fail(self):
     config, intxn_table_map = parse_test_db_config()
     connection_args = Psycopg2Adapter.to_psycopg_args(config)
     conn = psycopg2.connect(**connection_args)
     adapter = Psycopg2Adapter(conn, intxn_table_map)
     self.assertRaises(
         AdapterDBError,
         adapter.get_compiled_stmt,
         "get_open_tags",
         "some unknown type"
     )
Exemplo n.º 5
0
 def test_psycopg2_args_string(self):
     config, intxn_table_map = parse_test_db_config()
     args_dict = Psycopg2Adapter.to_psycopg_args(config)
     args_list = [
         "%s=%s" % (key, val)
         for key, val in args_dict.items()
         if key != "options"
     ]
     args = ' '.join(args_list)
     print(args)
     adapter = Psycopg2Adapter(args, intxn_table_map)
     adapter.db_connection.cursor().execute("SELECT 1")
Exemplo n.º 6
0
    def test_get_db_dict_cursor(self):
        config, _ = parse_test_db_config()
        connection_args = Psycopg2Adapter.to_psycopg_args(config)
        conn = psycopg2.connect(**connection_args)
        set_db(conn)

        cursor = get_db_dict_cursor()
        self.assertIsInstance(cursor, psycopg2.extensions.cursor)
        cursor.execute("SELECT 1;")
        disconnect_db()
Exemplo n.º 7
0
    def test_set_db(self):
        config, _ = parse_test_db_config()
        connection_args = Psycopg2Adapter.to_psycopg_args(config)
        conn = psycopg2.connect(**connection_args)
        set_db(conn)

        db_conn = get_db()
        self.assertIsInstance(db_conn, psycopg2.extensions.connection)

        assert tag2domain_api.app.util.db._db_config is None
        assert tag2domain_api.app.util.db._config is None
Exemplo n.º 8
0
    def test_execute_db_correct_stmt(self):
        config, _ = parse_test_db_config()
        connection_args = Psycopg2Adapter.to_psycopg_args(config)
        conn = psycopg2.connect(**connection_args)
        set_db(conn)

        rows = execute_db("SELECT 1;")

        assert len(rows) == 1
        assert rows[0][0] == 1
        disconnect_db()
Exemplo n.º 9
0
    def test_psycopg2_args_autocommmit_conn_fail(self):
        config, intxn_table_map = parse_test_db_config()
        connection_args = Psycopg2Adapter.to_psycopg_args(config)
        conn = psycopg2.connect(**connection_args)
        conn.set_session(autocommit=True)

        self.assertRaisesRegex(
            ValueError,
            "DB connection used must not be in in autocommit mode",
            Psycopg2Adapter,
            conn,
            intxn_table_map
        )
Exemplo n.º 10
0
    def test_connect_db_fails_when_set_db_used(self):
        config, _ = parse_test_db_config()
        old_db_conn = connect_db(config)
        connection_args = Psycopg2Adapter.to_psycopg_args(config)

        conn = psycopg2.connect(**connection_args)
        set_db(conn)

        old_db_conn.close()

        self.assertRaisesRegex(
            ValueError,
            "No config given",
            connect_db
        )
Exemplo n.º 11
0
    async def msm2tag(msm: MeasurementModel = Body(
        ...,
        example={
            "version": "1",
            "tag_type": "intersection",
            "tagged_id": 3,
            "taxonomy": "colors",
            "producer": "test",
            "measured_at": "2020-12-22T12:35:32",
            "measurement_id": "test/12345",
            "tags": [
                {
                    "tag": "rgb::blue"
                },
                {
                    "tag": "cmyk::black"
                },
            ]
        })):
        _db_adapter = Psycopg2Adapter(get_db(),
                                      intxn_table_mappings,
                                      logger=logger)

        _msm2tags = MeasurementToTags(_db_adapter,
                                      logger=logger,
                                      max_measurement_age=max_measurement_age)
        try:
            logger.debug(msm.dict(exclude_unset=True))
            _msm2tags.handle_measurement(msm.dict(exclude_unset=True),
                                         skip_validation=True)
        except (InvalidMeasurementException, StaleMeasurementException) as e:
            logger.info("error 400: " + str(e))
            logger.debug(traceback.format_exc())
            raise HTTPException(status_code=400, detail=str(e))

        return {"message": "OK"}
Exemplo n.º 12
0
from py_tag2domain.util import parse_config
from py_tag2domain.db import Psycopg2Adapter


def parse_test_db_config():
    DB_CONFIG_FILE = os.path.join(
        os.path.dirname(os.path.abspath(__file__)),
        "config",
        "db.cfg"
    )

    return parse_config(DB_CONFIG_FILE)


config, TypeIntxnTableMappings = parse_test_db_config()
DB_CONNECTION = Psycopg2Adapter.to_psycopg_args(config)


class PostgresReadOnlyDBTest(TestCase):
    @classmethod
    def setUpClass(cls):
        print("setting up class PostgresReadOnlyDBTest")
        cls.intxn_table_mappings = TypeIntxnTableMappings
        if DB_CONNECTION is None:
            cls.no_db_flag = True
        else:
            cls.no_db_flag = False
            if isinstance(DB_CONNECTION, str):
                cls.db_connection = psycopg2.connect(DB_CONNECTION)
            elif isinstance(DB_CONNECTION, dict):
                cls.db_connection = psycopg2.connect(**DB_CONNECTION)
Exemplo n.º 13
0
 def setUpClass(cls):
     print("setting up class PostgresReadOnlyPsycopgAdapterTest")
     super(PostgresReadOnlyPsycopgAdapterTest, cls).setUpClass()
     cls.adapter = Psycopg2Adapter(cls.db_connection,
                                   cls.intxn_table_mappings)
Exemplo n.º 14
0
 def setUp(self):
     print("setting up instance of PostgresPsycopgAdapterAutoDBTest")
     super(PostgresPsycopgAdapterAutoDBTest, self).setUp()
     self.adapter = Psycopg2Adapter(self.db_connection,
                                    self.__class__.intxn_table_mappings)
Exemplo n.º 15
0
 def test_psycopg_args_with_null_returns_null(self):
     self.assertIsNone(Psycopg2Adapter.to_psycopg_args(None))