Files
overlord/src/libvirt/libvirt.go

68 lines
1.7 KiB
Go

/*
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)
func (virt *Libvirt) IsReadOnly(uri string) bool {
if _, ok := virt.ROHosts[uri]; ok {
return true
} else {
return false
}
}
func (virt *Libvirt) Connect(cstr string, connFn libvirtConnectFunc) (*libvirt.Connect, error) {
conn, err := connFn(cstr) //, &virt.Auth, virt.Flags)
if err != nil {
log.PrintLog(log.WARN, "Error connecting to libvirt host with uri: \"%s\"! %s",
cstr, err)
return conn, err
}
virt.Hosts[cstr] = conn
return conn, err
}
func (virt *Libvirt) ConnectMany(cstrs []string, connFn libvirtConnectFunc) {
for _, cstr := range cstrs {
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
}