summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorOmar Padron <omar.padron@kitware.com>2019-11-03 20:11:30 -0500
committerTodd Gamblin <tgamblin@llnl.gov>2019-11-03 17:11:30 -0800
commit0784ec1a6dfd8af980d63f319d5988701340888a (patch)
tree193b39f77db44f7605cbf92d81496ede56a28898 /lib
parentbcda14f8258daaf3475dd9d3ca3eb7b25aa0496c (diff)
downloadspack-0784ec1a6dfd8af980d63f319d5988701340888a.tar.gz
spack-0784ec1a6dfd8af980d63f319d5988701340888a.tar.bz2
spack-0784ec1a6dfd8af980d63f319d5988701340888a.tar.xz
spack-0784ec1a6dfd8af980d63f319d5988701340888a.zip
bugfix: fetch prefers to fetch local mirrors over remote resources (#13545)
- [x] insert at beginning of list so fetch grabs local mirrors before remote resources - [x] update the S3FetchStrategy so that it throws a SpackError if the fetch fails. Before, it was throwing URLError, which was not being caught in stage.py. - [x] move error handling out of S3FetchStrategy and into web_util.read_from_url() - [x] pass string instead of URLError to SpackWebError
Diffstat (limited to 'lib')
-rw-r--r--lib/spack/spack/fetch_strategy.py4
-rw-r--r--lib/spack/spack/stage.py8
-rw-r--r--lib/spack/spack/util/web.py7
3 files changed, 11 insertions, 8 deletions
diff --git a/lib/spack/spack/fetch_strategy.py b/lib/spack/spack/fetch_strategy.py
index 370ccef593..409cc334ee 100644
--- a/lib/spack/spack/fetch_strategy.py
+++ b/lib/spack/spack/fetch_strategy.py
@@ -1129,7 +1129,7 @@ class S3FetchStrategy(URLFetchStrategy):
parsed_url = url_util.parse(self.url)
if parsed_url.scheme != 's3':
- raise ValueError(
+ raise FetchError(
'S3FetchStrategy can only fetch from s3:// urls.')
tty.msg("Fetching %s" % self.url)
@@ -1395,7 +1395,7 @@ class NoCacheError(FetchError):
class FailedDownloadError(FetchError):
- """Raised wen a download fails."""
+ """Raised when a download fails."""
def __init__(self, url, msg=""):
super(FailedDownloadError, self).__init__(
"Failed to fetch file from URL: %s" % url, msg)
diff --git a/lib/spack/spack/stage.py b/lib/spack/spack/stage.py
index 7869c5f863..d2dd3e6e7a 100644
--- a/lib/spack/spack/stage.py
+++ b/lib/spack/spack/stage.py
@@ -433,11 +433,9 @@ class Stage(object):
# Add URL strategies for all the mirrors with the digest
for url in urls:
- fetchers.append(fs.from_url_scheme(
- url, digest, expand=expand, extension=extension))
- # fetchers.insert(
- # 0, fs.URLFetchStrategy(
- # url, digest, expand=expand, extension=extension))
+ fetchers.insert(
+ 0, fs.from_url_scheme(
+ url, digest, expand=expand, extension=extension))
if self.default_fetcher.cachable:
for rel_path in reversed(list(self.mirror_paths)):
diff --git a/lib/spack/spack/util/web.py b/lib/spack/spack/util/web.py
index f2afe769c6..1fe58d6415 100644
--- a/lib/spack/spack/util/web.py
+++ b/lib/spack/spack/util/web.py
@@ -177,7 +177,12 @@ def read_from_url(url, accept_content_type=None):
# Do the real GET request when we know it's just HTML.
req.get_method = lambda: "GET"
- response = _urlopen(req, timeout=_timeout, context=context)
+
+ try:
+ response = _urlopen(req, timeout=_timeout, context=context)
+ except URLError as err:
+ raise SpackWebError('Download failed: {ERROR}'.format(
+ ERROR=str(err)))
if accept_content_type and not is_web_url:
content_type = response.headers.get('Content-type')