def init_app(settings: Optional[AppSettings] = None) -> FastAPI: if settings is None: settings = AppSettings.create_from_envs() assert settings # nosec logging.basicConfig(level=settings.LOG_LEVEL.value) logging.root.setLevel(settings.LOG_LEVEL.value) logger.debug(settings.json(indent=2)) app = FastAPI( debug=settings.SC_BOOT_MODE in [BootModeEnum.DEBUG, BootModeEnum.DEVELOPMENT, BootModeEnum.LOCAL], title=PROJECT_NAME, description=SUMMARY, version=API_VERSION, openapi_url=f"/api/{API_VTAG}/openapi.json", docs_url="/dev/doc", redoc_url=None, # default disabled ) override_fastapi_openapi_method(app) app.state.settings = settings if settings.SC_BOOT_MODE == BootModeEnum.DEBUG: remote_debug.setup(app) if settings.DIRECTOR_V0.DIRECTOR_V0_ENABLED: director_v0.setup(app, settings.DIRECTOR_V0) if settings.POSTGRES.DIRECTOR_V2_POSTGRES_ENABLED: db.setup(app, settings.POSTGRES) if settings.DYNAMIC_SERVICES.DIRECTOR_V2_DYNAMIC_SERVICES_ENABLED: dynamic_services.setup(app, settings.DYNAMIC_SERVICES) if settings.DYNAMIC_SERVICES.DYNAMIC_SIDECAR and ( settings.DYNAMIC_SERVICES.DYNAMIC_SCHEDULER and settings.DYNAMIC_SERVICES.DYNAMIC_SCHEDULER. DIRECTOR_V2_DYNAMIC_SCHEDULER_ENABLED): dynamic_sidecar.setup(app) if settings.DASK_SCHEDULER.DIRECTOR_V2_DASK_CLIENT_ENABLED: dask_clients_pool.setup(app, settings.DASK_SCHEDULER) if settings.DASK_SCHEDULER.DIRECTOR_V2_DASK_SCHEDULER_ENABLED: rabbitmq.setup(app) comp_scheduler.setup(app) if settings.DIRECTOR_V2_TRACING: setup_tracing(app, settings.DIRECTOR_V2_TRACING) # setup app -- app.add_event_handler("startup", on_startup) app.add_event_handler("shutdown", on_shutdown) _set_exception_handlers(app) app.include_router(api_router) config_all_loggers() return app
async def start_app() -> None: logger.info("Application started") # setup connection to remote debugger (if applies) setup_remote_debugging(force_enabled=app.state.settings.SC_BOOT_MODE == BootModeEnum.DEBUG) # setup connection to pg db if app.state.settings.CATALOG_POSTGRES: await connect_to_db(app) # setup connection to director await setup_director(app) if app.state.settings.CATALOG_DIRECTOR: # FIXME: check director service is in place and ready. Hand-shake?? # SEE https://github.com/ITISFoundation/osparc-simcore/issues/1728 await start_registry_sync_task(app) if app.state.settings.CATALOG_TRACING: setup_tracing(app, app.state.settings.CATALOG_TRACING)
def create_app(settings: Optional[Settings] = None) -> FastAPI: if settings is None: settings = Settings.create_from_envs() logging.basicConfig(level=settings.LOG_LEVEL.value) logging.root.setLevel(settings.LOG_LEVEL.value) app = FastAPI( debug=bool(settings.SC_BOOT_MODE in [ BootModeEnum.DEBUG, BootModeEnum.DEVELOPMENT, BootModeEnum.LOCAL ]), title="Datcore Adapter Service", description="Interfaces with Pennsieve storage service", version=api_version, openapi_url=f"/api/{api_vtag}/openapi.json", docs_url="/dev/doc", redoc_url=None, # default disabled ) logger.debug(settings) app.state.settings = settings # events app.add_event_handler("startup", on_startup) app.add_event_handler("startup", create_start_app_handler(app)) app.add_event_handler("shutdown", create_stop_app_handler(app)) app.add_event_handler("shutdown", on_shutdown) # Routing setup_api(app) if settings.PENNSIEVE.PENNSIEVE_ENABLED: pennsieve.setup(app, settings.PENNSIEVE) if settings.DATCORE_ADAPTER_TRACING: setup_tracing(app, settings.DATCORE_ADAPTER_TRACING) return app
def init_app(settings: Optional[AppSettings] = None) -> FastAPI: if settings is None: settings = AppSettings.create_from_envs() assert settings # nosec logging.basicConfig(level=settings.LOG_LEVEL.value) logging.root.setLevel(settings.LOG_LEVEL.value) logger.debug(settings.json(indent=2)) app = FastAPI( debug=settings.SC_BOOT_MODE in [BootModeEnum.DEBUG, BootModeEnum.DEVELOPMENT, BootModeEnum.LOCAL], title=PROJECT_NAME, description=SUMMARY, version=API_VERSION, openapi_url=f"/api/{API_VTAG}/openapi.json", docs_url="/dev/doc", redoc_url=None, # default disabled ) override_fastapi_openapi_method(app) app.state.settings = settings if settings.SC_BOOT_MODE == BootModeEnum.DEBUG: remote_debug.setup(app) if settings.DIRECTOR_V0.DIRECTOR_V0_ENABLED: director_v0.setup(app, settings.DIRECTOR_V0) if settings.POSTGRES.DIRECTOR_V2_POSTGRES_ENABLED: db.setup(app, settings.POSTGRES) if settings.DYNAMIC_SERVICES.DIRECTOR_V2_DYNAMIC_SERVICES_ENABLED: dynamic_services.setup(app, settings.DYNAMIC_SERVICES) if settings.DYNAMIC_SERVICES.DYNAMIC_SIDECAR and ( settings.DYNAMIC_SERVICES.DYNAMIC_SCHEDULER and settings.DYNAMIC_SERVICES.DYNAMIC_SCHEDULER. DIRECTOR_V2_DYNAMIC_SCHEDULER_ENABLED): dynamic_sidecar.setup(app) if settings.DASK_SCHEDULER.DIRECTOR_V2_DASK_CLIENT_ENABLED: dask_clients_pool.setup(app, settings.DASK_SCHEDULER) if settings.DASK_SCHEDULER.DIRECTOR_V2_DASK_SCHEDULER_ENABLED: rabbitmq.setup(app) comp_scheduler.setup(app) if settings.DIRECTOR_V2_TRACING: setup_tracing(app, settings.DIRECTOR_V2_TRACING) # setup app -- app.add_event_handler("startup", on_startup) app.add_event_handler("shutdown", on_shutdown) app.add_exception_handler(HTTPException, http_error_handler) app.add_exception_handler(RequestValidationError, http422_error_handler) # director-v2 core.errors mappend into HTTP errors app.add_exception_handler( ProjectNotFoundError, make_http_error_handler_for_exception(status.HTTP_404_NOT_FOUND, ProjectNotFoundError), ) app.add_exception_handler( PipelineNotFoundError, make_http_error_handler_for_exception(status.HTTP_404_NOT_FOUND, PipelineNotFoundError), ) # SEE https://docs.python.org/3/library/exceptions.html#exception-hierarchy app.add_exception_handler( NotImplementedError, make_http_error_handler_for_exception(status.HTTP_501_NOT_IMPLEMENTED, NotImplementedError), ) app.add_exception_handler( Exception, make_http_error_handler_for_exception( status.HTTP_500_INTERNAL_SERVER_ERROR, Exception), ) app.include_router(api_router) config_all_loggers() return app
def init_app(settings: Optional[AppSettings] = None) -> FastAPI: if settings is None: settings = AppSettings.create_from_envs() assert settings # nosec logging.basicConfig(level=settings.LOG_LEVEL.value) logging.root.setLevel(settings.LOG_LEVEL.value) logger.debug("App settings:\n%s", settings.json(indent=2)) # creates app instance app = FastAPI( debug=settings.debug, title="osparc.io web API", description="osparc-simcore public web API specifications", version=API_VERSION, openapi_url=f"/api/{API_VTAG}/openapi.json", docs_url="/dev/doc", redoc_url=None, # default disabled, see below ) override_openapi_method(app) app.state.settings = settings # setup modules if settings.SC_BOOT_MODE == BootModeEnum.DEBUG: remote_debug.setup(app) if settings.API_SERVER_WEBSERVER: webserver.setup(app, settings.API_SERVER_WEBSERVER) if settings.API_SERVER_CATALOG: catalog.setup(app, settings.API_SERVER_CATALOG) if settings.API_SERVER_STORAGE: storage.setup(app, settings.API_SERVER_STORAGE) if settings.API_SERVER_DIRECTOR_V2: director_v2.setup(app, settings.API_SERVER_DIRECTOR_V2) if settings.API_SERVER_TRACING: setup_tracing(app, settings.API_SERVER_TRACING) # setup app app.add_event_handler("startup", create_start_app_handler(app)) app.add_event_handler("shutdown", create_stop_app_handler(app)) app.add_exception_handler(HTTPException, http_error_handler) app.add_exception_handler(RequestValidationError, http422_error_handler) app.add_exception_handler(HTTPStatusError, httpx_client_error_handler) # SEE https://docs.python.org/3/library/exceptions.html#exception-hierarchy app.add_exception_handler( NotImplementedError, make_http_error_handler_for_exception( status.HTTP_501_NOT_IMPLEMENTED, NotImplementedError ), ) app.add_exception_handler( Exception, make_http_error_handler_for_exception( status.HTTP_500_INTERNAL_SERVER_ERROR, Exception, override_detail_message="Internal error" if settings.SC_BOOT_MODE == BootModeEnum.DEBUG else None, ), ) # routing # healthcheck at / and at /VTAG/ app.include_router(health_router) # docs redoc_html = create_redoc_handler(app) app.add_route("/doc", redoc_html, name="redoc_html", include_in_schema=False) # api under /v* api_router = create_router(settings) app.include_router(api_router, prefix=f"/{API_VTAG}") use_route_names_as_operation_ids(app) config_all_loggers() return app