def paste_app_factory( global_conf, **kwargs ): """ Return a wsgi application serving the root object """ kwargs = load_app_properties( kwds=kwargs ) # Create the Galaxy application unless passed in if 'app' in kwargs: app = kwargs.pop( 'app' ) galaxy.app.app = app else: try: app = galaxy.app.UniverseApplication( global_conf=global_conf, **kwargs ) galaxy.app.app = app except: import traceback traceback.print_exc() sys.exit( 1 ) # Call app's shutdown method when the interpeter exits, this cleanly stops # the various Galaxy application daemon threads atexit.register( app.shutdown ) # Create the universe WSGI application webapp = GalaxyWebApplication( app, session_cookie='galaxysession', name='galaxy' ) # STANDARD CONTROLLER ROUTES webapp.add_ui_controllers( 'galaxy.webapps.galaxy.controllers', app ) # Force /history to go to view of current webapp.add_route( '/history', controller='history', action='view' ) webapp.add_route( '/history/view/{id}', controller='history', action='view' ) # THIS IS A TEMPORARY ROUTE FOR THE 17.01 RELEASE # This route supports the previous hide/delete-all-hidden functionality in a history. # It will be removed after 17.01. webapp.add_route( '/history/adjust_hidden', controller='history', action='adjust_hidden') # Force /activate to go to the controller webapp.add_route( '/activate', controller='user', action='activate' ) webapp.add_route( '/login', controller='root', action='login' ) # These two routes handle our simple needs at the moment webapp.add_route( '/async/{tool_id}/{data_id}/{data_secret}', controller='async', action='index', tool_id=None, data_id=None, data_secret=None ) webapp.add_route( '/{controller}/{action}', action='index' ) webapp.add_route( '/{action}', controller='root', action='index' ) # allow for subdirectories in extra_files_path webapp.add_route( '/datasets/{dataset_id}/display/{filename:.+?}', controller='dataset', action='display', dataset_id=None, filename=None) webapp.add_route( '/datasets/{dataset_id}/{action}/{filename}', controller='dataset', action='index', dataset_id=None, filename=None) webapp.add_route( '/display_application/{dataset_id}/{app_name}/{link_name}/{user_id}/{app_action}/{action_param}/{action_param_extra:.+?}', controller='dataset', action='display_application', dataset_id=None, user_id=None, app_name=None, link_name=None, app_action=None, action_param=None, action_param_extra=None ) webapp.add_route( '/u/{username}/d/{slug}/{filename}', controller='dataset', action='display_by_username_and_slug', filename=None ) webapp.add_route( '/u/{username}/p/{slug}', controller='page', action='display_by_username_and_slug' ) webapp.add_route( '/u/{username}/h/{slug}', controller='history', action='display_by_username_and_slug' ) webapp.add_route( '/u/{username}/w/{slug}', controller='workflow', action='display_by_username_and_slug' ) webapp.add_route( '/u/{username}/w/{slug}/{format}', controller='workflow', action='display_by_username_and_slug' ) webapp.add_route( '/u/{username}/v/{slug}', controller='visualization', action='display_by_username_and_slug' ) webapp.add_route( '/search', controller='search', action='index' ) # TODO: Refactor above routes into external method to allow testing in # isolation as well. populate_api_routes( webapp, app ) # CLIENTSIDE ROUTES # The following are routes that are handled completely on the clientside. # The following routes don't bootstrap any information, simply provide the # base analysis interface at which point the application takes over. webapp.add_client_route( '/tours' ) webapp.add_client_route( '/tours/{tour_id}' ) webapp.add_client_route( '/user' ) webapp.add_client_route( '/user/{form_id}' ) # ==== Done # Indicate that all configuration settings have been provided webapp.finalize_config() # Wrap the webapp in some useful middleware if kwargs.get( 'middleware', True ): webapp = wrap_in_middleware(webapp, global_conf, app.application_stack, **kwargs) if asbool( kwargs.get( 'static_enabled', True) ): webapp = wrap_if_allowed(webapp, app.application_stack, wrap_in_static, args=(global_conf,), kwargs=dict(plugin_frameworks=[app.visualizations_registry], **kwargs)) # Close any pooled database connections before forking try: galaxy.model.mapping.metadata.bind.dispose() except: log.exception("Unable to dispose of pooled galaxy model database connections.") try: # This model may not actually be bound. if galaxy.model.tool_shed_install.mapping.metadata.bind: galaxy.model.tool_shed_install.mapping.metadata.bind.dispose() except: log.exception("Unable to dispose of pooled toolshed install model database connections.") app.application_stack.register_postfork_function(postfork_setup) for th in threading.enumerate(): if th.is_alive(): log.debug("Prior to webapp return, Galaxy thread %s is alive.", th) # Return return webapp
def paste_app_factory( global_conf, **kwargs ): """ Return a wsgi application serving the root object """ kwargs = load_app_properties( kwds=kwargs ) # Create the Galaxy application unless passed in if 'app' in kwargs: app = kwargs.pop( 'app' ) galaxy.app.app = app else: try: app = galaxy.app.UniverseApplication( global_conf=global_conf, **kwargs ) galaxy.app.app = app except: import traceback traceback.print_exc() sys.exit( 1 ) # Call app's shutdown method when the interpeter exits, this cleanly stops # the various Galaxy application daemon threads atexit.register( app.shutdown ) # Create the universe WSGI application webapp = GalaxyWebApplication( app, session_cookie='galaxysession', name='galaxy' ) # CLIENTSIDE ROUTES # The following are routes that are handled completely on the clientside. # The following routes don't bootstrap any information, simply provide the # base analysis interface at which point the application takes over. webapp.add_client_route( '/tours' ) webapp.add_client_route( '/tours/{tour_id}' ) # STANDARD CONTROLLER ROUTES webapp.add_ui_controllers( 'galaxy.webapps.galaxy.controllers', app ) # Force /history to go to view of current webapp.add_route( '/history', controller='history', action='view' ) # Force /activate to go to the controller webapp.add_route( '/activate', controller='user', action='activate' ) webapp.add_route( '/login', controller='root', action='login' ) # These two routes handle our simple needs at the moment webapp.add_route( '/async/{tool_id}/{data_id}/{data_secret}', controller='async', action='index', tool_id=None, data_id=None, data_secret=None ) webapp.add_route( '/{controller}/{action}', action='index' ) webapp.add_route( '/{action}', controller='root', action='index' ) # allow for subdirectories in extra_files_path webapp.add_route( '/datasets/{dataset_id}/display/{filename:.+?}', controller='dataset', action='display', dataset_id=None, filename=None) webapp.add_route( '/datasets/{dataset_id}/{action}/{filename}', controller='dataset', action='index', dataset_id=None, filename=None) webapp.add_route( '/display_application/{dataset_id}/{app_name}/{link_name}/{user_id}/{app_action}/{action_param}/{action_param_extra:.+?}', controller='dataset', action='display_application', dataset_id=None, user_id=None, app_name=None, link_name=None, app_action=None, action_param=None, action_param_extra=None ) webapp.add_route( '/u/{username}/d/{slug}/{filename}', controller='dataset', action='display_by_username_and_slug', filename=None ) webapp.add_route( '/u/{username}/p/{slug}', controller='page', action='display_by_username_and_slug' ) webapp.add_route( '/u/{username}/h/{slug}', controller='history', action='display_by_username_and_slug' ) webapp.add_route( '/u/{username}/w/{slug}', controller='workflow', action='display_by_username_and_slug' ) webapp.add_route( '/u/{username}/w/{slug}/{format}', controller='workflow', action='display_by_username_and_slug' ) webapp.add_route( '/u/{username}/v/{slug}', controller='visualization', action='display_by_username_and_slug' ) webapp.add_route( '/search', controller='search', action='index' ) # TODO: Refactor above routes into external method to allow testing in # isolation as well. populate_api_routes( webapp, app ) # ==== Done # Indicate that all configuration settings have been provided webapp.finalize_config() # Wrap the webapp in some useful middleware if kwargs.get( 'middleware', True ): webapp = wrap_in_middleware( webapp, global_conf, **kwargs ) if asbool( kwargs.get( 'static_enabled', True) ): if process_is_uwsgi: log.error("Static middleware is enabled in your configuration but this is a uwsgi process. Refusing to wrap in static middleware.") else: webapp = wrap_in_static( webapp, global_conf, plugin_frameworks=[ app.visualizations_registry ], **kwargs ) # Close any pooled database connections before forking try: galaxy.model.mapping.metadata.bind.dispose() except: log.exception("Unable to dispose of pooled galaxy model database connections.") try: # This model may not actually be bound. if galaxy.model.tool_shed_install.mapping.metadata.bind: galaxy.model.tool_shed_install.mapping.metadata.bind.dispose() except: log.exception("Unable to dispose of pooled toolshed install model database connections.") if not process_is_uwsgi: postfork_setup() # Return return webapp