src/templates/log.html \
src/templates/login.html \
src/templates/modal.html \
- src/templates/queue.html \
src/templates/search.html
templatesdir = $(datadir)/templates
src/templates/builds/clone.html \
src/templates/builds/delete.html \
src/templates/builds/index.html \
+ src/templates/builds/queue.html \
src/templates/builds/show.html
templates_buildsdir = $(templatesdir)/builds
""")
def __iter__(self):
- jobs = self.backend.jobs._get_jobs("""
- SELECT
- *
- FROM
- job_queue
- """,
- )
+ jobs = self.get_jobs()
return iter(jobs)
return 0
+ def get_jobs(self, limit=None):
+ jobs = self.backend.jobs._get_jobs("""
+ SELECT
+ *
+ FROM
+ job_queue
+ LIMIT
+ %s
+ """, limit,
+ )
+
+ return list(jobs)
+
def pop(self, builder):
"""
Returns the next build job that matches the given architectures
{{ _("Users") }}
</a>
{% end %}
+ <a class="navbar-item" href="/builds/queue">
+ {{ _("Build Queue") }}
+ </a>
<a class="navbar-item" href="/log">
{{ _("Log") }}
</a>
--- /dev/null
+{% extends "../base.html" %}
+
+{% block title %}{{ _("Build Queue") }}{% end block %}
+
+{% block body %}
+ <section class="hero is-light">
+ <div class="hero-body">
+ <div class="container">
+ <nav class="breadcrumb" aria-label="breadcrumbs">
+ <ul>
+ <li>
+ <a href="/builds">{{ _("Builds") }}</a>
+ </li>
+ <li class="is-active">
+ <a href="#" aria-current="page">
+ {{ _("Queue") }}
+ </a>
+ </li>
+ </ul>
+ </nav>
+
+ <h1 class="title">{{ _("Build Queue") }}</h1>
+ </div>
+ </div>
+ </section>
+
+ <section class="section">
+ <div class="container">
+ {% module JobsList(queue) %}
+ </div>
+ </section>
+{% end block %}
</div>
</section>
- {% if jobs %}
- <section class="section">
- <div class="container">
- <h1 class="title">{{ _("Running Jobs") }}</h1>
+ {# Show a status bar with running/queued jobs #}
+ {% if running_jobs or queued_jobs %}
+ <section class="hero is-light">
+ <div class="hero-body">
+ <div class="container">
+ <div class="level">
+ {# Running Jobs #}
+ {% if running_jobs %}
+ <div class="level-item has-text-centered">
+ <div>
+ <p class="heading">{{ _("Running Jobs") }}</p>
+ <p class="title">{{ len(running_jobs) }}</p>
+ </div>
+ </div>
+ {% end %}
+
+ {# Queue Length #}
+ {% if queue_length %}
+ <div class="level-item has-text-centered">
+ <div>
+ <p class="heading">{{ _("Queued Jobs") }}</p>
+ <p class="title">{{ queue_length }}</p>
+ </div>
+ </div>
+ {% end %}
+ </div>
+
+ <nav class="panel has-background-white">
+ {# Show running jobs #}
+ {% for job in running_jobs %}
+ <a class="panel-block is-active"
+ href="/builds/{{ job.build.uuid }}">
+ <span class="panel-icon">
+ <i class="fa-solid fa-gear fa-spin" aria-hidden="true"></i>
+ </span>
+
+ <div>
+ <p>{{ job }}</p>
+
+ {% module JobsLogStream(job, limit=1, small=True) %}
+ </div>
+ </a>
+ {% end %}
+
+ {# Show queued jobs #}
+ {% for job in queued_jobs %}
+ <a class="panel-block"
+ href="/builds/{{ job.build.uuid }}">
+ <span class="panel-icon">
+ <i class="fa-solid fa-clock" aria-hidden="true"></i>
+ </span>
- {% module JobsList(jobs) %}
+ {{ job }}
+ </a>
+ {% end %}
+
+ {# Show link to see entire queue #}
+ {% if queue_length > len(queued_jobs) %}
+ <a class="panel-block is-justify-content-center" href="/builds/queue">
+ {{ _("Show All Queued Jobs") }}
+ </a>
+ {% end %}
+ </nav>
+ </div>
</div>
</section>
{% end %}
-
- <section class="section has-text-centered">
- <div class="container">
- {% set q = len(backend.jobs.queue) %}
-
- <a href="/queue">
- {{ _("One Job In Queue", "%(num)s Jobs In Queue", q) % { "num" : q } }}
- </a>
- </div>
- </section>
{% end block %}
+++ /dev/null
-{% extends "base.html" %}
-
-{% block title %}{{ _("Job Queue") }}{% end block %}
-
-{% block body %}
- <section class="section">
- <div class="container">
- <nav class="breadcrumb" aria-label="breadcrumbs">
- <ul>
- <li class="is-active">
- <a href="#" aria-current="page">
- {{ _("Job Queue") }}
- </a>
- </li>
- </ul>
- </nav>
-
- <h1 class="title">{{ _("Job Queue") }}</h1>
-
- {% module JobsList(queue) %}
- </div>
- </section>
-{% end block %}
# Builds
(r"/builds", builds.IndexHandler),
+ (r"/builds/queue", builds.QueueHandler),
(r"/builds/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})", builds.ShowHandler),
(r"/builds/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})/bug", builds.BugHandler),
(r"/builds/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})/clone", builds.CloneHandler),
# Build Groups
(r"/builds/groups/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})", builds.GroupShowHandler),
- # Queue
- (r"/queue", jobs.QueueHandler),
-
# Jobs
(r"/jobs/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})/abort", jobs.AbortHandler),
(r"/jobs/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})/log", jobs.LogHandler),
limit=limit, offset=offset)
+class QueueHandler(base.BaseHandler):
+ def get(self):
+ self.render("builds/queue.html", queue=self.backend.jobs.queue)
+
+
class ShowHandler(base.BaseHandler):
async def get(self, uuid):
build = self.backend.builds.get_by_uuid(uuid)
class IndexHandler(base.BaseHandler):
def get(self):
- self.render("index.html", jobs=self.backend.jobs.running)
+ args = {
+ # Fetch all running jobs
+ "running_jobs" : self.backend.jobs.running,
+
+ # Fetch queued jobs
+ "queued_jobs" : self.backend.jobs.queue.get_jobs(limit=3),
+
+ # Fetch the total length of the queue
+ "queue_length" : len(self.backend.jobs.queue),
+ }
+
+ self.render("index.html", **args)
class LogHandler(base.BaseHandler):
pass
-class QueueHandler(base.BaseHandler):
- def get(self):
- self.render("queue.html", queue=self.backend.jobs.queue)
-
-
class LogHandler(base.BaseHandler):
async def get(self, uuid):
job = self.backend.jobs.get_by_uuid(uuid)