Skip to content

ovtools v0.4.0

Choose a tag to compare

@linuxelitebr linuxelitebr released this 24 May 03:25
· 2 commits to main since this release

[0.4.0] 2026-05-23

Added

  • Ceph health card on the Health tab. Auto-detected. If Prometheus is federating the Ceph metrics (HEALTH_OK / WARN / ERR, OSD status, PG degradation, recent crashes, near-full pools), every firing health check shows up as a row with severity, plain-English explanation and a link to the upstream docs anchor. Nothing shows up on clusters without Ceph; no flag, no extra config.
  • Tri-state Prometheus connection indicator (green, yellow, red). Green is data flowing. Yellow is the half-failure case: Prometheus answers HTTP but the kubevirt or node-exporter scrape pool dropped, so every metric column would render as -. Red is the endpoint not answering at all. The previous indicator only had green or red, so a degraded Prometheus showed up as "connected" while the dashboard quietly emptied out.
  • Banner above the VMs and Nodes tabs when Prometheus is reachable but returning no scrape data. Spells out the likely cause (degraded prometheus-k8s pod, missing ServiceMonitor) so the operator knows where to look instead of blaming ovtools.
  • Top dashboard cards are now clickable. Total VMs, Running, Stopped, vCPUs Allocated, Nodes, Old Snapshots, Health Issues each navigate to the matching tab with the right filter pre-applied. Keyboard-accessible (Tab + Enter).
  • Persistent banner when the connected cluster has no KubeVirt installed. Explains that ovtools is built for OpenShift Virtualization and most tabs will be empty otherwise. Dismissal is per-cluster, so connecting to a different cluster without KubeVirt brings it back.
  • Tooltip on the Datastores tab explaining why Used % can exceed 100 % when two StorageClasses share the same Ceph pool. Lists which other StorageClasses share the pool so the user can do the math.

Fixed

  • Column chooser silently broke after revisiting a tab. The inline <script> re-declared a top-level const, threw SyntaxError on every subsequent load, and the rest of the script never ran. Symptom: clicking a checkbox rerouted the page to the VMs tab. Tab templates now wrap their scripts in IIFEs.
  • Bar clicks on "VMs per Node", "vCPU Allocation per Node" and "Memory Allocation per Node" routed to an empty VMs tab because the node label was truncated for the chart axis and then reused as the filter target. The click handler now sends the full FQDN.
  • VM disks created from instance-type DataSources were misclassified as "Template" on the PVCs tab. The CDI controller propagates the template label onto every cloned disk, so the heuristic was catching every running VM's root disk. Fixed to only count canonical template PVCs.
  • Topology view switcher crashed with TypeError: data.edges is null on clusters with no matching resources. The Go handlers returned nil slices that JSON encoded as null. They now always return arrays.
  • Cytoscape threw renderer is null after navigating away from the Topology tab because a queued resize callback fired on a destroyed instance. The callback now checks cy.destroyed() before touching the renderer.
  • Chart.js threw Canvas is already in use after coming back to the Dashboard. Orphaned chart instances from earlier renders stayed in the registry and conflicted with the new canvases. The dashboard now sweeps every live Chart.js instance before creating new ones.
  • Tab swaps flashed the loading overlay for a single frame on every cached response. The cache serves a tab in roughly 5 ms; the overlay went on and off inside the same paint window, which the eye reads as flicker. The spinner is now deferred and only paints if the load actually takes longer than 200 ms.

Improved

  • Auto-refresh on tabs with thousands of rows no longer rebuilds the entire DOM every 60 seconds. The refresh path uses morph; only changed cells get updated, the rest stay in place. Tab switches still use a clean swap so listeners do not leak between tabs.
  • Stale-while-revalidate is now formally documented in CLAUDE.md as a non-negotiable, with tests that fail if a handler bypasses the cache or talks to Prometheus or the k8s API on the render path.
  • Most of the per-tab UI plumbing moved into shared static modules (col-chooser.js, row-count.js). Each tab template now declares its configuration via data-* attributes instead of carrying its own 80-line copy of the same JS. The browser caches one module instead of re-parsing inline blocks on every swap.

Removed

  • Per-PVC Block usage via rbd du. The original v0.4.0 plan called for filling in the - placeholder on Block-mode PVCs by talking to the Ceph MGR. After verifying against ODF 4.21, the only path that does not require either a CLI flag (rejected) or a librados dependency on the ovtools side was to expose ceph_rbd_image_used_bytes from the MGR Prometheus module, which ODF does not emit. The placeholder stays. Documented in docs/ENTERPRISE_ROADMAP.md along with the conditions under which the item could come back.