Source code for stochss_compute.client.server

'''
Server(ABC)
'''
# 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/>.

from time import sleep
from abc import ABC, abstractmethod
import requests
from stochss_compute.client.endpoint import Endpoint
from stochss_compute.core.messages import Request, Response

[docs]class Server(ABC): ''' Abstract Server class with hard coded endpoints. :raises TypeError: Server cannot be instantiated directly. Must be ComputeServer or Cluster. ''' _endpoints = { Endpoint.SIMULATION_GILLESPY2: "/api/v2/simulation/gillespy2", Endpoint.CLOUD: "/api/v2/cloud" } def __init__(self) -> None: raise TypeError('Server cannot be instantiated directly. Must be ComputeServer or Cluster.') @property @abstractmethod def address(self): ''' NotImplemented ''' return NotImplemented
[docs] def get(self, endpoint: Endpoint, sub: str): ''' Send a GET request to endpoint. :param endpoint: The API endpoint. :type endpoint: Endpoint :param sub: Final part of url string. :type sub: str :returns: The HTTP response. :rtype: requests.Response ''' url = f"{self.address}{self._endpoints[endpoint]}{sub}" n_try = 1 sec = 3 while n_try <= 3: try: return requests.get(url, timeout=30) except ConnectionError: print(f"Connection refused by server. Retrying in {sec} seconds....") sleep(sec) n_try += 1 sec *= n_try except Exception as err: print(f"Unknown error: {err}. Retrying in {sec} seconds....") sleep(sec) n_try += 1 sec *= n_try
[docs] def post(self, endpoint: Endpoint, sub: str, request: Request = None): ''' Send a POST request to endpoint. :param endpoint: The API endpoint. :type endpoint: Endpoint :param sub: Final part of url string. :type sub: str :param request: An object that inherits from Request. :type request: Request :returns: The HTTP response. :rtype: requests.Response ''' if self.address is NotImplemented: raise NotImplementedError url = f"{self.address}{self._endpoints[endpoint]}{sub}" n_try = 1 sec = 3 while n_try <= 3: try: if request is None: print(f"[POST] {url}") return requests.post(url, timeout=30) print(f"[{type(request).__name__}] {url}") return requests.post(url, json=request.encode(), timeout=30) except ConnectionError: print(f"Connection refused by server. Retrying in {sec} seconds....") sleep(sec) n_try += 1 sec *= n_try except Exception as err: print(f"Unknown error: {err}. Retrying in {sec} seconds....") sleep(sec) n_try += 1 sec *= n_try