Add offline support using Task.set_offline() and Task.import_offline_session()

This commit is contained in:
allegroai
2020-07-30 15:03:22 +03:00
parent 2ec5726812
commit a8d6380696
15 changed files with 427 additions and 78 deletions

View File

@@ -31,7 +31,7 @@ class ApiServiceProxy(object):
]]
# get the most advanced service version that supports our api
version = [str(v) for v in ApiServiceProxy._available_versions if Version(Session.api_version) >= v][-1]
version = [str(v) for v in ApiServiceProxy._available_versions if Session.check_min_api_version(v)][-1]
self.__dict__["__wrapped_version__"] = Session.api_version
name = ".v{}.{}".format(
version.replace(".", "_"), self.__dict__.get("__wrapped_name__")

View File

@@ -8,3 +8,4 @@ ENV_ACCESS_KEY = EnvEntry("TRAINS_API_ACCESS_KEY", "ALG_API_ACCESS_KEY")
ENV_SECRET_KEY = EnvEntry("TRAINS_API_SECRET_KEY", "ALG_API_SECRET_KEY")
ENV_VERBOSE = EnvEntry("TRAINS_API_VERBOSE", "ALG_API_VERBOSE", type=bool, default=False)
ENV_HOST_VERIFY_CERT = EnvEntry("TRAINS_API_HOST_VERIFY_CERT", "ALG_API_HOST_VERIFY_CERT", type=bool, default=True)
ENV_OFFLINE_MODE = EnvEntry("TRAINS_OFFLINE_MODE", "ALG_OFFLINE_MODE", type=bool)

View File

@@ -11,7 +11,8 @@ from requests.auth import HTTPBasicAuth
from six.moves.urllib.parse import urlparse, urlunparse
from .callresult import CallResult
from .defs import ENV_VERBOSE, ENV_HOST, ENV_ACCESS_KEY, ENV_SECRET_KEY, ENV_WEB_HOST, ENV_FILES_HOST
from .defs import ENV_VERBOSE, ENV_HOST, ENV_ACCESS_KEY, ENV_SECRET_KEY, ENV_WEB_HOST, \
ENV_FILES_HOST, ENV_OFFLINE_MODE
from .request import Request, BatchRequest # noqa: F401
from .token_manager import TokenManager
from ..config import load
@@ -50,6 +51,8 @@ class Session(TokenManager):
_write_session_timeout = (300.0, 300.)
_sessions_created = 0
_ssl_error_count_verbosity = 2
_offline_mode = ENV_OFFLINE_MODE.get()
_offline_default_version = '2.5'
_client = [(__package__.partition(".")[0], __version__)]
@@ -153,6 +156,9 @@ class Session(TokenManager):
self.client = ", ".join("{}-{}".format(*x) for x in self._client)
if self._offline_mode:
return
self.refresh_token()
# update api version from server response
@@ -197,6 +203,9 @@ class Session(TokenManager):
server-side permissions have changed but are not reflected in the current token. Refreshing the token will
generate a token with the updated permissions.
"""
if self._offline_mode:
return None
host = self.host
headers = headers.copy() if headers else {}
headers[self._WORKER_HEADER] = self.worker
@@ -406,6 +415,9 @@ class Session(TokenManager):
"""
self.validate_request(req_obj)
if self._offline_mode:
return None
if isinstance(req_obj, BatchRequest):
# TODO: support async for batch requests as well
if async_enable:
@@ -526,11 +538,14 @@ class Session(TokenManager):
# If no session was created, create a default one, in order to get the backend api version.
if cls._sessions_created <= 0:
# noinspection PyBroadException
try:
cls()
except Exception:
pass
if cls._offline_mode:
cls.api_version = cls._offline_default_version
else:
# noinspection PyBroadException
try:
cls()
except Exception:
pass
return version_tuple(cls.api_version) >= version_tuple(str(min_api_version))