diff options
| -rw-r--r-- | doAdminGui.go | 113 | ||||
| -rw-r--r-- | doGui.go | 1 | ||||
| -rw-r--r-- | main.go | 3 | ||||
| -rw-r--r-- | structs.go | 4 | ||||
| -rw-r--r-- | windowDroplets.go | 160 |
5 files changed, 197 insertions, 84 deletions
diff --git a/doAdminGui.go b/doAdminGui.go index ef20521..56cec06 100644 --- a/doAdminGui.go +++ b/doAdminGui.go @@ -21,16 +21,52 @@ import ( ) // refresh the windows & tables the user has open -func refresh() { - time.Sleep(90 * time.Second) +func (admin *adminT) refresh() { if argv.Verbose { log.Info("virtigo scan here") } + + url := argv.Server + msg := []byte(`{"message": "Hello"}`) + + // display the uptime + if data, err := postData(url+"/uptime", msg); err != nil { + log.Info("Error:", err) + } else { + log.Info("Response:", string(data)) + admin.uptime.SetText(string(data)) + } + + // update the droplet list + if data, err := postData(url+"/DropletsPB", msg); err != nil { + log.Info("Error:", err) + } else { + fmt.Println("Response len:", len(data)) + admin.droplets = new(virtpb.Droplets) + if err := admin.droplets.Unmarshal(data); err != nil { + fmt.Println("marshal failed", err) + return + } + fmt.Println("Droplet len=", admin.droplets.Len()) + } + + // update the hypervisor list + if data, err := postData(url+"/HypervisorPB", msg); err != nil { + log.Info("Error:", err) + } else { + fmt.Println("Response len:", len(data)) + admin.hypervisors = new(virtpb.Hypervisors) + if err := admin.hypervisors.Unmarshal(data); err != nil { + fmt.Println("marshal failed", err) + return + } + fmt.Println("Hypervisors len=", admin.hypervisors.Len()) + } } var client *http.Client -func doAdminGui() { +func (admin *adminT) doAdminGui() { me.myGui = gui.New() me.myGui.InitEmbed(resources) me.myGui.Default() @@ -49,39 +85,26 @@ func doAdminGui() { os.Exit(0) } - grid := win.Group.RawGrid() + admin.uptime = win.Group.NewLabel("uptime") - // url := "http://example.com/endpoint" - url := argv.Server - data := []byte(`{"message": "Hello"}`) + grid := win.Group.RawGrid() grid.NewButton("show hypervisors", func() { - response, err := postData(url, data) - if err != nil { - fmt.Println("Error:", err) - } else { - fmt.Println("Response:", string(response)) + if admin.hypervisors == nil { + log.Info("hypervisors not initialized") + return } + log.Info("Hypervisors len=", admin.hypervisors.Len()) }) - grid.NewButton("show droplets", func() { - durl := url + "/DropletsPB" - data, err := postData(durl, data) - if err != nil { - fmt.Println("Error:", err) - return - } - fmt.Println("Response len:", len(data)) - me.droplets = new(virtpb.Droplets) - if err := me.droplets.Unmarshal(data); err != nil { - fmt.Println("marshal failed", err) + grid.NewButton("show active droplets", func() { + if admin.droplets == nil { + log.Info("droplets not initialized") return } - fmt.Println("Droplet len=", me.droplets.Len()) - var found *virtpb.Droplets found = virtpb.NewDroplets() - all := me.droplets.All() + all := admin.droplets.All() for all.Scan() { vm := all.Next() if vm.Current.State != virtpb.DropletState_ON { @@ -89,29 +112,47 @@ func doAdminGui() { } found.Append(vm) } - dropWin, _ := makeDropletsWindow(found) - dropWin.Win.Custom = func() { + dropWin := newDropletsWindow() + dropWin.doActiveDroplets(found) + dropWin.win.Custom = func() { log.Info("hiding droplet table window") } }) - grid.NewButton("uptime", func() { - durl := url + "/uptime" - response, err := postData(durl, data) - if err != nil { - fmt.Println("Error:", err) - } else { - fmt.Println("Response:", string(response)) + grid.NewButton("inactive droplets", func() { + if admin.droplets == nil { + log.Info("droplets not initialized") + return + } + var found *virtpb.Droplets + found = virtpb.NewDroplets() + all := admin.droplets.All() + for all.Scan() { + vm := all.Next() + if vm.Current.State == virtpb.DropletState_ON { + continue + } + found.Append(vm) + } + dropWin := newDropletsWindow() + dropWin.doInactiveDroplets(found) + dropWin.win.Custom = func() { + log.Info("hiding droplet table window") } }) + grid.NextRow() + grid.NewButton("refresh", func() { + admin.refresh() + }) grid.NewButton("clean exit", func() { okExit("admin close") }) // sit here forever refreshing the GUI for { - refresh() + admin.refresh() + time.Sleep(90 * time.Second) } } @@ -154,6 +154,7 @@ func makeDropletsWindow(pb *virtpb.Droplets) (*GenericWindow, *virtpb.DropletsTa }) 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))) @@ -38,7 +38,8 @@ func main() { } if argv.Server != "" { - doAdminGui() + me.admin = new(adminT) + me.admin.doAdminGui() okExit("admin close") } @@ -36,11 +36,15 @@ type virtigoT struct { missingDropletTimeout time.Duration // how long a droplet can be missing for status *gui.Node // the cluster status lastuptime *gui.Node // the last time uptime was checked by Kuma + admin *adminT // the admin struct +} +type adminT struct { // admin mode droplets *virtpb.Droplets // your droplets hypervisors *virtpb.Hypervisors // yep events *virtpb.Events // yep + uptime *gui.Node // the uptime message } // the stuff that is needed for a hypervisor diff --git a/windowDroplets.go b/windowDroplets.go index 7bcf456..b7350df 100644 --- a/windowDroplets.go +++ b/windowDroplets.go @@ -4,7 +4,9 @@ package main import ( + "strings" "sync" + "time" "go.wit.com/gui" "go.wit.com/lib/gadgets" @@ -16,6 +18,7 @@ type stdDropletTableWin struct { sync.Mutex win *gadgets.GenericWindow // the machines gui window box *gui.Node // the machines gui parent box widget + pb *virtpb.Droplets // the droplets protobuf TB *virtpb.DropletsTable // the gui table buffer update bool // if the window should be updated } @@ -30,39 +33,29 @@ func (w *stdDropletTableWin) Toggle() { w.win.Toggle() } -func makeDropletsWin() *stdDropletTableWin { +func newDropletsWindow() *stdDropletTableWin { dwin := new(stdDropletTableWin) - dwin.win = gadgets.NewGenericWindow("virtigo current droplets", "who is squirreling around?") + dwin.win = gadgets.NewGenericWindow("virtigo current droplets", "") dwin.win.Custom = func() { log.Info("test delete window here") } - grid := dwin.win.Group.RawGrid() - grid.NewButton("show droplets", func() { - var count int - found := virtpb.NewDroplets() - all := me.droplets.All() - for all.Scan() { - e := all.Next() - count += 1 - found.Append(e) - if count > 20 { - break - } - } - dwin.doDropletsTable(found) - }) + // make a box at the bottom of the window for the protobuf table + dwin.box = dwin.win.Bottom.Box().SetProgName("TBOX") + return dwin +} - /* - grid.NewButton("Save Current", func() { - log.Info("droplets len =", me.droplets.Len()) - me.droplets.Save() - }) - */ +func makeWindownDropletsPB(pb *virtpb.Droplets) *stdDropletTableWin { + dwin := new(stdDropletTableWin) + dwin.win = gadgets.NewGenericWindow("virtigo current droplets", "") + dwin.win.Custom = func() { + log.Info("test delete window here") + } // make a box at the bottom of the window for the protobuf table dwin.box = dwin.win.Bottom.Box().SetProgName("TBOX") - // doTable(me.droplets) + + dwin.doDropletsTable(pb) return dwin } @@ -76,7 +69,7 @@ func (dwin *stdDropletTableWin) doDropletsTable(currentDroplets *virtpb.Droplets } // display the protobuf - dwin.TB = AddDropletsPB(dwin.box, currentDroplets) + dwin.TB = addDropletsPB(dwin.box, currentDroplets) f := func(e *virtpb.Droplet) { log.Info("Triggered. do something here", e.Hostname) // m.Enabled = true @@ -84,34 +77,107 @@ func (dwin *stdDropletTableWin) doDropletsTable(currentDroplets *virtpb.Droplets dwin.TB.Custom(f) } -func AddDropletsPB(tbox *gui.Node, pb *virtpb.Droplets) *virtpb.DropletsTable { +func addDropletsPB(tbox *gui.Node, pb *virtpb.Droplets) *virtpb.DropletsTable { t := pb.NewTable("DropletsPB") t.NewUuid() t.SetParent(tbox) - /* - ctimef := func(e *virtpb.Droplet) string { - ctime := e.Ctime.AsTime() - return ctime.Format("2006/01/02 15:04") - } - t.AddStringFunc("ctime", ctimef) + vp := t.AddButtonFunc("start", func(p *virtpb.Droplet) string { + return "poweron" + }) + vp.Custom = func(d *virtpb.Droplet) { + log.Info("power on the droplet here:", d.Hostname) + } + t.AddHostname() + t.AddMemory() + t.AddCpus() + t.ShowTable() + return t +} - etimef := func(e *virtpb.Droplet) string { - etime := e.Etime.AsTime() - s := etime.Format("2006/01/02 15:04") - if strings.HasPrefix(s, "1970/") { - // just show a blank if it's not set - return "" - } - return s - } - t.AddStringFunc("etime", etimef) - */ +// default window for active running droplets +func (dw *stdDropletTableWin) doInactiveDroplets(pb *virtpb.Droplets) { + dw.Lock() + defer dw.Unlock() + + // erase the old table + if dw.TB != nil { + dw.TB.Delete() + dw.TB = nil + } + + // init the table + dw.pb = pb + t := dw.pb.NewTable("DropletsPB Off") + t.NewUuid() + t.SetParent(dw.box) + + // pick the columns + t.AddHostname() + t.AddMemory() + t.AddCpus() + // final setup and display the table + dw.TB = t + f := func(e *virtpb.Droplet) { + log.Info("Triggered. do something here", e.Hostname) + // m.Enabled = true + } + dw.TB.Custom(f) + dw.TB.ShowTable() +} + +// default window for active running droplets +func (dw *stdDropletTableWin) doActiveDroplets(pb *virtpb.Droplets) { + dw.Lock() + defer dw.Unlock() + if dw.TB != nil { + dw.TB.Delete() + dw.TB = nil + } + + dw.pb = pb + + t := dw.pb.NewTable("DropletsPB On") + t.NewUuid() + + t.SetParent(dw.box) t.AddHostname() - // t.AddAddress() - // t.AddWhere() - // t.AddLocalPort() + 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 t + + // display the protobuf + dw.TB = t + f := func(e *virtpb.Droplet) { + log.Info("Triggered. do something here", e.Hostname) + // m.Enabled = true + } + dw.TB.Custom(f) } |
