Skip to content

Instantly share code, notes, and snippets.

@je2ryw
Forked from pbabics/gitlab-registry-stats.py
Created March 21, 2017 02:32
Show Gist options
  • Select an option

  • Save je2ryw/eeaa0c8bf367ea730d30ad36b1bf0511 to your computer and use it in GitHub Desktop.

Select an option

Save je2ryw/eeaa0c8bf367ea730d30ad36b1bf0511 to your computer and use it in GitHub Desktop.

Revisions

  1. @pbabics pbabics created this gist Jan 27, 2017.
    70 changes: 70 additions & 0 deletions gitlab-registry-stats.py
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,70 @@
    #!/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/repositories'

    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 (%d revisions, %-3d orphaned revisions, %-2d tags, %s total size, %s orphans size)" % (
    proj,
    len(revs), len(orphanedRevs),
    len(tags),
    convert_size(totalSize), convert_size(orphanedTotalSize))