The catalyst-action-rest branch from shlevy/hydra was an exploration of
using Catalyst::Action::REST to create a JSON API for hydra. This commit
merges in the best bits from that experiment, with the goal that further
API endpoints can be added incrementally.
In addition to migrating more endpoints, there is potential for
improvement in what's already been done:
* The web interface can be updated to use the same non-GET endpoints as
the JSON interface (using x-tunneled-method) instead of having a
separate endpoint
* The web rendering should use the $c->stash->{resource} data structure
where applicable rather than putting the same data in two places in
the stash
* Which columns to render for each endpoint is a completely debatable
question
* Hydra::Component::ToJSON should turn has_many relations that have
strings as their primary keys into objects instead of arrays
Fixes NixOS/hydra#98
Signed-off-by: Shea Levy <shea@shealevy.com>
207 lines
8.6 KiB
Plaintext
207 lines
8.6 KiB
Plaintext
[% BLOCK menuItem %]
|
|
<li class="[% IF "${root}${curUri}" == uri %]active[% END %]" [% IF confirmmsg %]onclick="javascript:return confirm('[% confirmmsg %]')"[% END %]>
|
|
<a href="[% uri %]">[% title %]</a>
|
|
</li>
|
|
[% END %]
|
|
|
|
[% BLOCK makeSubMenu %]
|
|
<li class="dropdown">
|
|
<a class="dropdown-toggle" href="#" data-toggle="dropdown">[% title %]<b class="caret"></b></a>
|
|
<ul id="left-menu" class="dropdown-menu">
|
|
[% content %]
|
|
</ul>
|
|
</li>
|
|
[% END %]
|
|
|
|
<ul class="nav pull-left" id="top-menu">
|
|
|
|
[% WRAPPER makeSubMenu title="Status" %]
|
|
[% INCLUDE menuItem
|
|
uri = c.uri_for(c.controller('Root').action_for('queue'))
|
|
title = "Queue ("_ nrRunningBuilds _"/"_ nrQueuedBuilds _")" %]
|
|
[% INCLUDE menuItem
|
|
uri = c.uri_for(c.controller('Root').action_for('status'))
|
|
title = "Active build steps" %]
|
|
[% INCLUDE menuItem
|
|
uri = c.uri_for(c.controller('Root').action_for('machines'))
|
|
title = "Machine status" %]
|
|
[% INCLUDE menuItem
|
|
uri = c.uri_for(c.controller('Root').action_for('evals'))
|
|
title = "Latest evaluations" %]
|
|
[% INCLUDE menuItem
|
|
uri = c.uri_for(c.controller('Root').action_for('all'))
|
|
title = "Latest builds" %]
|
|
[% END %]
|
|
|
|
[% IF project %]
|
|
[% WRAPPER makeSubMenu title="Project" %]
|
|
<li class="nav-header">[% HTML.escape(project.name) %]</li>
|
|
<li class="divider"></li>
|
|
[% INCLUDE menuItem uri = c.uri_for(c.controller('Project').action_for('project'), [project.name]) title = "Overview" %]
|
|
[% INCLUDE menuItem uri = c.uri_for(c.controller('Project').action_for('all'), [project.name]) title = "Latest builds" %]
|
|
[% INCLUDE menuItem uri = c.uri_for(c.controller('Project').action_for('jobstatus'), [project.name]) title = "Job status" %]
|
|
[% INCLUDE menuItem uri = c.uri_for(c.controller('Project').action_for('errors'), [project.name]) title = "Errors" %]
|
|
<li class="divider"></li>
|
|
[% INCLUDE menuItem uri = c.uri_for('/project' project.name 'channel' 'latest') title = "Channel" %]
|
|
[% IF c.user_exists %]
|
|
<li class="divider"></li>
|
|
[% INCLUDE menuItem uri = c.uri_for('/project' project.name 'edit') title="Edit" %]
|
|
[% INCLUDE menuItem uri = c.uri_for(c.controller('Project').action_for('create_jobset'), [project.name]) title = "Create jobset" %]
|
|
[% END %]
|
|
[% END %]
|
|
[% END %]
|
|
|
|
[% IF jobset %]
|
|
[% WRAPPER makeSubMenu title="Jobset" %]
|
|
<li class="nav-header">[% HTML.escape(jobset.name) %]</li>
|
|
<li class="divider"></li>
|
|
[% INCLUDE menuItem
|
|
uri = c.uri_for(c.controller('Jobset').action_for('jobset'), [project.name, jobset.name])
|
|
title = "Overview" %]
|
|
[% INCLUDE menuItem
|
|
uri = c.uri_for(c.controller('Jobset').action_for('evals'), [project.name, jobset.name])
|
|
title = "Evaluations" %]
|
|
[% INCLUDE menuItem
|
|
uri = c.uri_for(c.controller('Jobset').action_for('all'), [project.name, jobset.name])
|
|
title = "Latest builds" %]
|
|
[% INCLUDE menuItem
|
|
uri = c.uri_for(c.controller('Jobset').action_for('jobstatus'), [project.name, jobset.name])
|
|
title = "Job status" %]
|
|
[% INCLUDE menuItem
|
|
uri = c.uri_for(c.controller('Jobset').action_for('errors'), [project.name, jobset.name])
|
|
title = "Errors" %]
|
|
<li class="divider"></li>
|
|
[% INCLUDE menuItem uri = c.uri_for('/jobset' project.name jobset.name 'channel' 'latest') title = "Channel" %]
|
|
[% IF c.user_exists %]
|
|
<li class="divider"></li>
|
|
[% INCLUDE menuItem uri = c.uri_for('/jobset' project.name jobset.name 'edit') title="Edit" %]
|
|
[% INCLUDE menuItem uri = c.uri_for('/jobset' project.name jobset.name 'clone') title="Clone" %]
|
|
|
|
<script>
|
|
function confirmEvaluateJobset() {
|
|
bootbox.confirm(
|
|
'Are you sure you want to force evaluation of this jobset?',
|
|
function(c) {
|
|
if (!c) return;
|
|
$.post("[% c.uri_for('/api/push', { jobsets = project.name _ ':' _ jobset.name, force = "1" }) %]")
|
|
.done(function(data) {
|
|
if (data.error)
|
|
bootbox.alert("Unable to schedule the jobset for evaluation: " + data.error);
|
|
else
|
|
bootbox.alert("The jobset has been scheduled for evaluation.");
|
|
})
|
|
.fail(function() { bootbox.alert("Server request failed!"); });
|
|
});
|
|
return;
|
|
};
|
|
</script>
|
|
[% INCLUDE menuItem title="Evaluate" uri = "javascript:confirmEvaluateJobset()" %]
|
|
|
|
[% END %]
|
|
[% END %]
|
|
[% END %]
|
|
|
|
[% IF job %]
|
|
[% WRAPPER makeSubMenu title="Job" %]
|
|
<li class="nav-header">[% HTML.escape(job.name) %]</li>
|
|
<li class="divider"></li>
|
|
[% INCLUDE menuItem
|
|
uri = c.uri_for(c.controller('Job').action_for('overview'), [project.name, jobset.name, job.name])
|
|
title = "Overview" %]
|
|
[% INCLUDE menuItem
|
|
uri = c.uri_for(c.controller('Job').action_for('all'), [project.name, jobset.name, job.name])
|
|
title = "Latest builds" %]
|
|
[% INCLUDE menuItem
|
|
uri = c.uri_for(c.controller('Job').action_for('jobstatus'), [project.name, jobset.name, job.name])
|
|
title = "Job status" %]
|
|
[% INCLUDE menuItem
|
|
uri = c.uri_for(c.controller('Job').action_for('errors'), [project.name, jobset.name, job.name])
|
|
title = "Errors" %]
|
|
<li class="divider"></li>
|
|
[% INCLUDE menuItem uri = c.uri_for('/job' project.name jobset.name job.name 'channel' 'latest') title = "Channel" %]
|
|
[% END %]
|
|
[% END %]
|
|
|
|
[% IF build %]
|
|
[% WRAPPER makeSubMenu title="Build" %]
|
|
<li class="nav-header">#[% build.id %]</li>
|
|
<li class="divider"></li>
|
|
[% INCLUDE menuItem
|
|
uri = c.uri_for('/build' build.id)
|
|
title = "Overview" %]
|
|
[% IF c.user_exists %]
|
|
<li class="divider"></li>
|
|
[% INCLUDE menuItem
|
|
uri = c.uri_for('/build' build.id 'clone')
|
|
title = "Clone build" %]
|
|
[% IF available %]
|
|
[% IF build.keep %]
|
|
[% INCLUDE menuItem
|
|
uri = c.uri_for('/build' build.id 'keep' 0)
|
|
title = "Unkeep build" %]
|
|
[% ELSE %]
|
|
[% INCLUDE menuItem
|
|
uri = c.uri_for('/build' build.id 'keep' 1)
|
|
title = "Keep build" %]
|
|
[% END %]
|
|
[% END %]
|
|
[% IF build.finished %]
|
|
[% INCLUDE menuItem
|
|
uri = c.uri_for('/build' build.id 'restart')
|
|
title = "Restart build" %]
|
|
[% END %]
|
|
[% IF !build.finished %]
|
|
[% INCLUDE menuItem
|
|
uri = c.uri_for('/build' build.id 'cancel')
|
|
title = "Cancel build" %]
|
|
[% END %]
|
|
[% END %]
|
|
[% END %]
|
|
[% END %]
|
|
|
|
[% IF c.user_exists && c.check_user_roles('admin') %]
|
|
[% WRAPPER makeSubMenu title="Admin" %]
|
|
[% IF c.check_user_roles('admin') %]
|
|
[% INCLUDE menuItem uri = c.uri_for(c.controller('Project').action_for('create')) title = "Create project" %]
|
|
<li class="divider"></li>
|
|
[% END %]
|
|
[% INCLUDE menuItem
|
|
uri = c.uri_for(c.controller('Admin').action_for('machines'))
|
|
title = "Manage machines" %]
|
|
[% INCLUDE menuItem
|
|
uri = c.uri_for(c.controller('Admin').action_for('managenews'))
|
|
title = "Manage news" %]
|
|
[% INCLUDE menuItem
|
|
uri = c.uri_for(c.controller('Admin').action_for('users'))
|
|
title = "Manage users" %]
|
|
<li class="divider"></li>
|
|
[% INCLUDE menuItem
|
|
uri = c.uri_for(c.controller('Admin').action_for('clearfailedcache'))
|
|
title = "Clear failed builds cache"
|
|
confirmmsg = "Are you sure you want to clear the failed builds cache?"
|
|
class = "" %]
|
|
[% INCLUDE menuItem
|
|
uri = c.uri_for(c.controller('Admin').action_for('clear_queue_non_current'))
|
|
title = "Clear all non-running old builds from queue"
|
|
confirmmsg = "Are you sure you want to clear the queue?"
|
|
class = "" %]
|
|
[% END %]
|
|
[% END %]
|
|
|
|
</ul>
|
|
|
|
<ul class="nav pull-right" id="top-menu">
|
|
|
|
<form class="navbar-search" action="[% c.uri_for('/search') %]">
|
|
<input name="query" type="text" class="search-query span2" placeholder="Search" [% HTML.attributes(value => c.req.params.query) %]></input>
|
|
</form>
|
|
|
|
[% IF c.user_exists %]
|
|
[% INCLUDE menuItem uri = c.uri_for(c.controller('User').action_for('edit'), [c.user.username]) title = "Preferences" %]
|
|
[% INCLUDE menuItem uri = c.uri_for(c.controller('Root').action_for('logout')) title = "Sign out" %]
|
|
[% ELSE %]
|
|
[% INCLUDE menuItem uri = c.uri_for(c.controller('Root').action_for('login')) title = "Sign in" %]
|
|
[% END %]
|
|
|
|
</ul>
|