90 lines
1.9 KiB
Go
90 lines
1.9 KiB
Go
package state
|
|
|
|
import (
|
|
"context"
|
|
|
|
log "bitsnthings.dev/overlord/src/log"
|
|
"libvirt.org/go/libvirt"
|
|
|
|
"go.mongodb.org/mongo-driver/bson"
|
|
"go.mongodb.org/mongo-driver/mongo"
|
|
"go.mongodb.org/mongo-driver/mongo/options"
|
|
)
|
|
|
|
func (state *State) setDBWatchers() {
|
|
state.startWatchStreamHandler(
|
|
*state.MongoDB.Collection("domains"),
|
|
mongo.Pipeline{},
|
|
state.Libvirt.DomainChangeHandler)
|
|
}
|
|
|
|
func (state *State) startWatchStreamHandler(
|
|
collection mongo.Collection,
|
|
pipeline mongo.Pipeline,
|
|
handler func(*mongo.ChangeStream),
|
|
) {
|
|
stream, err := collection.Watch(
|
|
context.TODO(),
|
|
pipeline,
|
|
state.streamOpts)
|
|
if err != nil {
|
|
log.PrintLog(
|
|
log.ERROR,
|
|
"Error starting mongodb watch stream! %s",
|
|
err)
|
|
stream.Close(context.TODO())
|
|
return
|
|
}
|
|
state.changeStreams = append(state.changeStreams, stream)
|
|
go handler(stream)
|
|
}
|
|
|
|
func (state *State) fetchDBState() {
|
|
|
|
}
|
|
|
|
func (state *State) pushDBState() {
|
|
for uri, domMap := range state.Libvirt.Domains.Active {
|
|
setDomainStatesInDB(
|
|
domMap, state, true, uri, state.upsertOpts)
|
|
}
|
|
for uri, domMap := range state.Libvirt.Domains.Inactive {
|
|
setDomainStatesInDB(
|
|
domMap, state, false, uri, state.upsertOpts)
|
|
}
|
|
}
|
|
|
|
func setDomainStatesInDB(
|
|
domMap map[string]libvirt.Domain,
|
|
state *State,
|
|
domainState bool,
|
|
uri string,
|
|
opts *options.UpdateOptions,
|
|
) {
|
|
var flags libvirt.DomainXMLFlags
|
|
if !state.Libvirt.IsReadOnly(uri) {
|
|
flags = libvirt.DOMAIN_XML_INACTIVE + libvirt.DOMAIN_XML_INACTIVE
|
|
}
|
|
for uuid, dom := range domMap {
|
|
xml, err := dom.GetXMLDesc(flags)
|
|
if err != nil {
|
|
log.PrintLog(
|
|
log.ERROR,
|
|
"Error getting XML of domain with uuid: \"%s\" on node with uri: \"%s\"! %s",
|
|
uuid, uri, err)
|
|
}
|
|
state.MongoDB.Collection("domains").UpdateOne(
|
|
context.TODO(),
|
|
bson.D{
|
|
{Key: "uri", Value: uri},
|
|
{Key: "uuid", Value: uuid}},
|
|
bson.D{
|
|
{Key: "$set", Value: bson.M{
|
|
"active": domainState,
|
|
"xml": xml,
|
|
}}},
|
|
opts,
|
|
)
|
|
}
|
|
}
|