blob: 6ed15ab09c5a713693164d45fb5292bc4a220793 [file] [log] [blame]
From ffe06c6dd812b604d6482e4353d5564fad78bc90 Mon Sep 17 00:00:00 2001
From: Hongxu Jia <hongxu.jia@windriver.com>
Date: Mon, 30 Jul 2018 15:52:21 +0800
Subject: [PATCH 4/4] load.py: retry to invoke request with timeout
While networkless, use request to fetch kickstart file from
network, it failed and wait 300s to break, we should retry
to invoke request with timeout explicitly. So if it the
network is up, the fetch works.
Upstream-Status: inappropriate [oe specific]
Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com>
---
pykickstart/load.py | 31 +++++++++++++++++++++++++++++++
1 file changed, 31 insertions(+)
diff --git a/pykickstart/load.py b/pykickstart/load.py
index ad3bad1..a5cbbc5 100644
--- a/pykickstart/load.py
+++ b/pykickstart/load.py
@@ -21,6 +21,7 @@ import requests
from requests.auth import HTTPDigestAuth
from requests.auth import HTTPBasicAuth
+import time
import shutil
import six
@@ -28,6 +29,9 @@ from pykickstart.errors import KickstartError, KickstartAuthError
from pykickstart.i18n import _
from requests.exceptions import SSLError, RequestException
+import logging
+log = logging.getLogger("anaconda.main")
+
_is_url = lambda location: '://' in location # RFC 3986
SSL_VERIFY = False
@@ -73,6 +77,29 @@ def load_to_file(location, destination):
_copy_file(location, destination)
return destination
+def _access_url(location):
+ status = False
+
+ # Retry 45 times, wait 45s~135s
+ i = 0
+ while i < 45:
+
+ try:
+ request = requests.get(location, verify=SSL_VERIFY, timeout=2)
+ except RequestException as e:
+ log.info("Try '%s' %d times, %s" % (location, i, str(e)))
+ status = False
+ i += 1
+ time.sleep(1)
+ continue
+
+ else:
+ status = True
+ return status
+
+ return status
+
+
def _get_auth(location, user=None, passwd=None):
auth = None
@@ -94,6 +121,10 @@ def _get_auth(location, user=None, passwd=None):
def _load_url(location, user=None, passwd=None):
'''Load a location (URL or filename) and return contents as string'''
+
+ if not _access_url(location):
+ raise KickstartError(_("Connection %s failed" % location))
+
auth = _get_auth(location, user=user, passwd=passwd)
try:
request = requests.get(location, verify=SSL_VERIFY, auth=auth)
--
2.7.4