X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/b1160af572bfcaeb6f0c1bab5b08987312a92814..64eadab02f0ffd58b3b6c66c463b91abe07ecc07:/sdk/python/arvados/commands/keepdocker.py diff --git a/sdk/python/arvados/commands/keepdocker.py b/sdk/python/arvados/commands/keepdocker.py index 16fefdb2fa..d4fecc47b4 100644 --- a/sdk/python/arvados/commands/keepdocker.py +++ b/sdk/python/arvados/commands/keepdocker.py @@ -10,17 +10,20 @@ import errno import json import os import re -import subprocess import sys import tarfile import tempfile import shutil import _strptime import fcntl - from operator import itemgetter from stat import * +if os.name == "posix" and sys.version_info[0] < 3: + import subprocess32 as subprocess +else: + import subprocess + import arvados import arvados.util import arvados.commands._util as arv_cmd @@ -61,13 +64,6 @@ _group.add_argument( '--no-pull', action='store_false', dest='pull', help="Use locally installed image only, don't pull image from Docker registry (default)") -keepdocker_parser.add_argument( - 'image', nargs='?', - help="Docker image to upload: repo, repo:tag, or hash") -keepdocker_parser.add_argument( - 'tag', nargs='?', - help="Tag of the Docker image to upload (default 'latest'), if image is given as an untagged repo name") - # Combine keepdocker options listed above with run_opts options of arv-put. # The options inherited from arv-put include --name, --project-uuid, # --progress/--no-progress/--batch-progress and --resume/--no-resume. @@ -75,6 +71,13 @@ arg_parser = argparse.ArgumentParser( description="Upload or list Docker images in Arvados", parents=[keepdocker_parser, arv_put.run_opts, arv_cmd.retry_opt]) +arg_parser.add_argument( + 'image', nargs='?', + help="Docker image to upload: repo, repo:tag, or hash") +arg_parser.add_argument( + 'tag', nargs='?', + help="Tag of the Docker image to upload (default 'latest'), if image is given as an untagged repo name") + class DockerError(Exception): pass @@ -133,6 +136,7 @@ def docker_images(): next(list_output) # Ignore the header line for line in list_output: words = line.split() + words = [word.decode() for word in words] size_index = len(words) - 2 repo, tag, imageid = words[:3] ctime = ' '.join(words[3:size_index]) @@ -226,12 +230,15 @@ def docker_link_sort_key(link): Docker metadata links to sort them from least to most preferred. """ try: - image_timestamp = ciso8601.parse_datetime_unaware( + image_timestamp = ciso8601.parse_datetime_as_naive( link['properties']['image_timestamp']) except (KeyError, ValueError): image_timestamp = EARLIEST_DATETIME - return (image_timestamp, - ciso8601.parse_datetime_unaware(link['created_at'])) + try: + created_timestamp = ciso8601.parse_datetime_as_naive(link['created_at']) + except ValueError: + created_timestamp = None + return (image_timestamp, created_timestamp) def _get_docker_links(api_client, num_retries, **kwargs): links = arvados.util.list_all(api_client.links().list, @@ -345,9 +352,10 @@ def _uuid2pdh(api, uuid): select=['portable_data_hash'], ).execute()['items'][0]['portable_data_hash'] -def main(arguments=None, stdout=sys.stdout, install_sig_handlers=True): +def main(arguments=None, stdout=sys.stdout, install_sig_handlers=True, api=None): args = arg_parser.parse_args(arguments) - api = arvados.api('v1') + if api is None: + api = arvados.api('v1') if args.image is None or args.image == 'images': fmt = "{:30} {:10} {:12} {:29} {:20}\n" @@ -484,6 +492,9 @@ def main(arguments=None, stdout=sys.stdout, install_sig_handlers=True): # Call arv-put with switches we inherited from it # (a.k.a., switches that aren't our own). + if arguments is None: + arguments = sys.argv[1:] + arguments = [i for i in arguments if i not in (args.image, args.tag, image_repo_tag)] put_args = keepdocker_parser.parse_known_args(arguments)[1] if args.name is None: @@ -502,7 +513,7 @@ def main(arguments=None, stdout=sys.stdout, install_sig_handlers=True): else: json_filename = raw_image_hash + '/json' json_file = image_tar.extractfile(image_tar.getmember(json_filename)) - image_metadata = json.load(json_file) + image_metadata = json.loads(json_file.read().decode()) json_file.close() image_tar.close() link_base = {'head_uuid': coll_uuid, 'properties': {}}