Every template and handler message in internal/web goes through a JSON
catalogue under internal/web/locales/<code>/, with English as the fallback.
The language is the person's choice (a cookie set by /_lang/{code}), else
Accept-Language, else landing.language. Tests refuse a key some language
lacks, a translation with other arguments than English, and template text
left in English.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
57 lines
1.3 KiB
Go
57 lines
1.3 KiB
Go
package web
|
|
|
|
import (
|
|
"net/http"
|
|
"time"
|
|
|
|
"gitea.mynodes.xyz/ilker/llmgw/internal/control/nvlink"
|
|
)
|
|
|
|
// NVLinkSource is a Source that can report multi-node NVLink domains.
|
|
type NVLinkSource interface {
|
|
NVLink() nvlink.Report
|
|
}
|
|
|
|
type nvlinkPageData struct {
|
|
Nav Nav
|
|
OnAdminListener bool
|
|
Nodes string
|
|
Domains []nvlinkDomainView
|
|
Problems []nvlink.Problem
|
|
Version, Now string
|
|
}
|
|
|
|
type nvlinkDomainView struct {
|
|
nvlink.Domain
|
|
Short string
|
|
Problems []nvlink.Problem
|
|
}
|
|
|
|
// NVLinkPage shows every multi-node NVLink domain as a rack of trays.
|
|
func NVLinkPage(src Source, onAdminListener bool, version string) http.HandlerFunc {
|
|
return func(w http.ResponseWriter, r *http.Request) {
|
|
ns, ok := src.(NVLinkSource)
|
|
if !ok {
|
|
http.NotFound(w, r)
|
|
return
|
|
}
|
|
rep := ns.NVLink()
|
|
d := nvlinkPageData{Nav: navFrom(r, "cluster"), OnAdminListener: onAdminListener, Nodes: "/admin/nodes",
|
|
Problems: rep.Problems, Version: version, Now: time.Now().UTC().Format(time.RFC3339)}
|
|
if onAdminListener {
|
|
d.Nodes = "/nodes"
|
|
}
|
|
for _, dom := range rep.Domains {
|
|
v := nvlinkDomainView{Domain: dom, Short: nvlink.Short(dom.Key)}
|
|
for _, p := range rep.Problems {
|
|
if p.Domain == dom.Key {
|
|
v.Problems = append(v.Problems, p)
|
|
}
|
|
}
|
|
d.Domains = append(d.Domains, v)
|
|
}
|
|
noStore(w)
|
|
render(w, r, "nvlink", d)
|
|
}
|
|
}
|