Merge pull request #2688 from coreos-inc/build-badge-query

Remove expensive call in build badge
This commit is contained in:
josephschorr 2017-06-12 15:06:13 -04:00 committed by GitHub
commit b269cb84a3
3 changed files with 20 additions and 5 deletions

View file

@ -620,3 +620,14 @@ def list_popular_public_repos(action_count_threshold, time_span, repo_kind='imag
.group_by(RepositoryActionCount.repository, Repository.name, Namespace.username)
.having(fn.Sum(RepositoryActionCount.count) >= action_count_threshold)
.tuples())
def is_empty(namespace_name, repository_name):
""" Returns if the repository referenced by the given namespace and name is empty. If the repo
doesn't exist, returns True.
"""
try:
tag.list_repository_tags(namespace_name, repository_name).limit(1).get()
return False
except RepositoryTag.DoesNotExist:
return True

View file

@ -2,7 +2,7 @@ import pytest
from peewee import IntegrityError
from data.model.repository import create_repository, purge_repository
from data.model.repository import create_repository, purge_repository, is_empty
from test.fixtures import *
def test_duplicate_repository_different_kinds(initialized_db):
@ -12,3 +12,10 @@ def test_duplicate_repository_different_kinds(initialized_db):
# Try to create an app repo with the same name, which should fail.
with pytest.raises(IntegrityError):
create_repository('devtable', 'somenewrepo', None, repo_kind='application')
def test_is_empty(initialized_db):
create_repository('devtable', 'somenewrepo', None, repo_kind='image')
assert is_empty('devtable', 'somenewrepo')
assert not is_empty('devtable', 'simple')

View file

@ -479,11 +479,8 @@ def build_status_badge(namespace_name, repo_name):
if not repo or token != repo.badge_token:
abort(404)
# Lookup the tags for the repository.
tags = model.tag.list_repository_tags(namespace_name, repo_name)
is_empty = len(list(tags)) == 0
is_empty = model.repository.is_empty(namespace_name, repo_name)
recent_build = model.build.get_recent_repository_build(namespace_name, repo_name)
if not is_empty and (not recent_build or recent_build.phase == 'complete'):
status_name = 'ready'
elif recent_build and recent_build.phase == 'error':