Minimize the queries used when retrieve builds. Previously, we'd call out to SQL extra times per build.

This commit is contained in:
Joseph Schorr 2015-05-07 21:11:15 -04:00
parent e99ae67e58
commit 3627de103c
5 changed files with 34 additions and 17 deletions

View file

@ -2291,10 +2291,12 @@ def load_token_data(code):
def _get_build_base_query():
return (RepositoryBuild
.select(RepositoryBuild, RepositoryBuildTrigger, BuildTriggerService, Repository,
Namespace)
Namespace, User)
.join(Repository)
.join(Namespace, on=(Repository.namespace_user == Namespace.id))
.switch(RepositoryBuild)
.join(User, JOIN_LEFT_OUTER)
.switch(RepositoryBuild)
.join(RepositoryBuildTrigger, JOIN_LEFT_OUTER)
.join(BuildTriggerService, JOIN_LEFT_OUTER)
.order_by(RepositoryBuild.started.desc()))

View file

@ -45,7 +45,7 @@ def user_view(user):
'is_robot': user.robot,
}
def trigger_view(trigger, can_read=False, can_admin=False):
def trigger_view(trigger, can_read=False, can_admin=False, for_build=False):
if trigger and trigger.uuid:
build_trigger = BuildTriggerHandler.get_handler(trigger)
build_source = build_trigger.config.get('build_source')
@ -55,17 +55,28 @@ def trigger_view(trigger, can_read=False, can_admin=False):
if can_admin:
can_read = True
return {
'service': trigger.service.name,
'build_source': build_source if can_read else None,
'config': build_trigger.config if can_admin else {},
is_connected_user = False
if (can_admin and get_authenticated_user() and
trigger.connected_user_id == get_authenticated_user().id):
is_connected_user = True
trigger_data = {
'id': trigger.uuid,
'connected_user': trigger.connected_user.username,
'service': trigger.service.name,
'is_active': build_trigger.is_active(),
'pull_robot': user_view(trigger.pull_robot) if trigger.pull_robot else None,
'build_source': build_source if can_read else None,
'repository_url': repo_url if can_read else None,
'config': build_trigger.config if can_admin else {},
'is_connected_user': is_connected_user,
}
if not for_build and can_admin and trigger.pull_robot:
trigger_data['pull_robot'] = user_view(trigger.pull_robot)
return trigger_data
return None
@ -111,7 +122,7 @@ def build_status_view(build_obj):
'tags': job_config.get('docker_tags', []),
'manual_user': job_config.get('manual_user', None),
'is_writer': can_write,
'trigger': trigger_view(build_obj.trigger, can_read, can_admin),
'trigger': trigger_view(build_obj.trigger, can_read, can_admin, for_build=True),
'trigger_metadata': job_config.get('trigger_metadata', None) if can_read else None,
'resource_key': build_obj.resource_key,
'pull_robot': user_view(build_obj.pull_robot) if build_obj.pull_robot else None,

View file

@ -146,7 +146,7 @@
<i class="fa fa-unlock-alt"></i> View Credentials
</span>
<span class="cor-option" option-click="askRunTrigger(trigger)"
ng-class="trigger.connected_user == user.username ? '' : 'disabled'">
ng-class="trigger.is_connected_user ? '' : 'disabled'">
<i class="fa fa-chevron-right"></i> Run Trigger Now
</span>
<span class="cor-option" option-click="askDeleteTrigger(trigger)">

View file

@ -197,9 +197,9 @@ angular.module('quay').directive('repoPanelBuilds', function () {
};
$scope.askRunTrigger = function(trigger) {
if ($scope.user.username != trigger.connected_user) {
bootbox.alert('For security reasons, only user "' + trigger.connected_user +
'" can manually invoke this trigger');
if (!trigger.is_connected_user) {
bootbox.alert('For security reasons, only the user that created this trigger can ' +
'manually invoke this trigger');
return;
}

View file

@ -6,6 +6,8 @@ import json as py_json
from urllib import urlencode
from urlparse import urlparse, urlunparse, parse_qs
from playhouse.test_utils import assert_query_count
from endpoints.api import api_bp, api
from endpoints.building import PreparedBuild
from endpoints.webhooks import webhooks
@ -1544,6 +1546,7 @@ class TestRepoBuilds(ApiTestCase):
def test_getrepo_nobuilds(self):
self.login(ADMIN_ACCESS_USER)
with assert_query_count(4):
json = self.getJsonResponse(RepositoryBuildList,
params=dict(repository=ADMIN_ACCESS_USER + '/simple'))
@ -1552,6 +1555,7 @@ class TestRepoBuilds(ApiTestCase):
def test_getrepobuilds(self):
self.login(ADMIN_ACCESS_USER)
with assert_query_count(4):
json = self.getJsonResponse(RepositoryBuildList,
params=dict(repository=ADMIN_ACCESS_USER + '/building'))