Added basic HTTP API, lots of internal state work and libvirt domain XML parsing

This commit is contained in:
2021-10-04 21:51:09 +02:00
parent cd12af081e
commit 98789fdc73
21 changed files with 949 additions and 125 deletions

View File

@@ -1,43 +1,20 @@
/*
Package libvirt for the overlord VM management software!
Has a useful XML export for libvirt domain xml parsing.
*/
package libvirt
import (
"errors"
log "bitsnthings.dev/overlord/src/log"
libvirt "libvirt.org/go/libvirt"
)
var errDomainNotFound = errors.New("Clould not find the domain in internal state!")
type libvirtConnectFunc func(string) (*libvirt.Connect, error)
type Domains struct {
Active map[string]map[string]libvirt.Domain
Inactive map[string]map[string]libvirt.Domain
}
type Stats struct {
}
type Libvirt struct {
Hosts map[string]*libvirt.Connect
ROHosts map[string]*libvirt.Connect
Domains Domains
// Auth libvirt.ConnectAuth
// Flags libvirt.ConnectFlags
Stats Stats
}
func New() Libvirt {
return Libvirt{
map[string]*libvirt.Connect{},
map[string]*libvirt.Connect{},
Domains{},
Stats{},
}
}
func (virt *Libvirt) GetStatus() {
virt.getAllDomains()
log.PrintLog(log.TRACE, "Fetched libvirt cluster status.")
}
func (virt *Libvirt) IsReadOnly(uri string) bool {
if _, ok := virt.ROHosts[uri]; ok {
return true
@@ -62,3 +39,29 @@ func (virt *Libvirt) ConnectMany(cstrs []string, connFn libvirtConnectFunc) {
virt.Connect(cstr, connFn)
}
}
func (virt *Libvirt) GetXMLFlags(uri string) libvirt.DomainXMLFlags {
var flags libvirt.DomainXMLFlags
if !virt.IsReadOnly(uri) {
flags = libvirt.DOMAIN_XML_INACTIVE + libvirt.DOMAIN_XML_INACTIVE
}
return flags
}
func (virt *Libvirt) GetDomainAndStatus(uri string, uuid string) (libvirt.Domain, bool, error) {
if host, exists := virt.Domains.Active[uri]; exists {
dom, exists := host[uuid]
if exists {
return dom, true, nil
}
return libvirt.Domain{}, false, errDomainNotFound
}
if host, exists := virt.Domains.Inactive[uri]; exists {
dom, exists := host[uuid]
if exists {
return dom, false, nil
}
return libvirt.Domain{}, false, errDomainNotFound
}
return libvirt.Domain{}, false, errDomainNotFound
}