Files
palladium-monitor/templates/snapshot.html
T
Your Name 8945073ec6 del
2026-07-08 11:25:50 +08:00

184 lines
7.7 KiB
HTML

{% extends "base.html" %}
{% block title %}快照 #{{ snapshot.id }} — Palladium Z1 Monitor{% endblock %}
{% block content %}
<div class="snapshot-header">
<div>
<h2>📸 快照 #{{ snapshot.id }}</h2>
<div class="snapshot-meta">
{{ snapshot.timestamp | fmt_time }} · 来源: {{ snapshot.source }} ·
{{ snapshot.emulator }} / {{ snapshot.hardware }}
</div>
</div>
<a href="{{ url_for('dashboard') }}" class="btn btn-secondary">← 返回仪表板</a>
</div>
<!-- 系统信息 -->
<div class="system-bar">
<div class="sys-item">
<span class="sys-label">仿真器</span>
<span class="sys-value">{{ snapshot.emulator }}</span>
</div>
<div class="sys-item">
<span class="sys-label">硬件</span>
<span class="sys-value">{{ snapshot.hardware }}</span>
</div>
<div class="sys-item">
<span class="sys-label">ConfigMgr</span>
<span class="sys-value">{{ snapshot.configmgr }}</span>
</div>
<div class="sys-item">
<span class="sys-label">系统状态</span>
{% set ss = snapshot.system_status.upper() %}
{% if ss == 'OK' %}
<span class="status-badge status-ok">{{ snapshot.system_status }}</span>
{% elif 'PARTIAL' in ss %}
<span class="status-badge status-warning">{{ snapshot.system_status }}</span>
{% elif 'DOWN' in ss or 'ERROR' in ss %}
<span class="status-badge status-error">{{ snapshot.system_status }}</span>
{% else %}
<span class="status-badge status-unknown">{{ snapshot.system_status }}</span>
{% endif %}
</div>
</div>
<!-- 指标卡片 -->
<div class="metrics-grid">
<div class="metric-card">
<div class="metric-icon">🖥️</div>
<div class="metric-body">
<div class="metric-label">逻辑板</div>
<div class="metric-value">{{ stats.total_boards }}</div>
<div class="metric-sub">
<span class="text-green">在线 {{ stats.online_boards }}</span> ·
<span class="text-red">离线 {{ stats.offline_boards }}</span>
</div>
</div>
</div>
<div class="metric-card">
<div class="metric-icon">📊</div>
<div class="metric-body">
<div class="metric-label">逻辑板利用率</div>
<div class="metric-value">{{ stats.utilization }}%</div>
<div class="metric-sub">使用 {{ stats.used_boards }} / 空闲 {{ stats.online_boards - stats.used_boards }}</div>
</div>
</div>
<div class="metric-card">
<div class="metric-icon">⚙️</div>
<div class="metric-body">
<div class="metric-label">活跃作业</div>
<div class="metric-value">{{ stats.active_jobs }}</div>
</div>
</div>
</div>
<!-- Rack / Cluster / Board -->
<div class="section-header">
<h2>🏗️ 逻辑板状态</h2>
<div class="legend">
<span class="legend-item"><span class="domain-cell domain-available">-</span> 可用</span>
<span class="legend-item"><span class="domain-cell domain-downloaded">1</span> 已加载</span>
<span class="legend-item"><span class="domain-cell domain-disabled">D</span> 已禁用</span>
<span class="legend-item"><span class="domain-cell domain-not_exist">X</span> 不存在</span>
</div>
</div>
{% for rack in racks %}
<div class="rack-card">
<div class="rack-header">
<span class="rack-title">Rack {{ rack.rack }}</span>
</div>
{% for cluster in rack.clusters %}
<div class="cluster-section">
<div class="cluster-header">
<span>Cluster {{ cluster.cluster }}</span>
{% set ccd = cluster.ccd.upper() %}
{% if ccd == 'ONLINE' %}
<span class="ccd-badge ccd-online">CCD: {{ cluster.ccd }}</span>
{% else %}
<span class="ccd-badge ccd-offline">CCD: {{ cluster.ccd }}</span>
{% endif %}
</div>
<div class="boards-grid">
{% for board in cluster.boards %}
<div class="board-card board-{{ board.status | lower }}">
<div class="board-top">
<span class="board-ld">LD {{ board.ld }}</span>
<span class="board-status-badge status-{{ board.status | lower }}">{{ board.status }}</span>
</div>
<div class="domains-row">
{% for d in board.domains %}
<div class="domain-cell domain-{{ d | domain_state }}"
title="D{{ loop.index0 }}: {{ d | domain_label }}">{{ d }}</div>
{% endfor %}
</div>
</div>
{% endfor %}
</div>
</div>
{% endfor %}
</div>
{% endfor %}
<!-- 作业信息 -->
<div class="section-header"><h2>📋 作业信息</h2></div>
{% if jobs %}
<div class="card">
<table class="data-table">
<thead>
<tr><th>#</th><th>用户</th><th>PID</th><th>T-Pod</th><th>设计名</th><th>已运行</th><th>预留Key</th></tr>
</thead>
<tbody>
{% for job in jobs %}
<tr>
<td>{{ job.job_index }}</td>
<td class="text-mono">{{ job.owner }}</td>
<td class="text-mono">{{ job.pid }}</td>
<td class="text-mono">{{ job.t_pod }}</td>
<td>{{ job.design }}</td>
<td class="text-mono">{{ job.elap_time }}</td>
<td>{{ job.reserved_key }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% else %}
<div class="card empty-state">该快照无活跃作业</div>
{% endif %}
<!-- T-Pod -->
<div class="section-header"><h2>🎯 T-Pod 可用性</h2></div>
<div class="pods-grid">
{% for pod in pods %}
<div class="pod-card">
<div class="pod-header">Rack {{ pod.rack }}</div>
<table class="pod-table">
{% set all_h = pod.all_hdsb | from_json %}
{% set all_t = pod.all_t_pods | from_json %}
{% for length, val in all_h.items() %}
<tr><td class="pod-sublabel">HDSB L{{ length }}</td><td class="pod-value">{{ val }}</td></tr>
{% endfor %}
{% for length, val in all_t.items() %}
<tr><td class="pod-sublabel">T-Pods L{{ length }}</td><td class="pod-value">{{ val }}</td></tr>
{% endfor %}
<tr class="pod-row-available"><td class="pod-label">可用 HDSB</td><td class="pod-value">{{ pod.available_hdsb }}</td></tr>
<tr class="pod-row-available"><td class="pod-label">可用 T-Pods</td><td class="pod-value">{{ pod.available_t_pods }}</td></tr>
<tr class="pod-row-locked"><td class="pod-label">锁定 HDSB</td><td class="pod-value">{{ pod.locked_hdsb }}</td></tr>
<tr class="pod-row-locked"><td class="pod-label">锁定 T-Pods</td><td class="pod-value">{{ pod.locked_t_pods }}</td></tr>
<tr class="pod-row-reserved"><td class="pod-label">预留 HDSB</td><td class="pod-value">{{ pod.reserved_hdsb }}</td></tr>
<tr class="pod-row-reserved"><td class="pod-label">预留 T-Pods</td><td class="pod-value">{{ pod.reserved_t_pods }}</td></tr>
<tr class="pod-row-unavailable"><td class="pod-label">不可用 HDSB</td><td class="pod-value">{{ pod.unavailable_hdsb }}</td></tr>
<tr class="pod-row-unavailable"><td class="pod-label">不可用 T-Pods</td><td class="pod-value">{{ pod.unavailable_t_pods }}</td></tr>
</table>
</div>
{% endfor %}
</div>
<!-- 原始输出 -->
<details class="raw-output-section">
<summary>📄 原始 test_server 输出</summary>
<pre class="raw-output">{{ snapshot.raw_output }}</pre>
</details>
{% endblock %}