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}, )
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}, )
def handle_timeout(self, signum, frame): logger.error("Process timed out") raise SupersetTimeoutException(self.error_message)
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
def handle_timeout(self, signum: int, frame: Any) -> None: logger.error("Process timed out") raise SupersetTimeoutException(self.error_message)
def handle_timeout( # pylint: disable=unused-argument self, signum: int, frame: Any) -> None: logger.error("Process timed out") raise SupersetTimeoutException(self.error_message)