// 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.NewGenericWindow("Virtigo: (inventory your cluster)", "Local Cluster Settings") mainWindow.Custom = func() { log.Warn("Main window close") os.Exit(0) } drawWindow(mainWindow) // sits here forever debug() } func drawWindow(win *gadgets.GenericWindow) { grid := win.Group.RawGrid() /* var hyperWin *gadgets.GenericWindow grid.NewButton("hypervisors", func() { if hyperWin != nil { hyperWin.Toggle() return } hyperWin = makeHypervisorsWindow(me.cluster.H) }) */ var newHyperWin *stdHypervisorTableWin grid.NewButton("show hypervisors", func() { if newHyperWin != nil { log.Info("redraw hypervisors") newHyperWin.doNewStdHypervisors(me.cluster.H) return } log.Info("Hypervisors len=", me.cluster.H.Len()) newHyperWin = newHypervisorsWindow() newHyperWin.doNewStdHypervisors(me.cluster.H) newHyperWin.win.Custom = func() { log.Info("hiding table window") } }) var dropWin *gadgets.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 ewin *stdEventTableWin grid.NewButton("events", func() { if ewin != nil { log.Info("update events here") e := me.cluster.GetEventsPB() log.Info("Events len=", e.Len()) ewin.doStdEvents(e) return } ewin = newEventsWindow() ewin.win.Custom = func() { log.Info("hiding table window") } e := me.cluster.GetEventsPB() log.Info("Events len=", e.Len()) ewin.doStdEvents(e) }) grid.NextRow() grid.NewButton("ConfigSave()", func() { log.Info("todo: make code for this") }) var testWin *gadgets.GenericWindow grid.NewButton("create droplet", func() { if testWin != nil { testWin.Toggle() return } d := me.cluster.GetDropletsPB() testWin, _ = makeDropletsWindow(d) }) grid.NewButton("uptime", func() { updateUptimeGui("kuma uptime should update this") }) grid.NextRow() grid = win.Middle.RawGrid() me.status = grid.NewLabel("cur status") grid.NextRow() me.lastuptime = grid.NewLabel("last uptime") grid.NextRow() } 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) (*gadgets.GenericWindow, *virtpb.DropletsTable) { win := gadgets.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.AddSpicePort() 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 makeEventsWindow(pb *virtpb.Events) *gadgets.GenericWindow { win := gadgets.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 }