summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff Carr <[email protected]>2024-10-13 03:04:46 -0500
committerJeff Carr <[email protected]>2024-10-13 03:04:46 -0500
commite149b3218d26b4996fc76072145efda6eb9f9856 (patch)
tree43ea8d350ea5eaf20c8313a07037383b40dd7680
parentca1a78394fe2fe7d556153819dd5f20e3d65920a (diff)
last version restarted virtigod to libvirt hang
it would appear at this point there is some sort of bug that hangs libvirtd. stracing it isn't obvious to me due to my lack of experience with really working with strace much. When virtigod hangs, 'virsh list' also hangs from the command line. If I kill virtigod, everything starts working again and I get lots of output from libvirtd --listen but I haven't investigated any of the errors yet or looked further. I probably will just work around this problem rather than solving it in this case since my need here is to get to working on riscv uboot development where my usefullness is better. hopefully. Or, maybe it's what I'm more interested in. maybe this bug doesn't exist on riscv. haha to you reading this, virtualization with riscv doesn't really even exist much yet. The chips are still too new! Signed-off-by: Jeff Carr <[email protected]>
-rw-r--r--Makefile6
-rw-r--r--configfiles.go52
-rw-r--r--http.go2
-rw-r--r--main.go20
-rw-r--r--poll.go9
-rw-r--r--structs.go1
6 files changed, 72 insertions, 18 deletions
diff --git a/Makefile b/Makefile
index a8e3983..a4b8953 100644
--- a/Makefile
+++ b/Makefile
@@ -12,6 +12,12 @@ all:
start:
./virtigo --start jcarr
+curl-uptime:
+ curl --silent http://localhost:8080/uptime
+
+curl-droplets:
+ curl --silent http://localhost:8080/droplets
+
# this is for release builds using the go.mod files
release-build:
@echo ${REDOMOD}
diff --git a/configfiles.go b/configfiles.go
index b7999c5..00aaaa3 100644
--- a/configfiles.go
+++ b/configfiles.go
@@ -4,11 +4,12 @@ import (
"os"
"path/filepath"
"strings"
+ "time"
"go.wit.com/log"
)
-func readConfigFile(filename string) {
+func readDropletFile(filename string) {
// fmt.Fprintln(w, "GOT TEST?")
homeDir, _ := os.UserHomeDir()
fullname := filepath.Join(homeDir, ".config/virtigo/", filename)
@@ -39,8 +40,55 @@ func readConfigFile(filename string) {
me.droplets = append(me.droplets, d)
log.Log(EVENT, "NEW CONFIG DROPLET", d.Hostname, d.State)
} else {
- log.Info("not sure what to do here. duplicate", name, "in config file")
+ log.Info("not sure what to do here. duplicate droplet", name, "in config file")
}
}
}
+
+func readHypervisorFile(filename string) {
+ // fmt.Fprintln(w, "GOT TEST?")
+ homeDir, _ := os.UserHomeDir()
+ fullname := filepath.Join(homeDir, ".config/virtigo/", filename)
+ pfile, err := os.ReadFile(fullname)
+ if err != nil {
+ log.Info("No config file :", err)
+ // w.Write(pfile)
+ return
+ }
+
+ f := string(pfile)
+ for _, line := range strings.Split(f, "\n") {
+ fields := strings.Fields(line)
+ if len(fields) < 1 {
+ continue
+ }
+ name := fields[0]
+ h := addHypervisor(name)
+ if len(fields) < 2 || fields[1] != "active" {
+ h.Active = true
+ } else {
+ h.Active = false
+ }
+ }
+}
+
+func addHypervisor(name string) *HyperT {
+ var h *HyperT
+ h = findHypervisor(name)
+ if h != nil {
+ log.Info("not sure what to do here. duplicate hypervisor", name, "in config file")
+ return h
+ }
+ log.Log(EVENT, "Adding new hypervisor", name)
+ h = new(HyperT)
+ h.Hostname = name
+ h.Autoscan = true
+ h.Delay = 5 * time.Second
+ h.lastpoll = time.Now()
+ h.Scan = func() {
+ h.pollHypervisor()
+ }
+ me.hypers = append(me.hypers, h)
+ return h
+}
diff --git a/http.go b/http.go
index 085757b..d94a6a1 100644
--- a/http.go
+++ b/http.go
@@ -31,7 +31,7 @@ func okHandler(w http.ResponseWriter, r *http.Request) {
}
// is the cluster running what it should?
- if tmp == "/good" {
+ if tmp == "/droplets" {
var good = true
for _, d := range me.droplets {
if d.State != "ON" {
diff --git a/main.go b/main.go
index ec698b9..2e2fa3a 100644
--- a/main.go
+++ b/main.go
@@ -5,7 +5,6 @@ package main
import (
"embed"
"os"
- "time"
"go.wit.com/dev/alexflint/arg"
"go.wit.com/log"
@@ -28,22 +27,13 @@ func main() {
log.DaemonMode(true)
}
- readConfigFile("droplets")
+ readDropletFile("droplets")
+ readHypervisorFile("hypervisor")
log.Info("create cluser for", argv.Hosts)
- for _, s := range argv.Hosts {
- me.names = append(me.names, s)
-
- log.Info("Making a hypervisor struct for", s)
- h := new(HyperT)
- h.Hostname = s
- h.Autoscan = true
- h.Delay = 5 * time.Second
- h.lastpoll = time.Now()
- h.Scan = func() {
- h.pollHypervisor()
- }
- me.hypers = append(me.hypers, h)
+ for _, name := range argv.Hosts {
+ h := addHypervisor(name)
+ h.Active = true
}
if argv.Start != "" {
diff --git a/poll.go b/poll.go
index b25e810..37a15ac 100644
--- a/poll.go
+++ b/poll.go
@@ -69,6 +69,15 @@ func findDroplet(name string) *DropletT {
return nil
}
+func findHypervisor(name string) *HyperT {
+ for _, h := range me.hypers {
+ if h.Hostname == name {
+ return h
+ }
+ }
+ return nil
+}
+
// check the state of the cluster and return a string
// that is intended to be sent to an uptime monitor like Kuma
func clusterHealthy() (bool, string) {
diff --git a/structs.go b/structs.go
index 7d9d2cc..de73e77 100644
--- a/structs.go
+++ b/structs.go
@@ -24,6 +24,7 @@ type virtigoT struct {
// the stuff that is needed for a hypervisor
type HyperT struct {
Hostname string // the hypervisor hostname
+ Active bool // is allowed to start new droplets
Scan func() // the function to run to scan the hypervisor
Autoscan bool // to scan or not to scan
Delay time.Duration // how often to poll the hypervisor