Unmarshal() droplets
This commit is contained in:
parent
f9515280cf
commit
68bf08bd6c
4
Makefile
4
Makefile
|
@ -13,11 +13,11 @@ build: goimports vet
|
||||||
GO111MODULE=off go build \
|
GO111MODULE=off go build \
|
||||||
-ldflags "-X main.VERSION=${VERSION} -X main.BUILDTIME=${BUILDTIME} -X gui.GUIVERSION=${VERSION}"
|
-ldflags "-X main.VERSION=${VERSION} -X main.BUILDTIME=${BUILDTIME} -X gui.GUIVERSION=${VERSION}"
|
||||||
|
|
||||||
verbose:
|
verbose: goimports vet
|
||||||
GO111MODULE=off go build -v -x \
|
GO111MODULE=off go build -v -x \
|
||||||
-ldflags "-X main.VERSION=${VERSION} -X main.BUILDTIME=${BUILDTIME} -X gui.GUIVERSION=${VERSION}"
|
-ldflags "-X main.VERSION=${VERSION} -X main.BUILDTIME=${BUILDTIME} -X gui.GUIVERSION=${VERSION}"
|
||||||
|
|
||||||
install:
|
install: goimports vet
|
||||||
GO111MODULE=off go install -v -x \
|
GO111MODULE=off go install -v -x \
|
||||||
-ldflags "-X main.VERSION=${VERSION} -X main.BUILDTIME=${BUILDTIME} -X gui.GUIVERSION=${VERSION}"
|
-ldflags "-X main.VERSION=${VERSION} -X main.BUILDTIME=${BUILDTIME} -X gui.GUIVERSION=${VERSION}"
|
||||||
|
|
||||||
|
|
104
doAdminGui.go
104
doAdminGui.go
|
@ -6,11 +6,17 @@ package main
|
||||||
// An app to submit patches for the 30 GO GUI repos
|
// An app to submit patches for the 30 GO GUI repos
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bytes"
|
||||||
|
"fmt"
|
||||||
|
"io/ioutil"
|
||||||
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
|
"os/user"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"go.wit.com/gui"
|
"go.wit.com/gui"
|
||||||
"go.wit.com/lib/gadgets"
|
"go.wit.com/lib/gadgets"
|
||||||
|
"go.wit.com/lib/protobuf/virtpb"
|
||||||
"go.wit.com/log"
|
"go.wit.com/log"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -22,11 +28,21 @@ func refresh() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var client *http.Client
|
||||||
|
|
||||||
func doAdminGui() {
|
func doAdminGui() {
|
||||||
me.myGui = gui.New()
|
me.myGui = gui.New()
|
||||||
me.myGui.InitEmbed(resources)
|
me.myGui.InitEmbed(resources)
|
||||||
me.myGui.Default()
|
me.myGui.Default()
|
||||||
|
|
||||||
|
// Initialize a persistent client with a custom Transport
|
||||||
|
client = &http.Client{
|
||||||
|
Transport: &http.Transport{
|
||||||
|
DisableKeepAlives: false, // Ensure Keep-Alive is enabled
|
||||||
|
},
|
||||||
|
Timeout: 10 * time.Second, // Set a reasonable timeout
|
||||||
|
}
|
||||||
|
|
||||||
win := gadgets.NewGenericWindow("Virtigo: (run your cluster)", "virtigo stuff")
|
win := gadgets.NewGenericWindow("Virtigo: (run your cluster)", "virtigo stuff")
|
||||||
win.Custom = func() {
|
win.Custom = func() {
|
||||||
log.Warn("Main window close")
|
log.Warn("Main window close")
|
||||||
|
@ -35,10 +51,53 @@ func doAdminGui() {
|
||||||
|
|
||||||
grid := win.Group.RawGrid()
|
grid := win.Group.RawGrid()
|
||||||
|
|
||||||
grid.NewButton("show hyperbisors", func() {
|
// url := "http://example.com/endpoint"
|
||||||
|
url := argv.Server
|
||||||
|
data := []byte(`{"message": "Hello"}`)
|
||||||
|
|
||||||
|
grid.NewButton("show hypervisors", func() {
|
||||||
|
response, err := postData(url, data)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println("Error:", err)
|
||||||
|
} else {
|
||||||
|
fmt.Println("Response:", string(response))
|
||||||
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
grid.NewButton("show droplets", func() {
|
grid.NewButton("show droplets", func() {
|
||||||
|
durl := url + "/dumpdroplets"
|
||||||
|
response, err := postData(durl, data)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println("Error:", err)
|
||||||
|
} else {
|
||||||
|
fmt.Println("Response:", string(response))
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
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("get DropletsPB", 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)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
fmt.Println("Droplet len=", me.droplets.Len())
|
||||||
})
|
})
|
||||||
|
|
||||||
grid.NewButton("clean exit", func() {
|
grid.NewButton("clean exit", func() {
|
||||||
|
@ -50,3 +109,46 @@ func doAdminGui() {
|
||||||
refresh()
|
refresh()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func postData(url string, data []byte) ([]byte, error) {
|
||||||
|
req, err := http.NewRequest(http.MethodPost, url, bytes.NewBuffer(data))
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to create request: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
usr, _ := user.Current()
|
||||||
|
req.Header.Set("author", usr.Username)
|
||||||
|
req.Header.Set("Connection", "keep-alive") // Ensure keep-alive is used
|
||||||
|
|
||||||
|
resp, err := client.Do(req)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("request failed: %w", err)
|
||||||
|
}
|
||||||
|
defer resp.Body.Close()
|
||||||
|
|
||||||
|
body, err := ioutil.ReadAll(resp.Body)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to read response: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return body, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
func main() {
|
||||||
|
url := "http://example.com/endpoint"
|
||||||
|
data := []byte(`{"message": "Hello"}`)
|
||||||
|
|
||||||
|
ticker := time.NewTicker(1 * time.Minute)
|
||||||
|
defer ticker.Stop()
|
||||||
|
|
||||||
|
for range ticker.C {
|
||||||
|
response, err := postData(url, data)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println("Error:", err)
|
||||||
|
} else {
|
||||||
|
fmt.Println("Response:", string(response))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
|
@ -0,0 +1,84 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
// RFC implementation
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
"io/ioutil"
|
||||||
|
"net"
|
||||||
|
"net/http"
|
||||||
|
"os/user"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Function to create a persistent TCP connection
|
||||||
|
func createPersistentConnection(host string) (net.Conn, error) {
|
||||||
|
dialer := &net.Dialer{
|
||||||
|
Timeout: 10 * time.Second,
|
||||||
|
KeepAlive: 30 * time.Second,
|
||||||
|
}
|
||||||
|
conn, err := dialer.Dial("tcp", host)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to establish connection: %w", err)
|
||||||
|
}
|
||||||
|
return conn, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func mesocket() {
|
||||||
|
host := "example.com:80"
|
||||||
|
|
||||||
|
// Establish a persistent TCP connection
|
||||||
|
conn, err := createPersistentConnection(host)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println("Error creating connection:", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
defer conn.Close()
|
||||||
|
|
||||||
|
// Custom transport that forces HTTP requests to use our existing connection
|
||||||
|
transport := &http.Transport{
|
||||||
|
DialContext: func(ctx context.Context, network, addr string) (net.Conn, error) {
|
||||||
|
fmt.Println("Reusing existing TCP connection")
|
||||||
|
return conn, nil
|
||||||
|
},
|
||||||
|
DisableKeepAlives: false, // Ensure Keep-Alive is enabled
|
||||||
|
}
|
||||||
|
|
||||||
|
client := &http.Client{
|
||||||
|
Transport: transport,
|
||||||
|
Timeout: 10 * time.Second,
|
||||||
|
}
|
||||||
|
|
||||||
|
url := "http://example.com/endpoint"
|
||||||
|
data := []byte(`{"message": "Hello"}`)
|
||||||
|
|
||||||
|
// Create an HTTP request
|
||||||
|
req, err := http.NewRequest(http.MethodPost, url, bytes.NewBuffer(data))
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println("Error creating request:", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
usr, _ := user.Current()
|
||||||
|
req.Header.Set("author", usr.Username)
|
||||||
|
req.Header.Set("Connection", "keep-alive") // Keep connection alive
|
||||||
|
|
||||||
|
// Perform the HTTP request
|
||||||
|
resp, err := client.Do(req)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println("Error performing request:", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
defer resp.Body.Close()
|
||||||
|
|
||||||
|
// Read and print the response
|
||||||
|
body, err := ioutil.ReadAll(resp.Body)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println("Error reading response:", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Println("Response:", string(body))
|
||||||
|
}
|
|
@ -36,6 +36,11 @@ type virtigoT struct {
|
||||||
missingDropletTimeout time.Duration // how long a droplet can be missing for
|
missingDropletTimeout time.Duration // how long a droplet can be missing for
|
||||||
status *gui.Node // the cluster status
|
status *gui.Node // the cluster status
|
||||||
lastuptime *gui.Node // the last time uptime was checked by Kuma
|
lastuptime *gui.Node // the last time uptime was checked by Kuma
|
||||||
|
|
||||||
|
// admin mode
|
||||||
|
droplets *virtpb.Droplets // your droplets
|
||||||
|
hypervisors *virtpb.Hypervisors // yep
|
||||||
|
events *virtpb.Events // yep
|
||||||
}
|
}
|
||||||
|
|
||||||
// the stuff that is needed for a hypervisor
|
// the stuff that is needed for a hypervisor
|
||||||
|
|
Loading…
Reference in New Issue