summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doAdminGui.go113
-rw-r--r--doGui.go1
-rw-r--r--main.go3
-rw-r--r--structs.go4
-rw-r--r--windowDroplets.go160
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)
}
}
diff --git a/doGui.go b/doGui.go
index 4879a8f..f94a768 100644
--- a/doGui.go
+++ b/doGui.go
@@ -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)))
diff --git a/main.go b/main.go
index 843278e..e34750b 100644
--- a/main.go
+++ b/main.go
@@ -38,7 +38,8 @@ func main() {
}
if argv.Server != "" {
- doAdminGui()
+ me.admin = new(adminT)
+ me.admin.doAdminGui()
okExit("admin close")
}
diff --git a/structs.go b/structs.go
index 4075227..33708c3 100644
--- a/structs.go
+++ b/structs.go
@@ -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)
}