Add VM info from bin/vm-info to status page
This commit is contained in:
parent
ad23419b99
commit
69a5baeb8d
@ -115,7 +115,7 @@ if cgi.params.key?("content")
|
|||||||
|
|
||||||
if vms.any?
|
if vms.any?
|
||||||
running = vms.count { |v| v["state"].to_s == "running" }
|
running = vms.count { |v| v["state"].to_s == "running" }
|
||||||
total = vms.size
|
total = vms.size
|
||||||
hdr_cls = running == total ? "ok" : running == 0 ? "bad" : "warn"
|
hdr_cls = running == total ? "ok" : running == 0 ? "bad" : "warn"
|
||||||
|
|
||||||
html << %(<div class="span-3">)
|
html << %(<div class="span-3">)
|
||||||
@ -127,17 +127,18 @@ if cgi.params.key?("content")
|
|||||||
<span class="badge #{hdr_cls}">#{running} / #{total} Running</span>
|
<span class="badge #{hdr_cls}">#{running} / #{total} Running</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="subitems">
|
<div class="subitems">
|
||||||
<div style="display:grid;grid-template-columns:1fr 110px 1.2fr 100px;gap:0.5rem;padding:0 0.6rem;font-size:0.68rem;color:#334155;text-transform:uppercase;letter-spacing:0.06em;font-weight:600;">
|
<div style="display:grid;grid-template-columns:1fr 1fr 20ex 2fr 10ex;gap:0.5rem;padding:0 0.6rem;font-size:0.68rem;color:#334155;text-transform:uppercase;letter-spacing:0.06em;font-weight:600;">
|
||||||
<span>VM</span>
|
<span>VM</span>
|
||||||
<span style="text-align:right;">Resources</span>
|
<span>OS</span>
|
||||||
|
<span style="text-align:right;padding-right:1rem;">Resources</span>
|
||||||
<span>Disk</span>
|
<span>Disk</span>
|
||||||
<span style="text-align:right;">State</span>
|
<span style="text-align:right;">State</span>
|
||||||
</div>
|
</div>
|
||||||
HTML
|
HTML
|
||||||
|
|
||||||
vms.each do |vm|
|
vms.each do |vm|
|
||||||
name = CGI.escapeHTML(vm["name"].to_s)
|
name = CGI.escapeHTML(vm["name"].to_s)
|
||||||
os = vm["os"] ? CGI.escapeHTML(vm["os"]) : nil
|
os_name = vm["os_name"] ? CGI.escapeHTML(vm["os_name"]) : nil
|
||||||
state = vm["state"].to_s
|
state = vm["state"].to_s
|
||||||
state_cls = case state
|
state_cls = case state
|
||||||
when "running" then "ok"
|
when "running" then "ok"
|
||||||
@ -151,10 +152,11 @@ if cgi.params.key?("content")
|
|||||||
mem_b = vm["memory"].to_i
|
mem_b = vm["memory"].to_i
|
||||||
res = vcpus > 0 || mem_b > 0 ? "#{vcpus} CPU#{vcpus > 1 ? "s" : ""} · #{human_capacity(mem_b)}" : "—"
|
res = vcpus > 0 || mem_b > 0 ? "#{vcpus} CPU#{vcpus > 1 ? "s" : ""} · #{human_capacity(mem_b)}" : "—"
|
||||||
|
|
||||||
cap = vm["disk_total"].to_i
|
df = vm["df"] || []
|
||||||
used = vm["disk_used"].to_i
|
cap = df[0].to_i * 1024
|
||||||
dpct_f = cap > 0 ? (used * 100.0 / cap) : 0.0
|
used = df[1].to_i * 1024
|
||||||
dpct = dpct_f.round
|
dpct_f = cap > 0 ? (used * 100.0 / cap) : 0.0
|
||||||
|
dpct = dpct_f.round
|
||||||
disk_cls = dpct_f >= 90 ? "bad" : dpct_f >= 75 ? "warn" : "ok"
|
disk_cls = dpct_f >= 90 ? "bad" : dpct_f >= 75 ? "warn" : "ok"
|
||||||
|
|
||||||
disk_html = if cap > 0
|
disk_html = if cap > 0
|
||||||
@ -166,22 +168,35 @@ if cgi.params.key?("content")
|
|||||||
%(<div><span style="font-size:0.72rem;color:#475569;">—</span></div>)
|
%(<div><span style="font-size:0.72rem;color:#475569;">—</span></div>)
|
||||||
end
|
end
|
||||||
|
|
||||||
os_html = os ? %(<div style="font-size:0.67rem;color:#475569;">#{os}</div>) : ""
|
os_html = os_name ? os_name : ""
|
||||||
|
|
||||||
|
vm_stats = []
|
||||||
|
if updates = vm["updates"]
|
||||||
|
cls = updates == 0 ? "ok" : "warn"
|
||||||
|
vm_stats << [cls, "#{updates} update#{updates == 1 ? "" : "s"}"]
|
||||||
|
end
|
||||||
|
if reboot = vm["reboot_pending"]
|
||||||
|
vm_stats << ["warn", "Reboot pending"]
|
||||||
|
end
|
||||||
|
vm_stats_html = vm_stats.map { |c, txt|
|
||||||
|
%(<span class="stat #{c}">#{CGI.escapeHTML(txt)}</span>)
|
||||||
|
}.join
|
||||||
|
vm_stats_block = vm_stats.empty? ? "" :
|
||||||
|
%(<div class="drive-stats" style="margin-top:0.4rem;padding:0 0.6rem;">#{vm_stats_html}</div>)
|
||||||
|
|
||||||
html << <<~HTML
|
html << <<~HTML
|
||||||
<div class="subitem" style="flex-direction:column;align-items:stretch;gap:0.35rem;">
|
<div class="subitem" style="flex-direction:column;align-items:stretch;gap:0.35rem;">
|
||||||
<div style="display:grid;grid-template-columns:1fr 110px 1.2fr 100px;gap:0.5rem;align-items:center;">
|
<div style="display:grid;grid-template-columns:1fr 1fr 20ex 2fr 10ex;gap:0.5rem;align-items:center;">
|
||||||
<div class="subitem-left">
|
<div class="subitem-left">
|
||||||
<div class="dot #{state_cls}"></div>
|
<div class="dot #{state_cls}"></div>
|
||||||
<div>
|
<div class="subitem-name">#{name}</div>
|
||||||
<div class="subitem-name">#{name}</div>
|
|
||||||
#{os_html}
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
<div style="text-align:right;"><span class="subitem-value ok">#{CGI.escapeHTML(res)}</span></div>
|
<div class="subitem-name">#{os_html}</div>
|
||||||
|
<div style="text-align:right;padding-right:1rem;"><span class="subitem-value ok">#{CGI.escapeHTML(res)}</span></div>
|
||||||
#{disk_html}
|
#{disk_html}
|
||||||
<div style="text-align:right;"><span class="subitem-value #{state_cls}">#{state_label}</span></div>
|
<div style="text-align:right;"><span class="subitem-value #{state_cls}">#{state_label}</span></div>
|
||||||
</div>
|
</div>
|
||||||
|
#{vm_stats_block}
|
||||||
</div>
|
</div>
|
||||||
HTML
|
HTML
|
||||||
end
|
end
|
||||||
@ -281,13 +296,13 @@ if cgi.params.key?("content")
|
|||||||
html << %(<div class="section-label">File Systems</div>)
|
html << %(<div class="section-label">File Systems</div>)
|
||||||
html << %(<div class="stack">)
|
html << %(<div class="stack">)
|
||||||
filesystems.each do |entry|
|
filesystems.each do |entry|
|
||||||
mount = CGI.escapeHTML(entry["mount"].to_s)
|
mount = CGI.escapeHTML(entry["mount"].to_s)
|
||||||
source = CGI.escapeHTML(entry["source"].to_s)
|
source = CGI.escapeHTML(entry["source"].to_s)
|
||||||
fstype = CGI.escapeHTML(entry["fstype"].to_s)
|
fstype = CGI.escapeHTML(entry["fstype"].to_s)
|
||||||
size_b = entry["size"].to_i
|
size_b = entry["size"].to_i
|
||||||
used_b = entry["used"].to_i
|
used_b = entry["used"].to_i
|
||||||
pct_f = size_b > 0 ? (used_b * 100.0 / size_b) : 0.0
|
pct_f = size_b > 0 ? (used_b * 100.0 / size_b) : 0.0
|
||||||
pct = pct_f.round
|
pct = pct_f.round
|
||||||
space_cls = pct_f >= 90 ? "bad" : pct_f >= 75 ? "warn" : "ok"
|
space_cls = pct_f >= 90 ? "bad" : pct_f >= 75 ? "warn" : "ok"
|
||||||
used_h = CGI.escapeHTML(human_capacity(used_b))
|
used_h = CGI.escapeHTML(human_capacity(used_b))
|
||||||
size_h = CGI.escapeHTML(human_capacity(size_b))
|
size_h = CGI.escapeHTML(human_capacity(size_b))
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user