diff options
| author | Jeff Carr <[email protected]> | 2025-03-11 03:34:30 -0500 | 
|---|---|---|
| committer | Jeff Carr <[email protected]> | 2025-03-11 03:34:30 -0500 | 
| commit | d2d04da1228d36cfddc0cda357a2037ea7897345 (patch) | |
| tree | ad0143fff7511d3d8e87ae5ab45682b6c1562f4b | |
| parent | e0970840e20a27fc80f4e93ea2a30761fdc032e8 (diff) | |
cleaner droplet table views
| -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)  }  | 
