Now pulling VM data from named VMs

- Next is to get the list and setting the information using go routines for each VM
This commit is contained in:
Matthew Stobbs 2024-03-11 19:39:17 -06:00
parent 5b16a75bdf
commit 00758af30b
4 changed files with 75 additions and 13 deletions

View File

@ -3,6 +3,7 @@ package guest
import ( import (
"errors" "errors"
"log"
"time" "time"
"libvirt.org/go/libvirt" "libvirt.org/go/libvirt"
@ -104,14 +105,12 @@ func GetGuest(name string, conn *libvirt.Connect) (*VM, error) {
// If the domain can't be found by name, exit early with an error // If the domain can't be found by name, exit early with an error
if g.dom, err = conn.LookupDomainByName(name); err != nil { if g.dom, err = conn.LookupDomainByName(name); err != nil {
return g, ErrVMNotFound return g, err
} }
if g.ID, err = g.dom.GetID(); err != nil { if g.ID, err = g.dom.GetID(); err != nil {
return g, err return g, err
} }
if g.BackupXML, err = g.dom.BackupGetXMLDesc(0); err != nil {
return g, err
}
if g.Autostart, err = g.dom.GetAutostart(); err != nil { if g.Autostart, err = g.dom.GetAutostart(); err != nil {
return g, err return g, err
} }
@ -197,6 +196,11 @@ func GetGuest(name string, conn *libvirt.Connect) (*VM, error) {
} }
} }
// Not errors, but still log the warnings when this happens
if g.BackupXML, err = g.dom.BackupGetXMLDesc(0); err != nil {
log.Printf("WARNING: While loading backup information: %s", err)
}
go func() { go func() {
defer close(g.closeErr) defer close(g.closeErr)
<-g.close <-g.close
@ -216,6 +220,7 @@ func setNotSet(v string, s bool) string {
// Close closes an open connection // Close closes an open connection
func (g *VM) Close() error { func (g *VM) Close() error {
log.Println("Closing VM", g.Name)
close(g.close) close(g.close)
return <-g.closeErr return <-g.closeErr
} }

View File

@ -2,6 +2,7 @@ package host
import ( import (
"fmt" "fmt"
"log"
"git.staur.ca/stobbsm/clustvirt/lib/guest" "git.staur.ca/stobbsm/clustvirt/lib/guest"
"libvirt.org/go/libvirt" "libvirt.org/go/libvirt"
@ -61,11 +62,11 @@ func (h *Host) GetGuestByName(name string) (*guest.VM, error) {
return guest.GetGuest(name, h.conn) return guest.GetGuest(name, h.conn)
} }
return nil, err return nil, err
} }
// Close triggers closing the host connection // Close triggers closing the host connection
func (h *Host) Close() error { func (h *Host) Close() error {
log.Println("Closing Host", h.HostName)
close(h.close) close(h.close)
return <-h.closeErr return <-h.closeErr
} }

17
main.go
View File

@ -2,21 +2,22 @@ package main
import ( import (
"log" "log"
"git.staur.ca/stobbsm/clustvirt/lib/host"
) )
func main() { func main() {
log.Println("Starting clustvirt, the libvirt cluster manager") log.Println("Starting clustvirt, the libvirt cluster manager")
// Try connecting to libvirt venus, err := host.ConnectHost("venus.staur.ca")
doms, err := GetDomsInCluster("earth.staur.ca", "mars.staur.ca", "venus.staur.ca")
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
} }
log.Printf("Domains in cluster: %d", len(doms)) defer venus.Close()
// Example of xmlns uri found in libvirt xml definition: lm, err := venus.GetGuestByName("logan-minecraft")
// xmlns:libosinfo="http://libosinfo.org/xmlns/libvirt/domain/1.0" if err != nil {
for _, d := range doms { log.Fatal(err)
log.Println(d.GetMetadata(0, "", 0))
d.Free()
} }
defer lm.Close()
log.Println(lm)
} }

55
util/cleanup/cleanup.go Normal file
View File

@ -0,0 +1,55 @@
// Package cleanup collects functions that should be run at the end of program operation
// to clean things up and shut things down properly.
// The default CleanItUp instance is initialized with a size 3 stack, just so it's initialized.
package cleanup
// CleanItUp holds a stack of functions that take no arguments and return no
// values, in order to run the stack at a given point.
// Technically doesn't need to be used for cleanup, but that is it's purpose.
type CleanItUp struct {
stack []EmptyFunc
}
// EmptyFunc is just what you think it is, a function with no arguments and no returns
type EmptyFunc func()
var cleaner *CleanItUp
func init() {
cleaner = &CleanItUp{
stack: make([]EmptyFunc, 3),
}
}
// Push onto the default (global) CleanItUp instance
func Push(f EmptyFunc) {
cleaner.Push(f)
}
// Push adds a function to the end of the function stack
func (c *CleanItUp) Push(f EmptyFunc) {
c.stack = append(c.stack, f)
}
// Stack onto the default (global) CleanItUp instance
func Stack(f EmptyFunc) {
cleaner.Stack(f)
}
// Stack adds a function to the start of the function stack
// not very efficient, doesn't really need to be.
func (c *CleanItUp) Stack(f EmptyFunc) {
c.stack = append([]EmptyFunc{f}, c.stack...)
}
// Clean using the default (global) CleanItUp instance
func Clean() {
cleaner.Clean()
}
// Clean runs the stack in reverse order, using the defer keyword to make sure they all run
func (c *CleanItUp) Clean() {
for i := len(c.stack) - 1; i >= 0; i-- {
defer c.stack[i]()
}
}