]> git.ipfire.org Git - pbs.git/commitdiff
builders: Redesign listing and detail page
authorMichael Tremer <michael.tremer@ipfire.org>
Wed, 1 Jun 2022 16:00:19 +0000 (16:00 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Wed, 1 Jun 2022 16:00:19 +0000 (16:00 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/buildservice/builders.py
src/templates/builders/detail.html
src/templates/builders/list.html
src/web/builders.py

index 070a92cd05c038cb5d8467fc2bb8db679685adb3..8cf5286942fab3cac06dbbb7af7c6e288de3d050 100644 (file)
@@ -175,7 +175,10 @@ class Builder(base.DataObject):
                """
                        Returns True if the builder is online
                """
-               return self.online_until >= datetime.datetime.utcnow()
+               if self.stats:
+                       return True
+
+               return False
 
        def set_online_until(self, online_until):
                self._set_attribute("online_until", online_until)
@@ -275,6 +278,28 @@ class Builder(base.DataObject):
                        swap_free,
                )
 
+       @lazy_property
+       def stats(self):
+               """
+                       Returns the latest stats data (if any)
+               """
+               return self.db.get("""
+                       SELECT
+                               *
+                       FROM
+                               builder_stats
+                       WHERE
+                               builder_id = %s
+                       AND
+                               created_at >= CURRENT_TIMESTAMP - INTERVAL '10 minutes'
+                       ORDER BY
+                               created_at DESC
+                       LIMIT 1""",
+                       self.id,
+               )
+
+       # Enabled
+
        def set_enabled(self, enabled):
                self._set_attribute("enabled", enabled)
 
index bbc5c2e14e6ee3ba2a90a9e371f84c6bc788103e..07102e301770c1c47fdd8c90fe355f7f40d33c9d 100644 (file)
 
 {% block title %}{{ _("Builder") }}: {{ builder.name }}{% end block %}
 
-{% block body %}
-       <div class="row">
-               <div class="col-12 col-sm-12 col-md-12 col-lg-12 col-xl-12">
-                       <nav aria-label="breadcrumb" role="navigation">
-                               <ol class="breadcrumb">
-                                       <li class="breadcrumb-item"><a href="/">{{ _("Home") }}</a></li>
-                                       <li class="breadcrumb-item"><a href="/builders">{{ _("Builders") }}</a></li>
-                                       <li class="breadcrumb-item active">
-                                                       <a href="/builders/{{ builder.name }}">{{ builder.name }}</a>
-                                       </li>
-                               </ol>
-                       </nav>
-               </div>
-       </div>
-       <div class="row">
-               <div class="col-12 col-sm-12 col-md-9 col-lg-10 col-xl-10">
-                       <h2 style="word-wrap: break-word;">
-                               {{ _("Builder") }}: {{ builder.name }}
-                       </h2>
-               </div>
-               <div class="col-12 col-sm-12 col-md-3 col-lg-2 col-xl-2">
-                       <div class="dropdown">
-                               <button class="btn btn-block btn-light dropdown-toggle mb-2" type="button" id="dropdownMenuButton" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
-                                       {{ _("Actions") }}
-                               </button>
-                               <div class="dropdown-menu dropdown-menu-right" aria-labelledby="dropdownMenuButton">
-                                       <a class="dropdown-item" href="/jobs?builder={{ builder.name }}">
-                                               {{ _("Show jobs by this builder") }}
-                                       </a>
-                                       {% if current_user and current_user.has_perm("maintain_builders") %}
-                                               <div class="dropdown-divider"></div>
-                                               {% if builder.enabled %}
-                                                       <a class="dropdown-item" href="/builders/{{ builder.name }}/disable">
-                                                               {{ _("Disable builder") }}
-                                                       </a>
-                                               {% else %}
-                                                       <a class="dropdown-item" href="/builders/{{ builder.name }}/enable">
-                                                               {{ _("Enable builder") }}
-                                                       </a>
-                                               {% end %}
-                                               <a class="dropdown-item" href="/builders/{{ builder.name }}/edit">
-                                                       <i class="icon-edit"></i>
-                                                       {{ _("Edit builder") }}
-                                               </a>
-                                               {% if not builder.enabled %}
-                                                       <a class="dropdown-item" href="/builders/{{ builder.name }}/renew">
-                                                               <i class="icon-refresh"></i>
-                                                               {{ _("Renew passphrase") }}
-                                                       </a>
+{% block container %}
+       <nav aria-label="{{ _("You are here:") }}" role="navigation">
+               <ul class="breadcrumbs">
+                       <li>
+                               <a href="/">{{ _("Home") }}</a>
+                       </li>
+                       <li>
+                               <a href="/builders">{{ _("Builders") }}</a>
+                       </li>
+                       <li>
+                               <span class="show-for-sr">{{ _("Current") }}: </span> {{ builder }}
+                       </li>
+               </ul>
+       </nav>
+
+       <h1 class="text-center">{{ builder }}</h1>
+
+       <div class="large callout">
+               <div class="grid-x grid-padding-x align-middle">
+                       <div class="cell large-8">
+                               {% if builder.cpu_model %}
+                                       <p>
+                                               {{ builder.cpu_model }}
+                                               {% if builder.cpu_count > 1 %}
+                                                       &times; {{ builder.cpu_count }}
                                                {% end %}
-                                               <a class="dropdown-item"href="/builders/{{ builder.name }}/delete">
-                                                       <i class="icon-trash"></i>
-                                                       {{ _("Delete builder") }}
-                                               </a>
+                                       </p>
+                               {% end %}
+
+                               {% if builder.pakfire_version %}
+                                       <p>
+                                               {{ _("Pakfire %s") % builder.pakfire_version }}
+                                       </p>
+                               {% end %}
+
+                               {% if builder.os_name %}
+                                       <p>
+                                               {{ builder.os_name }}
+                                       </p>
+                               {% end %}
+
+                               <p>
+                                       {{ _("Supported Architectures: %s") % locale.list(builder.supported_arches) }}
+                               </p>
+
+                               {% if builder.stats %}
+                                       <p>
+                                               {{ _("%s Memory") % format_size(builder.stats.mem_total) }}
+                                       </p>
+
+                                       {% if builder.stats.swap_total %}
+                                               <p>
+                                                       {{ _("%s Swap Space") % format_size(builder.stats.swap_total) }}
+                                               </p>
                                        {% end %}
-                               </div>
-                       </div>
-               </div>
-       </div>
+                               {% end %}
 
-       {% if builder.testmode %}
-               <div class="row">
-                       <div class="col-12 col-sm-12 col-md-12 col-lg-12 col-xl-12">
-                               <div class="alert alert-warning">
-                                       {{ _("This builder is in test mode!") }}
-                               </div>
-                       </div>
-               </div>
-       {% end %}
+                               {% if builder.testmode %}
+                                       <p>
+                                               <span class="label">{{ _("Test Mode") }}</span>
+                                       </p>
+                               {% end %}
 
-       <div class="row">
-               <div class="col-12 col-sm-12 col-md-6 col-lg-6 col-xl-6">
-                       <h3>{{ _("General") }}</h3>
-                       <div class="table-responsive mb-2">
-                               <table class="table table-striped table-hover">
-                                       <tbody>
-                                               <tr>
-                                                       <td>{{ _("State") }}</td>
-                                                       <td>
-                                                               {% if builder.enabled %}
-                                                                       {{ _("Enabled") }}
-                                                               {% else %}
-                                                                       {{ _("Disabled") }}
-                                                               {% end %}
-                                                       </td>
-                                               </tr>
-                                               <tr>
-                                                       <td>{{ _("Parallel builds") }}</td>
-                                                       <td>{{ _("One job only.", "Up to %(num)s jobs.", builder.max_jobs) % { "num" : builder.max_jobs } }}</td>
-                                               </tr>
-                                               <tr>
-                                                       <td>{{ _("Supported architectures") }}</td>
-                                                       <td>
-                                                               {{ locale.list(builder.supported_arches) }}
-                                                       </td>
-                                               </tr>
-                                               <tr>
-                                                       <td>{{ _("CPU model") }}</td>
-                                                       <td>
-                                                               {{ builder.cpu_model or _("Unknown") }}
-                                                       </td>
-                                               </tr>
-                                               <tr>
-                                                       <td>{{ _("CPU count") }}</td>
-                                                       <td>{{ builder.cpu_count }}</td>
-                                               </tr>
-                                               <tr>
-                                                       <td>{{ _("Bogomips") }}</td>
-                                                       <td>{{ builder.cpu_bogomips or _("N/A") }}</td>
-                                               </tr>
-                                               <tr>
-                                                       <td>{{ _("Host key") }}</td>
-                                                       <td>
-                                                               {{ builder.host_key_id or _("N/A") }}
-                                                       </td>
-                                               </tr>
-                                       </tbody>
-                               </table>
+                               {% if builder.description %}
+                                       {% module Text(builder.description) %}
+                               {% end %}
                        </div>
-               </div>
-
-
 
-               <div class="col-12 col-sm-12 col-md-6 col-lg-6 col-xl-6">
-                       <h3>{{ _("Status information") }}</h3>
-                       <div class="table-responsive">
-                               <table class="table table-striped table-hover">
-                                       <tbody>
-                                               <tr>
-                                                       <td>{{ _("OS") }}</td>
-                                                       <td>
-                                                               {{ builder.os_name or _("N/A") }}
-                                                       </td>
-                                               </tr>
-                                               <tr>
-                                                       <td>{{ _("Pakfire version") }}</td>
-                                                       <td>
-                                                               {{ builder.pakfire_version or _("N/A") }}
-                                                       </td>
-                                               </tr>
-
-
-                                               {% if builder.mem_total %}
-                                                       <tr>
-                                                               <td colspan="2">
-                                                                       <h6>
-                                                                               <span class="float-right">
-                                                                                       {{ format_size(builder.mem_used) }}/{{ format_size(builder.mem_total) }}
-                                                                               </span>
-
-                                                                               {{ _("Memory") }}
-                                                                       </h6>
-                                                                       <div class="progress">
-                                                                               <div class="progress-bar" role="progressbar" style="width: {{ "%.2f%%" % builder.mem_percentage }}"></div>
-                                                                       </div>
-                                                               </td>
-                                                       <tr>
-                                               {% end %}
-
-                                               {% if builder.swap_total %}
-                                                       <tr>
-                                                               <td colspan="2">
-                                                                       <h6>
-                                                                               <span class="float-right">
-                                                                                       {{ format_size(builder.swap_used) }}/{{ format_size(builder.swap_total) }}
-                                                                               </span>
-
-                                                                               {{ _("SWAP space") }}
-                                                                       </h6>
-
-                                                                       <div class="progress">
-                                                                               <div class="bar bar-danger" style="width: {{ "%.2f%%" % builder.swap_percentage }}"></div>
-                                                                       </div>
-                                                               </td>
-                                                       </tr>
-                                               {% end %}
-
-                                               {% if not builder.mem_total and not builder.swap_total %}
-                                                       <tr>
-                                                               <td colspan="2">
-                                                                       <span class="text-muted">
-                                                                               {{ _("No memory information available.") }}
-                                                                       </span>
-                                                               </td>
-                                                       </tr>
-                                               {% end %}
-
-                                               <tr>
-                                                       <td>{{ _("Load average") }}</td>
-                                                       <td>
-                                                               {{ builder.loadavg or _("N/A") }}
-                                                       </td>
-                                               </tr>
-                                               <tr>
-                                                       <td>{{ _("Free disk space") }}</td>
-                                                       <td>{{ format_size(builder.space_free or 0) }}</td>
-                                               </tr>
-                                       </tbody>
-                               </table>
+                       <div class="cell large-4 text-center">
+                               <h1>
+                                       {{ len(builder.active_jobs) }}
+                                       <small>/ {{ builder.max_jobs }}</small>
+                               </h1>
+                               <h5>{{ _("Jobs") }}</h5>
                        </div>
                </div>
        </div>
 
-       {% if builder.description %}
-       <div class="row">
-                       <div class="col-12 col-sm-12 col-md-12 col-lg-12 col-xl-12">
-                               <h2>{{ _("Remarks") }}</h2>
-                               {% module Text(builder.description) %}
-                       </div>
-               </div>
-       {% end %}
+       <!-- XXX add some realtime graph -->
 
+       {% if builder.active_jobs %}
+               <h5>{{ _("Running Jobs") }}</h5>
 
-       {% if jobs %}
-               <div class="row">
-                       <div class="col-12 col-sm-12 col-md-12 col-lg-12 col-xl-12">
-                               <h3>{{ _("Active and pending jobs") }}</h3>
-                               {% module JobsList(jobs) %}
-                       </div>
-               </div>
+               {% module JobsList(builder.active_jobs) %}
        {% end %}
 
        {% if log %}
index 1458a5a118ce43ba31c73a29c49765b7b3be399c..b196690ab15856b0cfec531cb2428da8f8e342e4 100644 (file)
@@ -2,79 +2,39 @@
 
 {% block title %}{{ _("Builders") }}{% end block %}
 
-{% block body %}
-       <div class="row">
-               <div class="col-12 col-sm-12 col-md-12 col-lg-12 col-xl-12">
-                       <nav aria-label="breadcrumb" role="navigation">
-                               <ol class="breadcrumb">
-                                       <li class="breadcrumb-item"><a href="/">{{ _("Home") }}</a></li>
-                                       <li class="breadcrumb-item active"><a href="/builders">{{ _("Builders") }}</a></li>
-                               </ol>
-                       </nav>
-               </div>
-       </div>
+{% block container %}
+       <nav aria-label="{{ _("You are here:") }}" role="navigation">
+               <ul class="breadcrumbs">
+                       <li>
+                               <a href="/">{{ _("Home") }}</a>
+                       </li>
+                       <li>
+                               <span class="show-for-sr">{{ _("Current") }}: </span> {{ _("Builders") }}
+                       </li>
+               </ul>
+       </nav>
 
-       <div class="row">
-               <div class="col-12 col-sm-12 col-md-9 col-lg-10 col-xl-10">
-                       <h2>{{ _("Builders") }}</h2>
-               </div>
-               {% if current_user and current_user.is_admin() %}
-               <div class="col-12 col-sm-12 col-md-3 col-lg-2 col-xl-2">
-                               <button class="btn btn-block dropdown-toggle" type="button" id="dropdownMenuButton" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
-                                       {{ _("Actions") }}
-                               </button>
-                               <div class="dropdown-menu dropdown-menu-right" aria-labelledby="dropdownMenuButton">
-                                       <a class="dropdown-item" href="/builders/new">{{ _("Create new builder") }}</a>
-                               </div>
+       <h1 class="text-center">{{ _("Builders") }}</h1>
+
+       {% for builder in builders %}
+               <div class="callout">
+                       <h5>
+                               <a href="/builder/{{ builder.hostname }}">{{ builder }}</a>
+                       </h5>
+
+                       {% if builder.is_online() %}
+                               <span class="label success">{{ _("Online") }}</span>
+                       {% else %}
+                               <span class="label alert">{{ _("Offline") }}</span>
+                       {% end %}
+
+                       <!-- XXX put a bar here --->
                </div>
        {% end %}
-       </div>
 
-       <div class="row">
-               <div class="col-12 col-sm-12 col-md-12 col-lg-12 col-xl-12">
-                       <div class="table-responsive">
-                               <table class="table table-striped table-hover">
-                                       <thead>
-                                               <tr>
-                                                       <th>&nbsp;</th>
-                                                       <th>{{ _("Hostname") }}</th>
-                                                       <th>{{ _("Architecture") }}</th>
-                                                       <th>{{ _("Jobs") }}</th>
-                                               </tr>
-                                       </thead>
-                                       <tbody>
-                                               {% for builder in builders %}
-                                                       <tr>
-                                                               <td class="lead">
-                                                                       {% if builder.state == "disabled" %}
-                                                                               <i class="icon-remove text-muted"></i>
-                                                                       {% elif builder.state == "offline" %}
-                                                                               <i class="icon-remove text-warning"></i>
-                                                                       {% elif builder.state == "online" %}
-                                                                               <i class="icon-ok text-success"></i>
-                                                                       {% end %}
-                                                               </td>
-                                                               <td>
-                                                                       <a href="/builders/{{ builder.name }}">{{ builder.name }}</a>
-                                                                       <br>
-                                                                       {{ builder.cpu_model or _("Unknown CPU") }}
-                                                                       {% if builder.mem_total %}
-                                                                               - {{ format_size(builder.mem_total) }}
-                                                                       {% end %}
-                                                               </td>
-                                                               <td>
-                                                                       {{ builder.cpu_arch or _("Unknown") }}
-                                                               </td>
-                                                               <td>
-                                                                       <p class="{% if not builder.active_jobs %}text-success{% elif len(builder.active_jobs) >= builder.max_jobs %}text-danger{% else %}text-warning{% end %}">
-                                                                               {{ len(builder.active_jobs) }}/{{ builder.max_jobs }}
-                                                                       </p>
-                                                               </td>
-                                                       </tr>
-                                               {% end %}
-                                       </tbody>
-                               </table>
-                       </div>
-               </div>
-       </div>
+       {% if current_user and current_user.is_admin() %}
+               <a class="success button" href="/builders/new">
+                       {{ _("Create A New Builder") }}
+               </a>
+       {% end %}
 {% end block %}
index 94c7d4378252703dce7b095d320b92e96b587d27..64321fcab451486272f25fb151d3e1729a2cb132 100644 (file)
@@ -15,13 +15,10 @@ class BuilderDetailHandler(base.BaseHandler):
                if not builder:
                        raise tornado.web.HTTPError(404, "Could not find builder %s" % hostname)
 
-               # Get running and pending jobs.
-               jobs = builder.active_jobs + list(builder.jobqueue)
-
                # Get log.
                log = builder.get_history(limit=5)
 
-               self.render("builders/detail.html", builder=builder, jobs=jobs, log=log)
+               self.render("builders/detail.html", builder=builder, log=log)
 
        @tornado.web.authenticated
        def post(self, hostname):