X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/44242bfe2c86302c65650cf7fe3a7187223c6304..51e79a3be745cfd37efc49471ae21a1d54662e7f:/sdk/python/arvados/commands/keepdocker.py diff --git a/sdk/python/arvados/commands/keepdocker.py b/sdk/python/arvados/commands/keepdocker.py index c091374710..933fd77dd7 100644 --- a/sdk/python/arvados/commands/keepdocker.py +++ b/sdk/python/arvados/commands/keepdocker.py @@ -9,6 +9,7 @@ import subprocess import sys import tarfile import tempfile +import _strptime from collections import namedtuple from stat import * @@ -116,7 +117,8 @@ def stat_cache_name(image_file): return getattr(image_file, 'name', image_file) + '.stat' def pull_image(image_name, image_tag): - check_docker(popen_docker(['pull', '-t', image_tag, image_name]), "pull") + check_docker(popen_docker(['pull', '{}:{}'.format(image_name, image_tag)]), + "pull") def save_image(image_hash, image_file): # Save the specified Docker image to image_file, then try to save its @@ -163,9 +165,25 @@ def ptimestamp(t): t = s[0] + s[1][-1:] return datetime.datetime.strptime(t, "%Y-%m-%dT%H:%M:%SZ") -def list_images_in_arv(api_client, num_retries): +def list_images_in_arv(api_client, num_retries, image_name=None, image_tag=None): + """List all Docker images known to the api_client with image_name and + image_tag. If no image_name is given, defaults to listing all + Docker images. + + Returns a list of tuples representing matching Docker images, + sorted in preference order (i.e. the first collection in the list + is the one that the API server would use). Each tuple is a + (collection_uuid, collection_info) pair, where collection_info is + a dict with fields "dockerhash", "repo", "tag", and "timestamp". + + """ + docker_image_filters = [['link_class', 'in', ['docker_image_hash', 'docker_image_repo+tag']]] + if image_name: + image_link_name = "{}:{}".format(image_name, image_tag or 'latest') + docker_image_filters.append(['name', '=', image_link_name]) + existing_links = api_client.links().list( - filters=[['link_class', 'in', ['docker_image_hash', 'docker_image_repo+tag']]] + filters=docker_image_filters ).execute(num_retries=num_retries)['items'] images = {} for link in existing_links: @@ -190,19 +208,18 @@ def list_images_in_arv(api_client, num_retries): else: images[collection_uuid]["timestamp"] = ptimestamp(link["created_at"]) - st = sorted(images.items(), lambda a, b: cmp(b[1]["timestamp"], a[1]["timestamp"])) + return sorted(images.items(), lambda a, b: cmp(b[1]["timestamp"], a[1]["timestamp"])) - fmt = "{:30} {:10} {:12} {:29} {:20}" - print fmt.format("REPOSITORY", "TAG", "IMAGE ID", "COLLECTION", "CREATED") - for i, j in st: - print(fmt.format(j["repo"], j["tag"], j["dockerhash"][0:12], i, j["timestamp"].strftime("%c"))) def main(arguments=None): args = arg_parser.parse_args(arguments) api = arvados.api('v1') if args.image is None or args.image == 'images': - list_images_in_arv(api, args.retries) + fmt = "{:30} {:10} {:12} {:29} {:20}" + print fmt.format("REPOSITORY", "TAG", "IMAGE ID", "COLLECTION", "CREATED") + for i, j in list_images_in_arv(api, args.retries): + print(fmt.format(j["repo"], j["tag"], j["dockerhash"][0:12], i, j["timestamp"].strftime("%c"))) sys.exit(0) # Pull the image if requested, unless the image is specified as a hash