Source code for sirepo.agent_supervisor_api
"""Utilities for agent to supervisor api requests
For example, sim_db_file and global_resources.
:copyright: Copyright (c) 2023 RadiaSoft LLC. All Rights Reserved.
:license: http://www.apache.org/licenses/LICENSE-2.0.html
"""
from pykern.pkcollections import PKDict
from pykern.pkdebug import pkdlog, pkdp, pkdexc
import requests
import sirepo.http_util
import sirepo.job
import sirepo.tornado
import sirepo.util
[docs]
class ReqBase(sirepo.tornado.AuthHeaderRequestHandler):
[docs]
@classmethod
def token_for_user(cls, uid):
def _token():
for _ in range(10):
t = sirepo.util.unique_key()
if t not in cls._TOKEN_TO_UID:
cls._TOKEN_TO_UID[t] = uid
return t
raise AssertionError("should not happen: too many token collisions")
return cls._UID_TO_TOKEN.pksetdefault(uid, _token)[uid]
[docs]
def write_error(self, status_code, *args, **kwargs):
if status_code >= 500 and (e := kwargs.get("exc_info")):
pkdlog("exception={} stack={}", e[1], pkdexc(e))
super().write_error(status_code, *args, **kwargs)
def _sr_authenticate(self, token, *args, **kwargs):
u = self._TOKEN_TO_UID.get(token)
if not u:
pkdlog("token={} not found", token)
raise sirepo.tornado.error_forbidden()
return u
[docs]
def request(method, uri, token, data=None, json=None):
_check_size(method, data)
return requests.request(
method,
uri,
json=json,
data=data,
verify=sirepo.job.cfg().verify_tls,
headers=sirepo.tornado.AuthHeaderRequestHandler.get_header(token),
)
def _check_size(method, data):
m = sirepo.job.cfg().max_message_bytes
if data and len(data) > m:
raise sirepo.util.ContentTooLarge(
f"len(data)={len(data)} > max_size={m} for method={method}"
)