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