68 lines
1.7 KiB
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
|
|
}
|