248 lines
5.5 KiB
Go
248 lines
5.5 KiB
Go
// Copyright 2017-2025 WIT.COM Inc. All rights reserved.
|
|
// Use of this source code is governed by the GPL 3.0
|
|
|
|
package main
|
|
|
|
// An app to submit patches for the 30 GO GUI repos
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"strings"
|
|
"time"
|
|
|
|
"go.wit.com/gui"
|
|
"go.wit.com/lib/gadgets"
|
|
"go.wit.com/lib/protobuf/virtpb"
|
|
"go.wit.com/log"
|
|
)
|
|
|
|
func debug() {
|
|
for {
|
|
time.Sleep(90 * time.Second)
|
|
// log.Info("TODO: use this?")
|
|
}
|
|
}
|
|
|
|
func doGui() {
|
|
me.myGui = gui.New()
|
|
me.myGui.InitEmbed(resources)
|
|
me.myGui.Default()
|
|
|
|
mainWindow := gadgets.RawBasicWindow("Virtigo: (inventory your cluster)")
|
|
mainWindow.Make()
|
|
mainWindow.Show()
|
|
mainWindow.Custom = func() {
|
|
log.Warn("Main window close")
|
|
os.Exit(0)
|
|
}
|
|
|
|
drawWindow(mainWindow)
|
|
|
|
// sits here forever
|
|
debug()
|
|
|
|
}
|
|
|
|
func drawWindow(win *gadgets.BasicWindow) {
|
|
box := win.Box()
|
|
|
|
vbox := box.NewVerticalBox("BOX2")
|
|
|
|
group1 := vbox.NewGroup("Virtigo Settings")
|
|
grid := group1.NewGrid("buildOptions", 0, 0)
|
|
|
|
var hyperWin *GenericWindow
|
|
grid.NewButton("hypervisors", func() {
|
|
if hyperWin != nil {
|
|
hyperWin.Toggle()
|
|
return
|
|
}
|
|
hyperWin = makeHypervisorsWindow(me.cluster.H)
|
|
})
|
|
|
|
var dropWin *GenericWindow
|
|
grid.NewButton("droplets", func() {
|
|
if dropWin != nil {
|
|
dropWin.Toggle()
|
|
return
|
|
}
|
|
d := me.cluster.GetDropletsPB()
|
|
var found *virtpb.Droplets
|
|
found = virtpb.NewDroplets()
|
|
all := d.All()
|
|
for all.Scan() {
|
|
vm := all.Next()
|
|
if vm.Current.State != virtpb.DropletState_ON {
|
|
continue
|
|
}
|
|
found.Append(vm)
|
|
}
|
|
dropWin, _ = makeDropletsWindow(found)
|
|
dropWin.Win.Custom = func() {
|
|
log.Info("hiding droplet table window")
|
|
}
|
|
})
|
|
|
|
var eventWin *GenericWindow
|
|
grid.NewButton("events)", func() {
|
|
log.Info("todo: make code for this")
|
|
if eventWin != nil {
|
|
eventWin.Toggle()
|
|
return
|
|
}
|
|
e := me.cluster.GetEventsPB()
|
|
eventWin = makeEventsWindow(e)
|
|
})
|
|
|
|
grid.NewButton("ConfigSave()", func() {
|
|
log.Info("todo: make code for this")
|
|
})
|
|
|
|
var testWin *GenericWindow
|
|
grid.NewButton("create droplet", func() {
|
|
if testWin != nil {
|
|
testWin.Toggle()
|
|
return
|
|
}
|
|
d := me.cluster.GetDropletsPB()
|
|
testWin, _ = makeDropletsWindow(d)
|
|
})
|
|
grid.NextRow()
|
|
|
|
me.status = grid.NewLabel("cur status")
|
|
grid.NextRow()
|
|
me.lastuptime = grid.NewLabel("last uptime")
|
|
grid.NextRow()
|
|
|
|
grid.NewButton("uptime", func() {
|
|
updateUptimeGui("kuma uptime should update this")
|
|
})
|
|
}
|
|
|
|
func updateUptimeGui(uptime string) {
|
|
me.status.SetLabel(uptime)
|
|
|
|
datestamp := time.Now().Format("2006-01-02 15:04:03")
|
|
me.lastuptime.SetLabel("last uptime at " + datestamp)
|
|
}
|
|
|
|
func makeDropletsWindow(pb *virtpb.Droplets) (*GenericWindow, *virtpb.DropletsTable) {
|
|
win := NewGenericWindow("Droplets registered with Virtigo", "Buttons of things")
|
|
t := pb.NewTable("testDroptable")
|
|
t.NewUuid()
|
|
|
|
grid := win.Group.RawGrid()
|
|
grid.NewButton("Create", func() {
|
|
log.Info("todo: open create window here")
|
|
})
|
|
grid.NewButton("Show All", func() {
|
|
log.Info("todo")
|
|
})
|
|
|
|
/*
|
|
grid.NewButton("Update", func() {
|
|
t.Update()
|
|
})
|
|
*/
|
|
|
|
tbox := win.Bottom.Box()
|
|
t.SetParent(tbox)
|
|
t.AddHostname()
|
|
t.AddStringFunc("location", func(d *virtpb.Droplet) string {
|
|
return d.Current.Hypervisor
|
|
})
|
|
t.AddMemory()
|
|
t.AddCpus()
|
|
t.AddTimeFunc("age", func(d *virtpb.Droplet) time.Time {
|
|
age := d.Current.OnSince.AsTime()
|
|
log.Info("age", d.Hostname, virtpb.FormatDuration(time.Since(age)))
|
|
return age
|
|
})
|
|
t.AddStringFunc("State", func(d *virtpb.Droplet) string {
|
|
if d.Current.State == virtpb.DropletState_ON {
|
|
return "ON"
|
|
}
|
|
if d.Current.State == virtpb.DropletState_OFF {
|
|
return "OFF"
|
|
}
|
|
return "UNKNOWN"
|
|
})
|
|
t.AddStringFunc("mac addr", func(d *virtpb.Droplet) string {
|
|
var macs []string
|
|
for _, n := range d.Networks {
|
|
macs = append(macs, n.Mac)
|
|
}
|
|
tmp := strings.Join(macs, "\n")
|
|
return strings.TrimSpace(tmp)
|
|
})
|
|
t.ShowTable()
|
|
return win, t
|
|
}
|
|
|
|
func makeHypervisorsWindow(pb *virtpb.Hypervisors) *GenericWindow {
|
|
win := NewGenericWindow("Hypervisors registered with Virtigo", "Buttons of things")
|
|
t := pb.NewTable("testHyper")
|
|
grid := win.Group.RawGrid()
|
|
grid.NewButton("List", func() {
|
|
log.Info("list...")
|
|
})
|
|
/*
|
|
grid.NewButton("Update", func() {
|
|
t.Update()
|
|
})
|
|
*/
|
|
|
|
tbox := win.Bottom.Box() // a vertical box (like a stack of books)
|
|
t.NewUuid()
|
|
t.SetParent(tbox)
|
|
t.AddHostname()
|
|
t.AddMemory()
|
|
t.AddCpus()
|
|
t.AddTimeFunc("last poll", func(h *virtpb.Hypervisor) time.Time {
|
|
hm := me.hmap[h]
|
|
tmp := hm.lastpoll
|
|
log.Info("poll age", h.Hostname, virtpb.FormatDuration(time.Since(tmp)))
|
|
return tmp
|
|
})
|
|
t.AddKillcount()
|
|
t.AddStringFunc("droplets", func(h *virtpb.Hypervisor) string {
|
|
var totalDroplets int
|
|
var totalUnknownDroplets int
|
|
// dur := time.Since(h.lastpoll)
|
|
// tmp := virtpb.FormatDuration(dur)
|
|
// fmt.Fprintln(w, h.pb.Hostname, "killcount =", h.killcount, "lastpoll:", tmp)
|
|
hm := me.hmap[h]
|
|
for name, _ := range hm.lastDroplets {
|
|
totalDroplets += 1
|
|
d := me.cluster.FindDropletByName(name)
|
|
if d == nil {
|
|
totalUnknownDroplets += 1
|
|
}
|
|
}
|
|
log.Printf("Total Droplets %d total libvirt only droplets = %d\n", totalDroplets, totalUnknownDroplets)
|
|
return fmt.Sprintf("%d", totalDroplets)
|
|
})
|
|
t.ShowTable()
|
|
return win
|
|
}
|
|
|
|
func makeEventsWindow(pb *virtpb.Events) *GenericWindow {
|
|
win := NewGenericWindow("Cluster Events", "Buttons of things")
|
|
grid := win.Group.RawGrid()
|
|
grid.NewButton("List", func() {
|
|
log.Info("list...")
|
|
})
|
|
tmp := fmt.Sprintf("num of events = %d", pb.Len())
|
|
grid.NewLabel(tmp)
|
|
|
|
tbox := win.Bottom.Box() // a vertical box (like a stack of books)
|
|
t := pb.NewTable("test 2")
|
|
t.NewUuid()
|
|
t.SetParent(tbox)
|
|
t.AddDroplet()
|
|
t.AddHypervisor()
|
|
t.ShowTable()
|
|
return win
|
|
}
|