-
-
Save jlgeering/e98490f384f8e69650551236c5359fd9 to your computer and use it in GitHub Desktop.
Prints statistics per project in gitlab registry (usefull for debugging purposes)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python2.7 | |
import os | |
import json | |
import argparse | |
import math | |
def convert_size(size_bytes): | |
if (size_bytes == 0): | |
return '0B' | |
size_name = ("B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB") | |
i = int(math.floor(math.log(size_bytes, 1024))) | |
p = math.pow(1024, i) | |
s = round(size_bytes/p, 2) | |
return '%s %s' % (s, size_name[i]) | |
def listProjects(BASE_DIR): | |
projects = [] | |
for group in os.listdir("%s/repositories" % BASE_DIR): | |
for project in os.listdir("%s/repositories/%s" % (BASE_DIR, group)): | |
projects.append("%s/%s" % (group, project)) | |
return projects | |
def listProjectRevisions(BASE_DIR, project): | |
return os.listdir("%s/repositories/%s/_manifests/revisions/sha256/" % (BASE_DIR, project)) | |
def listProjectTags(BASE_DIR, project): | |
tags = [] | |
for tag in os.listdir("%s/repositories/%s/_manifests/tags" % (BASE_DIR, project)): | |
tagData = { 'name' : tag, 'revs' : [], 'current' : '' } | |
for rev in os.listdir("%s/repositories/%s/_manifests/tags/%s/index/sha256" % (BASE_DIR, project, tag)): | |
tagData['revs'].append(rev) | |
with open("%s/repositories/%s/_manifests/tags/%s/current/link" % (BASE_DIR, project, tag), 'r') as cur: | |
tagData['current'] = cur.read().split(':')[1] | |
tags.append(tagData) | |
return tags | |
def getRevisionSize(BASE_DIR, revision): | |
if not os.path.isfile("%s/blobs/sha256/%s/%s/data" % (BASE_DIR, revision[:2], revision)): | |
return 0 | |
with open("%s/blobs/sha256/%s/%s/data" % (BASE_DIR, revision[:2], revision), 'r') as cur: | |
revData = json.load(cur) | |
size = 0 | |
for l in revData['layers']: | |
size += l['size'] | |
size += revData['config']['size'] | |
return size | |
BASE_DIR = '/var/opt/gitlab/gitlab-rails/shared/registry/docker/registry/v2' | |
print "Existing projects:" | |
for proj in listProjects(BASE_DIR): | |
revs = listProjectRevisions(BASE_DIR, proj) | |
tags = listProjectTags(BASE_DIR, proj) | |
currentRevs = map(lambda x: x['current'], tags) | |
orphanedRevs = filter(lambda x: x not in currentRevs, revs) | |
totalSize = 0 | |
orphanedTotalSize = 0 | |
for rev in revs: | |
revSize = getRevisionSize(BASE_DIR, rev) | |
totalSize += revSize | |
orphanedTotalSize += revSize if rev not in currentRevs else 0 | |
print ">> %40s (%4d revisions, %3d orphaned revisions, %4d tags, %s total size, %s orphans size)" % ( | |
proj, | |
len(revs), len(orphanedRevs), | |
len(tags), | |
convert_size(totalSize), convert_size(orphanedTotalSize)) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment