1*4882a593SmuzhiyunFrom 737e9a7c11233183f48ce6c83d38b504c8ffed12 Mon Sep 17 00:00:00 2001 2*4882a593SmuzhiyunFrom: Hongxu Jia <hongxu.jia@windriver.com> 3*4882a593SmuzhiyunDate: Mon, 30 Jul 2018 15:52:21 +0800 4*4882a593SmuzhiyunSubject: [PATCH] load.py: retry to invoke request with timeout 5*4882a593Smuzhiyun 6*4882a593SmuzhiyunWhile networkless, use request to fetch kickstart file from 7*4882a593Smuzhiyunnetwork, it failed and wait 300s to break, we should retry 8*4882a593Smuzhiyunto invoke request with timeout explicitly. So if it the 9*4882a593Smuzhiyunnetwork is up, the fetch works. 10*4882a593Smuzhiyun 11*4882a593SmuzhiyunUpstream-Status: inappropriate [oe specific] 12*4882a593Smuzhiyun 13*4882a593SmuzhiyunSigned-off-by: Hongxu Jia <hongxu.jia@windriver.com> 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun--- 16*4882a593Smuzhiyun pykickstart/load.py | 31 +++++++++++++++++++++++++++++++ 17*4882a593Smuzhiyun 1 file changed, 31 insertions(+) 18*4882a593Smuzhiyun 19*4882a593Smuzhiyundiff --git a/pykickstart/load.py b/pykickstart/load.py 20*4882a593Smuzhiyunindex f75fe5d3..a8f3ed1d 100644 21*4882a593Smuzhiyun--- a/pykickstart/load.py 22*4882a593Smuzhiyun+++ b/pykickstart/load.py 23*4882a593Smuzhiyun@@ -21,12 +21,16 @@ import requests 24*4882a593Smuzhiyun from requests.auth import HTTPDigestAuth 25*4882a593Smuzhiyun from requests.auth import HTTPBasicAuth 26*4882a593Smuzhiyun 27*4882a593Smuzhiyun+import time 28*4882a593Smuzhiyun import shutil 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun from pykickstart.errors import KickstartError, KickstartAuthError 31*4882a593Smuzhiyun from pykickstart.i18n import _ 32*4882a593Smuzhiyun from requests.exceptions import SSLError, RequestException 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun+import logging 35*4882a593Smuzhiyun+log = logging.getLogger("anaconda.main") 36*4882a593Smuzhiyun+ 37*4882a593Smuzhiyun _is_url = lambda location: '://' in location # RFC 3986 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun SSL_VERIFY = False 40*4882a593Smuzhiyun@@ -72,6 +76,29 @@ def load_to_file(location, destination): 41*4882a593Smuzhiyun _copy_file(location, destination) 42*4882a593Smuzhiyun return destination 43*4882a593Smuzhiyun 44*4882a593Smuzhiyun+def _access_url(location): 45*4882a593Smuzhiyun+ status = False 46*4882a593Smuzhiyun+ 47*4882a593Smuzhiyun+ # Retry 45 times, wait 45s~135s 48*4882a593Smuzhiyun+ i = 0 49*4882a593Smuzhiyun+ while i < 45: 50*4882a593Smuzhiyun+ 51*4882a593Smuzhiyun+ try: 52*4882a593Smuzhiyun+ request = requests.get(location, verify=SSL_VERIFY, timeout=2) 53*4882a593Smuzhiyun+ except RequestException as e: 54*4882a593Smuzhiyun+ log.info("Try '%s' %d times, %s" % (location, i, str(e))) 55*4882a593Smuzhiyun+ status = False 56*4882a593Smuzhiyun+ i += 1 57*4882a593Smuzhiyun+ time.sleep(1) 58*4882a593Smuzhiyun+ continue 59*4882a593Smuzhiyun+ 60*4882a593Smuzhiyun+ else: 61*4882a593Smuzhiyun+ status = True 62*4882a593Smuzhiyun+ return status 63*4882a593Smuzhiyun+ 64*4882a593Smuzhiyun+ return status 65*4882a593Smuzhiyun+ 66*4882a593Smuzhiyun+ 67*4882a593Smuzhiyun def _get_auth(location, user=None, passwd=None): 68*4882a593Smuzhiyun 69*4882a593Smuzhiyun auth = None 70*4882a593Smuzhiyun@@ -93,6 +120,10 @@ def _get_auth(location, user=None, passwd=None): 71*4882a593Smuzhiyun 72*4882a593Smuzhiyun def _load_url(location, user=None, passwd=None): 73*4882a593Smuzhiyun '''Load a location (URL or filename) and return contents as string''' 74*4882a593Smuzhiyun+ 75*4882a593Smuzhiyun+ if not _access_url(location): 76*4882a593Smuzhiyun+ raise KickstartError(_("Connection %s failed" % location)) 77*4882a593Smuzhiyun+ 78*4882a593Smuzhiyun auth = _get_auth(location, user=user, passwd=passwd) 79*4882a593Smuzhiyun try: 80*4882a593Smuzhiyun request = requests.get(location, verify=SSL_VERIFY, auth=auth) 81