X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/739b1b9ec3662f988ad09509bcc933ce5c23c4e8..fb8162c7147aea64471ee4a5faf0877f229a198b:/sdk/cwl/arvados_cwl/http.py diff --git a/sdk/cwl/arvados_cwl/http.py b/sdk/cwl/arvados_cwl/http.py index 32fc1cf90d..dcc2a51192 100644 --- a/sdk/cwl/arvados_cwl/http.py +++ b/sdk/cwl/arvados_cwl/http.py @@ -1,3 +1,11 @@ +# Copyright (C) The Arvados Authors. All rights reserved. +# +# SPDX-License-Identifier: Apache-2.0 + +from __future__ import division +from future import standard_library +standard_library.install_aliases() + import requests import email.utils import time @@ -5,19 +13,26 @@ import datetime import re import arvados import arvados.collection -import urlparse +import urllib.parse import logging +import calendar +import urllib.parse logger = logging.getLogger('arvados.cwl-runner') def my_formatdate(dt): - return email.utils.formatdate(timeval=time.mktime(dt.timetuple()), + return email.utils.formatdate(timeval=calendar.timegm(dt.timetuple()), localtime=False, usegmt=True) def my_parsedate(text): - parsed = email.utils.parsedate(text) + parsed = email.utils.parsedate_tz(text) if parsed: - return datetime.datetime(*parsed[:6]) + if parsed[9]: + # Adjust to UTC + return datetime.datetime(*parsed[:6]) + datetime.timedelta(seconds=parsed[9]) + else: + # TZ is zero or missing, assume UTC. + return datetime.datetime(*parsed[:6]) else: return datetime.datetime(1970, 1, 1) @@ -81,13 +96,13 @@ def http_to_keep(api, project_uuid, url, utcnow=datetime.datetime.utcnow): if fresh_cache(url, properties, now): # Do nothing cr = arvados.collection.CollectionReader(item["portable_data_hash"], api_client=api) - return "keep:%s/%s" % (item["portable_data_hash"], cr.keys()[0]) + return "keep:%s/%s" % (item["portable_data_hash"], list(cr.keys())[0]) if not changed(url, properties, now): # ETag didn't change, same content, just update headers api.collections().update(uuid=item["uuid"], body={"collection":{"properties": properties}}).execute() cr = arvados.collection.CollectionReader(item["portable_data_hash"], api_client=api) - return "keep:%s/%s" % (item["portable_data_hash"], cr.keys()[0]) + return "keep:%s/%s" % (item["portable_data_hash"], list(cr.keys())[0]) properties = {} req = requests.get(url, stream=True, allow_redirects=True) @@ -113,28 +128,30 @@ def http_to_keep(api, project_uuid, url, utcnow=datetime.datetime.utcnow): else: name = grp.group(4) else: - name = urlparse.urlparse(url).path.split("/")[-1] + name = urllib.parse.urlparse(url).path.split("/")[-1] count = 0 start = time.time() checkpoint = start - with c.open(name, "w") as f: + with c.open(name, "wb") as f: for chunk in req.iter_content(chunk_size=1024): count += len(chunk) f.write(chunk) loopnow = time.time() if (loopnow - checkpoint) > 20: - bps = (float(count)/float(loopnow - start)) + bps = count / (loopnow - start) if cl is not None: logger.info("%2.1f%% complete, %3.2f MiB/s, %1.0f seconds left", - float(count * 100) / float(cl), - bps/(1024*1024), - (cl-count)/bps) + ((count * 100) / cl), + (bps // (1024*1024)), + ((cl-count) // bps)) else: - logger.info("%d downloaded, %3.2f MiB/s", count, bps/(1024*1024)) + logger.info("%d downloaded, %3.2f MiB/s", count, (bps / (1024*1024))) checkpoint = loopnow - c.save_new(name="Downloaded from %s" % url, owner_uuid=project_uuid, ensure_unique_name=True) + + collectionname = "Downloaded from %s" % urllib.parse.quote(url, safe='') + c.save_new(name=collectionname, owner_uuid=project_uuid, ensure_unique_name=True) api.collections().update(uuid=c.manifest_locator(), body={"collection":{"properties": properties}}).execute()