1import time 2import traceback 3import urllib 4import urllib.parse 5import xmlrpc 6import xmlrpc.client 7 8import lavacli 9 10from .log_follower import fatal_err, print_log 11 12 13def setup_lava_proxy(): 14 config = lavacli.load_config("default") 15 uri, usr, tok = (config.get(key) for key in ("uri", "username", "token")) 16 uri_obj = urllib.parse.urlparse(uri) 17 uri_str = f"{uri_obj.scheme}://{usr}:{tok}@{uri_obj.netloc}{uri_obj.path}" 18 transport = lavacli.RequestsTransport( 19 uri_obj.scheme, 20 config.get("proxy"), 21 config.get("timeout", 120.0), 22 config.get("verify_ssl_cert", True), 23 ) 24 proxy = xmlrpc.client.ServerProxy(uri_str, allow_none=True, transport=transport) 25 26 print_log(f'Proxy for {config["uri"]} created.') 27 28 return proxy 29 30 31def call_proxy(fn, *args): 32 retries = 60 33 for n in range(1, retries + 1): 34 try: 35 return fn(*args) 36 except xmlrpc.client.ProtocolError as err: 37 if n == retries: 38 traceback.print_exc() 39 fatal_err(f"A protocol error occurred (Err {err.errcode} {err.errmsg})") 40 else: 41 time.sleep(15) 42 except xmlrpc.client.Fault as err: 43 traceback.print_exc() 44 fatal_err(f"FATAL: Fault: {err.faultString} (code: {err.faultCode})", err) 45