From 0a63690e25bc04c763a80e789c23806754bb8963 Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Fri, 3 Jan 2014 16:32:00 -0500 Subject: [PATCH] Add code for saving and displaying the size of images --- data/database.py | 1 + data/model.py | 15 +++++++++++++++ endpoints/api.py | 1 + endpoints/registry.py | 6 ++++++ initdb.py | 3 +++ static/js/app.js | 11 +++++++++++ static/partials/view-repo.html | 5 +++++ 7 files changed, 42 insertions(+) diff --git a/data/database.py b/data/database.py index 6e1784db7..2a46c8204 100644 --- a/data/database.py +++ b/data/database.py @@ -168,6 +168,7 @@ class Image(BaseModel): created = DateTimeField(null=True) comment = TextField(null=True) repository = ForeignKeyField(Repository) + image_size = BigIntegerField(null=True) # '/' separated list of ancestory ids, e.g. /1/2/6/7/10/ ancestors = CharField(index=True, default='/', max_length=64535) diff --git a/data/model.py b/data/model.py index 9182950be..c6fcb0c7a 100644 --- a/data/model.py +++ b/data/model.py @@ -706,6 +706,21 @@ def set_image_checksum(docker_image_id, repository, checksum): return fetched +def set_image_size(docker_image_id, namespace_name, repository_name, image_size): + joined = Image.select().join(Repository) + image_list = list(joined.where(Repository.name == repository_name, + Repository.namespace == namespace_name, + Image.docker_image_id == docker_image_id)) + + if not image_list: + raise DataModelException('No image with specified id and repository') + + fetched = image_list[0] + fetched.image_size = image_size + fetched.save() + return fetched + + def set_image_metadata(docker_image_id, namespace_name, repository_name, created_date_str, comment, parent=None): joined = Image.select().join(Repository) diff --git a/endpoints/api.py b/endpoints/api.py index b954befb1..c145b3296 100644 --- a/endpoints/api.py +++ b/endpoints/api.py @@ -887,6 +887,7 @@ def image_view(image): 'comment': image.comment, 'ancestors': image.ancestors, 'dbid': image.id, + 'size': image.image_size, } diff --git a/endpoints/registry.py b/endpoints/registry.py index b449f7fca..c2eb5334d 100644 --- a/endpoints/registry.py +++ b/endpoints/registry.py @@ -125,7 +125,9 @@ def put_image_layer(namespace, repository, image_id): sr.add_handler(sum_hndlr) store.stream_write(layer_path, sr) csums.append('sha256:{0}'.format(h.hexdigest())) + image_size = None try: + image_size = tmp.tell() tmp.seek(0) csums.append(checksums.compute_tarsum(tmp, json_data)) tmp.close() @@ -148,6 +150,10 @@ def put_image_layer(namespace, repository, image_id): # Checksum is ok, we remove the marker store.remove(mark_path) + # Save the size of the image if we know it. + if image_size is not None: + model.set_image_size(image_id, namespace, repository, image_size) + # The layer is ready for download, send a job to the work queue to # process it. logger.debug('Queing diffs job for image: %s' % image_id) diff --git a/initdb.py b/initdb.py index 5dc75e52f..44537d4cf 100644 --- a/initdb.py +++ b/initdb.py @@ -3,6 +3,7 @@ import string import shutil import os import hashlib +import random from datetime import datetime, timedelta from flask import url_for @@ -55,6 +56,8 @@ def __create_subtree(repo, structure, parent): repo.name, str(creation_time), 'no comment', parent) + model.set_image_size(docker_image_id, repo.namespace, repo.name, random.randrange(1, 1024 * 1024 * 1024)) + # Populate the diff file diff_path = store.image_file_diffs_path(repo.namespace, repo.name, docker_image_id) diff --git a/static/js/app.js b/static/js/app.js index 569bc58bc..990825c70 100644 --- a/static/js/app.js +++ b/static/js/app.js @@ -1025,6 +1025,17 @@ quayApp.directive('dockerAuthDialog', function () { }); +quayApp.filter('bytes', function() { + return function(bytes, precision) { + if (!bytes || isNaN(parseFloat(bytes)) || !isFinite(bytes)) return ''; + if (typeof precision === 'undefined') precision = 1; + var units = ['bytes', 'kB', 'MB', 'GB', 'TB', 'PB'], + number = Math.floor(Math.log(bytes) / Math.log(1024)); + return (bytes / Math.pow(1024, Math.floor(number))).toFixed(precision) + ' ' + units[number]; + } +}); + + quayApp.filter('visibleLogFilter', function () { return function (logs, allowed) { if (!allowed) { diff --git a/static/partials/view-repo.html b/static/partials/view-repo.html index ebc1ea5b2..d54a61aff 100644 --- a/static/partials/view-repo.html +++ b/static/partials/view-repo.html @@ -124,6 +124,11 @@ sudo docker push quay.io/{{repo.namespace}}/{{repo.name}}
Image ID
{{ currentImage.id }}
+
Compressed Image Size
+
{{ currentImage.size | bytes }} +