コード例 #1
0
 def handle_timeout(  # pylint: disable=unused-argument
         self, signum: int, frame: Any) -> None:
     logger.error("Process timed out")
     raise SupersetTimeoutException(
         error_type=SupersetErrorType.BACKEND_TIMEOUT_ERROR,
         message=self.error_message,
         level=ErrorLevel.ERROR,
         extra={"timeout": self.seconds},
     )
コード例 #2
0
 def __exit__(  # pylint: disable=redefined-outer-name,unused-variable,redefined-builtin
         self, type: Any, value: Any, traceback: TracebackType) -> None:
     self.timer.cancel()
     if type is KeyboardInterrupt:  # raised by _thread.interrupt_main
         raise SupersetTimeoutException(
             error_type=SupersetErrorType.BACKEND_TIMEOUT_ERROR,
             message=self.error_message,
             level=ErrorLevel.ERROR,
             extra={"timeout": self.seconds},
         )
コード例 #3
0
 def handle_timeout(self, signum, frame):
     logger.error("Process timed out")
     raise SupersetTimeoutException(self.error_message)
コード例 #4
0
    def run(self) -> None:
        self.validate()
        uri = self._properties.get("sqlalchemy_uri", "")
        if self._model and uri == self._model.safe_sqlalchemy_uri():
            uri = self._model.sqlalchemy_uri_decrypted

        # context for error messages
        url = make_url(uri)
        context = {
            "hostname": url.host,
            "password": url.password,
            "port": url.port,
            "username": url.username,
            "database": url.database,
        }

        try:
            database = DatabaseDAO.build_db_for_connection_test(
                server_cert=self._properties.get("server_cert", ""),
                extra=self._properties.get("extra", "{}"),
                impersonate_user=self._properties.get("impersonate_user",
                                                      False),
                encrypted_extra=self._properties.get("encrypted_extra", "{}"),
            )

            database.set_sqlalchemy_uri(uri)
            database.db_engine_spec.mutate_db_for_connection_test(database)
            username = self._actor.username if self._actor is not None else None
            engine = database.get_sqla_engine(user_name=username)
            event_logger.log_with_context(
                action="test_connection_attempt",
                engine=database.db_engine_spec.__name__,
            )
            with closing(engine.raw_connection()) as conn:
                try:
                    alive = func_timeout(
                        int(app.config["TEST_DATABASE_CONNECTION_TIMEOUT"].
                            total_seconds()),
                        engine.dialect.do_ping,
                        args=(conn, ),
                    )
                except sqlite3.ProgrammingError:
                    # SQLite can't run on a separate thread, so ``func_timeout`` fails
                    alive = engine.dialect.do_ping(conn)
                except FunctionTimedOut as ex:
                    raise SupersetTimeoutException(
                        error_type=SupersetErrorType.
                        CONNECTION_DATABASE_TIMEOUT,
                        message=
                        ("Please check your connection details and database settings, "
                         "and ensure that your database is accepting connections, "
                         "then try connecting again."),
                        level=ErrorLevel.ERROR,
                        extra={"sqlalchemy_uri": database.sqlalchemy_uri},
                    ) from ex
                except Exception:  # pylint: disable=broad-except
                    alive = False
                if not alive:
                    raise DBAPIError(None, None, None)

            # Log succesful connection test with engine
            event_logger.log_with_context(
                action="test_connection_success",
                engine=database.db_engine_spec.__name__,
            )

        except (NoSuchModuleError, ModuleNotFoundError) as ex:
            event_logger.log_with_context(
                action=f"test_connection_error.{ex.__class__.__name__}",
                engine=database.db_engine_spec.__name__,
            )
            raise DatabaseTestConnectionDriverError(
                message=_("Could not load database driver: {}").format(
                    database.db_engine_spec.__name__), ) from ex
        except DBAPIError as ex:
            event_logger.log_with_context(
                action=f"test_connection_error.{ex.__class__.__name__}",
                engine=database.db_engine_spec.__name__,
            )
            # check for custom errors (wrong username, wrong password, etc)
            errors = database.db_engine_spec.extract_errors(ex, context)
            raise DatabaseTestConnectionFailedError(errors) from ex
        except SupersetSecurityException as ex:
            event_logger.log_with_context(
                action=f"test_connection_error.{ex.__class__.__name__}",
                engine=database.db_engine_spec.__name__,
            )
            raise DatabaseSecurityUnsafeError(message=str(ex)) from ex
        except SupersetTimeoutException as ex:
            event_logger.log_with_context(
                action=f"test_connection_error.{ex.__class__.__name__}",
                engine=database.db_engine_spec.__name__,
            )
            # bubble up the exception to return a 408
            raise ex
        except Exception as ex:
            event_logger.log_with_context(
                action=f"test_connection_error.{ex.__class__.__name__}",
                engine=database.db_engine_spec.__name__,
            )
            errors = database.db_engine_spec.extract_errors(ex, context)
            raise DatabaseTestConnectionUnexpectedError(errors) from ex
コード例 #5
0
 def handle_timeout(self, signum: int, frame: Any) -> None:
     logger.error("Process timed out")
     raise SupersetTimeoutException(self.error_message)
コード例 #6
0
ファイル: core.py プロジェクト: fred2305/superset
 def handle_timeout(  # pylint: disable=unused-argument
         self, signum: int, frame: Any) -> None:
     logger.error("Process timed out")
     raise SupersetTimeoutException(self.error_message)