Esempio n. 1
0
    def run(self) -> Model:
        self.validate()

        try:
            # Test connection before starting create transaction
            TestConnectionDatabaseCommand(self._properties).run()
        except Exception as ex:
            event_logger.log_with_context(
                action=f"db_creation_failed.{ex.__class__.__name__}",
                engine=self._properties.get("sqlalchemy_uri", "").split(":")[0],
            )
            raise DatabaseConnectionFailedError() from ex

        try:
            database = DatabaseDAO.create(self._properties, commit=False)
            database.set_sqlalchemy_uri(database.sqlalchemy_uri)

            # adding a new database we always want to force refresh schema list
            schemas = database.get_all_schema_names(cache=False)
            for schema in schemas:
                security_manager.add_permission_view_menu(
                    "schema_access", security_manager.get_schema_perm(database, schema)
                )
            db.session.commit()
        except DAOCreateFailedError as ex:
            db.session.rollback()
            event_logger.log_with_context(
                action=f"db_creation_failed.{ex.__class__.__name__}",
                engine=database.db_engine_spec.__name__,
            )
            raise DatabaseCreateFailedError() from ex
        return database
Esempio n. 2
0
    def run(self) -> Model:
        self.validate()
        try:
            database = DatabaseDAO.create(self._properties, commit=False)
            database.set_sqlalchemy_uri(database.sqlalchemy_uri)

            try:
                TestConnectionDatabaseCommand(self._actor,
                                              self._properties).run()
            except Exception as ex:  # pylint: disable=broad-except
                db.session.rollback()
                event_logger.log_with_context(
                    action=f"db_creation_failed.{ex.__class__.__name__}",
                    engine=database.db_engine_spec.__name__,
                )
                raise DatabaseConnectionFailedError()

            # adding a new database we always want to force refresh schema list
            schemas = database.get_all_schema_names(cache=False)
            for schema in schemas:
                security_manager.add_permission_view_menu(
                    "schema_access",
                    security_manager.get_schema_perm(database, schema))
            security_manager.add_permission_view_menu("database_access",
                                                      database.perm)
            db.session.commit()
        except DAOCreateFailedError as ex:
            event_logger.log_with_context(
                action=f"db_creation_failed.{ex.__class__.__name__}",
                engine=database.db_engine_spec.__name__,
            )
            raise DatabaseCreateFailedError()
        return database
Esempio n. 3
0
    def run(self) -> Model:
        self.validate()
        try:
            database = DatabaseDAO.update(self._model,
                                          self._properties,
                                          commit=False)
            database.set_sqlalchemy_uri(database.sqlalchemy_uri)
            security_manager.add_permission_view_menu("database_access",
                                                      database.perm)
            # adding a new database we always want to force refresh schema list
            # TODO Improve this simplistic implementation for catching DB conn fails
            try:
                schemas = database.get_all_schema_names()
            except Exception as ex:
                db.session.rollback()
                raise DatabaseConnectionFailedError() from ex
            for schema in schemas:
                security_manager.add_permission_view_menu(
                    "schema_access",
                    security_manager.get_schema_perm(database, schema))
            db.session.commit()

        except DAOUpdateFailedError as ex:
            logger.exception(ex.exception)
            raise DatabaseUpdateFailedError() from ex
        return database
Esempio n. 4
0
def create_old_role(pvm_map: PvmMigrationMapType, external_pvms):
    with app.app_context():
        pvms = []
        for old_pvm, new_pvms in pvm_map.items():
            pvms.append(
                security_manager.add_permission_view_menu(
                    old_pvm.permission, old_pvm.view))
        for external_pvm in external_pvms:
            pvms.append(
                security_manager.find_permission_view_menu(
                    external_pvm.permission, external_pvm.view))

        new_role = Role(name="Dummy Role", permissions=pvms)
        db.session.add(new_role)
        db.session.commit()

        yield new_role

        new_role = (db.session.query(Role).filter(
            Role.name == "Dummy Role").one_or_none())
        new_role.permissions = []
        db.session.merge(new_role)
        for old_pvm, new_pvms in pvm_map.items():
            security_manager.del_permission_view_menu(old_pvm.permission,
                                                      old_pvm.view)
            for new_pvm in new_pvms:
                security_manager.del_permission_view_menu(
                    new_pvm.permission, new_pvm.view)

        db.session.delete(new_role)
        db.session.commit()
Esempio n. 5
0
    def run(self) -> Model:
        self.validate()
        if not self._model:
            raise DatabaseNotFoundError()
        old_database_name = self._model.database_name

        try:
            database = DatabaseDAO.update(self._model,
                                          self._properties,
                                          commit=False)
            database.set_sqlalchemy_uri(database.sqlalchemy_uri)
            # adding a new database we always want to force refresh schema list
            # TODO Improve this simplistic implementation for catching DB conn fails
            try:
                schemas = database.get_all_schema_names()
            except Exception as ex:
                db.session.rollback()
                raise DatabaseConnectionFailedError() from ex
            # Update database schema permissions
            new_schemas: List[str] = []
            for schema in schemas:
                old_view_menu_name = security_manager.get_schema_perm(
                    old_database_name, schema)
                new_view_menu_name = security_manager.get_schema_perm(
                    database.database_name, schema)
                schema_pvm = security_manager.find_permission_view_menu(
                    "schema_access", old_view_menu_name)
                # Update the schema permission if the database name changed
                if schema_pvm and old_database_name != database.database_name:
                    schema_pvm.view_menu.name = new_view_menu_name
                else:
                    new_schemas.append(schema)
            for schema in new_schemas:
                security_manager.add_permission_view_menu(
                    "schema_access",
                    security_manager.get_schema_perm(database, schema))
            db.session.commit()

        except DAOUpdateFailedError as ex:
            logger.exception(ex.exception)
            raise DatabaseUpdateFailedError() from ex
        return database
Esempio n. 6
0
 def run(self) -> Model:
     self.validate()
     try:
         # Creates SqlaTable (Dataset)
         dataset = DatasetDAO.create(self._properties, commit=False)
         # Updates columns and metrics from the dataset
         dataset.fetch_metadata(commit=False)
         # Add datasource access permission
         security_manager.add_permission_view_menu("datasource_access",
                                                   dataset.get_perm())
         # Add schema access permission if exists
         if dataset.schema:
             security_manager.add_permission_view_menu(
                 "schema_access", dataset.schema_perm)
         db.session.commit()
     except (SQLAlchemyError, DAOCreateFailedError) as ex:
         logger.warning(ex, exc_info=True)
         db.session.rollback()
         raise DatasetCreateFailedError()
     return dataset
Esempio n. 7
0
    def run(self) -> Model:
        self.validate()
        try:
            database = DatabaseDAO.create(self._properties, commit=False)
            database.set_sqlalchemy_uri(database.sqlalchemy_uri)

            try:
                TestConnectionDatabaseCommand(self._actor, self._properties).run()
            except Exception:
                db.session.rollback()
                raise DatabaseConnectionFailedError()

            # adding a new database we always want to force refresh schema list
            schemas = database.get_all_schema_names(cache=False)
            for schema in schemas:
                security_manager.add_permission_view_menu(
                    "schema_access", security_manager.get_schema_perm(database, schema)
                )
            security_manager.add_permission_view_menu("database_access", database.perm)
            db.session.commit()
        except DAOCreateFailedError as ex:
            logger.exception(ex.exception)
            raise DatabaseCreateFailedError()
        return database