Source code for stochss_compute.server.api

'''
stochss_compute.server.api
'''
# StochSS-Compute is a tool for running and caching GillesPy2 simulations remotely.
# Copyright (C) 2019-2023 GillesPy2 and StochSS developers.

# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.

# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.

# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

import os
import asyncio
import subprocess
from tornado.web import Application
from stochss_compute.server.is_cached import IsCachedHandler
from stochss_compute.server.run import RunHandler
from stochss_compute.server.sourceip import SourceIpHandler
from stochss_compute.server.status import StatusHandler
from stochss_compute.server.results import ResultsHandler

def _make_app(dask_host, dask_scheduler_port, cache):
    scheduler_address = f'{dask_host}:{dask_scheduler_port}'
    return Application([
        (r"/api/v2/simulation/gillespy2/run", RunHandler,
            {'scheduler_address': scheduler_address, 'cache_dir': cache}),
        (r"/api/v2/simulation/gillespy2/(?P<results_id>.*?)/(?P<n_traj>[1-9]\d*?)/(?P<task_id>.*?)/status",
            StatusHandler, {'scheduler_address': scheduler_address, 'cache_dir': cache}),
        (r"/api/v2/simulation/gillespy2/(?P<results_id>.*?)/(?P<n_traj>[1-9]\d*?)/results",
            ResultsHandler, {'cache_dir': cache}),
        (r"/api/v2/cache/gillespy2/(?P<results_id>.*?)/(?P<n_traj>[1-9]\d*?)/is_cached",
            IsCachedHandler, {'cache_dir': cache}),
        (r"/api/v2/cloud/sourceip", SourceIpHandler),
    ])

[docs]async def start_api( port = 29681, cache = 'cache/', dask_host = 'localhost', dask_scheduler_port = 8786, rm = False, ): """ Start the REST API with the following arguments. :param port: The port to listen on. :type port: int :param cache: The cache directory path. :type cache: str :param dask_host: The address of the dask cluster. :type dask_host: str :param dask_scheduler_port: The port of the dask cluster. :type dask_scheduler_port: int :param rm: Delete the cache when exiting this program. :type rm: bool """ # clean up lock files here cache_path = os.path.abspath(cache) app = _make_app(dask_host, dask_scheduler_port, cache) app.listen(port) print(f'StochSS-Compute listening on: :{port}') print(f'Cache directory: {cache_path}') print(f'Connecting to Dask scheduler at: {dask_host}:{dask_scheduler_port}\n') try: await asyncio.Event().wait() except asyncio.exceptions.CancelledError as error: print(error) finally: if rm and os.path.exists(cache_path): print('Removing cache...', end='') subprocess.Popen(['rm', '-r', cache_path]) print('OK')