Docker panel (#5276): problems first, then the 8 busiest running containers by CPU; the other running and the stopped fold behind one "+N more running · M stopped" line. Containers that are not swarm tasks read the way the Docker page reads them: CI jobs as "CI: workflow · job", buildx builders as "BuildKit builder · name". Monitors card (#5277): the edit/delete icon buttons and the inline add form are gone. Each row links to its monitor's page; "Add monitor" opens the add form filed under this host, starting from its address, with the host in its breadcrumbs and Cancel back to it. Agent card (#5278): Full metrics stays in view; Update, Rotate token, Unregister agent (was "Remove") and Re-provision sit under "Manage agent". Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
77 lines
4.1 KiB
HTML
77 lines
4.1 KiB
HTML
{# docker/host_panel.html — per-host Docker fragment embedded on the Hosts hub:
|
|
problems first with what is wrong and since when, then the busiest running
|
|
containers; the rest of the running and the stopped fold away so the card
|
|
stays short (#5276). Tasks Swarm has replaced are left out (counted in the
|
|
header). #}
|
|
{% from "_macros.html" import status_badge, status_dot %}
|
|
{% from "docker/_usage.html" import cpu, mem %}
|
|
{% macro container_table(rows) %}
|
|
<table class="table">
|
|
<colgroup><col><col style="width:7rem"><col style="width:9rem"></colgroup>
|
|
<thead>
|
|
<tr>
|
|
<th>Container</th>
|
|
<th title="Docker counts CPU per core: 1 core = one core fully busy">CPU</th>
|
|
<th title="Used, and the limit when one is set">Memory</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{% for r in rows %}
|
|
{% set c = r.c %}
|
|
<tr>
|
|
<td>
|
|
<div style="display:flex;align-items:center;gap:0.5rem;min-width:0;">
|
|
{{ status_dot('crit' if r.problems else ('up' if c.status == 'running' else 'inactive'), c.status|capitalize) }}
|
|
<div style="min-width:0;">
|
|
<a href="/plugins/docker/container/{{ c.host_id }}/{{ c.name }}" title="{{ c.name }} · {{ c.image }}" style="font-weight:500;color:inherit;text-decoration:none;overflow-wrap:anywhere;">{{ r.label }}</a>
|
|
{% if r.problems %}
|
|
{% set worst = r.problems[0] %}
|
|
<div style="font-size:0.75rem;margin-top:0.1rem;">
|
|
{{ status_badge('crit' if severity[worst] == 'critical' else 'warn', worst|replace('_', ' ')|capitalize) }}
|
|
<span style="color:var(--text-muted);">
|
|
{%- for p in r.problems %} {{ says[p] }}{{ " and" if not loop.last }}{% endfor %}
|
|
{%- if c.exit_code %} · exit {{ c.exit_code }}{% if c.oom_killed %} (OOM){% endif %}{% endif %}
|
|
{%- if r.since %} · since {{ r.since|ago }}{% endif -%}
|
|
</span>
|
|
</div>
|
|
{% else %}
|
|
<div style="font-size:0.72rem;color:var(--text-muted);">
|
|
{{ c.status }}{% if r.uptime %} · up {{ r.uptime }}{% endif %}
|
|
{%- if c.status != 'running' and c.exit_code %} · exit {{ c.exit_code }}{% endif %}
|
|
</div>
|
|
{% endif %}
|
|
</div>
|
|
</div>
|
|
</td>
|
|
<td style="font-family:ui-monospace,monospace;font-size:0.85rem;white-space:nowrap;">{% if c.status == 'running' %}{{ cpu(r.usage) }}{% else %}<span class="tone-dim">—</span>{% endif %}</td>
|
|
<td style="font-family:ui-monospace,monospace;font-size:0.85rem;white-space:nowrap;">{% if c.status == 'running' %}{{ mem(r.usage) }}{% else %}<span class="tone-dim">—</span>{% endif %}</td>
|
|
</tr>
|
|
{% endfor %}
|
|
</tbody>
|
|
</table>
|
|
{% endmacro %}
|
|
<div class="card">
|
|
<div style="display:flex;align-items:baseline;justify-content:space-between;gap:0.6rem;margin-bottom:0.6rem;flex-wrap:wrap;">
|
|
<h3 class="section-title" style="margin-bottom:0;">Docker</h3>
|
|
<span style="font-size:0.78rem;color:var(--text-muted);">
|
|
{% if problems %}<span class="tone-crit">{{ problems }} with problems</span> · {% endif %}
|
|
{{ running }} running{% if stopped %} · {{ stopped }} stopped{% endif %}
|
|
{% if replaced %}<span title="Old swarm tasks Swarm has replaced with new ones: history, not containers that need anything"> · {{ replaced }} replaced task{{ "s" if replaced != 1 }} hidden</span>{% endif %}
|
|
<a href="/plugins/docker/" style="margin-left:0.6rem;color:var(--text-muted);">All →</a>
|
|
</span>
|
|
</div>
|
|
{{ container_table(rows) }}
|
|
{% if folded %}
|
|
<details style="margin-top:0.5rem;">
|
|
<summary style="cursor:pointer;font-size:0.82rem;color:var(--text-muted);">
|
|
{%- set more_running = folded|selectattr("c.status", "equalto", "running")|list|length -%}
|
|
{%- set more_stopped = folded|length - more_running -%}
|
|
{%- if more_running %}+{{ more_running }} more running{% endif -%}
|
|
{%- if more_running and more_stopped %} · {% endif -%}
|
|
{%- if more_stopped %}{{ more_stopped }} stopped{% endif -%}
|
|
</summary>
|
|
{{ container_table(folded) }}
|
|
</details>
|
|
{% endif %}
|
|
</div>
|