virtigo/main.go

156 lines
3.5 KiB
Go

// Copyright 2024 WIT.COM Inc Licensed GPL 3.0
package main
import (
"embed"
"fmt"
"os"
"path/filepath"
"time"
"github.com/google/uuid"
"go.wit.com/dev/alexflint/arg"
pb "go.wit.com/lib/protobuf/virtbuf"
"go.wit.com/log"
)
var Version string
//go:embed resources/*
var resources embed.FS
func main() {
if os.Getenv("VIRTIGO_HOME") == "" {
homeDir, _ := os.UserHomeDir()
fullpath := filepath.Join(homeDir, ".config/virtigo")
os.Setenv("VIRTIGO_HOME", fullpath)
}
var pp *arg.Parser
pp = arg.MustParse(&argv)
if pp == nil {
pp.WriteHelp(os.Stdout)
os.Exit(0)
}
if argv.Daemon {
log.DaemonMode(true)
}
// set defaults
me.unstable = time.Now() // initialize the grid as unstable
me.delay = 5 * time.Second // how often to poll the hypervisors
me.changed = false
me.events = new(pb.Events)
u := uuid.New()
me.events.Uuid = u.String()
me.events.Version = "dirty v1"
err := cfgfile()
if err != nil {
log.Warn("reading config file failed", err)
os.Exit(-1)
}
var newEvents []*pb.Event
// sanity check the droplets
checkDroplets(false)
newe := checkDiskFilenames()
for _, e := range newe {
newEvents = append(newEvents, e)
}
checkUniqueFilenames()
for _, filename := range argv.Xml {
domcfg, err := readXml(filename)
if err != nil {
// parsing the libvirt xml file failed
log.Info("error:", filename, err)
log.Info("readXml() error", filename)
log.Info("readXml() error", err)
log.Info("libvirt XML will have to be fixed by hand")
os.Exit(-1)
}
// this is a new droplet. add it to the cluster
log.Info("Add XML Droplet here", domcfg.Name)
d, newe, err := addDomainDroplet(domcfg)
if err != nil {
log.Info("addDomainDroplet() error d =", d)
log.Info("addDomainDroplet() error", filename)
log.Info("addDomainDroplet() error", err)
log.Info("libvirt XML will have to be fixed by hand")
os.Exit(-1)
}
for _, e := range newe {
newEvents = append(newEvents, e)
}
}
for i, e := range newEvents {
log.Info(i, "Event:", e.Droplet, e.FieldName, "orig:", e.OrigVal, "new:", e.NewVal)
me.changed = true
}
if me.changed {
if argv.Save {
writeConfigFile()
writeConfigFileDroplets()
log.Info("XML changes saved in protobuf config")
os.Exit(0)
} else {
log.Info("Not saving changes (use --save to save)")
os.Exit(0)
}
}
if len(argv.Xml) != 0 {
log.Info("No XML changes found")
os.Exit(0)
}
// start the watchdog polling for each hypervisor
for _, h := range me.hypers {
log.Info("starting polling on", h.pb.Hostname)
go h.NewWatchdog()
}
// sit here
startHTTP()
}
func makeDroplet(start string) {
d := findDroplet(start)
if d == nil {
log.Info("droplet is unknown:", start)
os.Exit(0)
}
log.Info("start droplet here:", d.pb.Hostname)
domcfg := makeStandardXml(d)
fmt.Printf("Virt type %s\n", domcfg.Type)
fmt.Printf("Virt name %s\n", domcfg.Name)
fmt.Printf("Virt UUID %s\n", domcfg.UUID)
fmt.Printf("Virt Memory %d %s\n", domcfg.Memory.Value, domcfg.Memory.Unit)
// test add some ethernet devices
macs := getMacs(domcfg)
fmt.Printf("Virt mac addr:%s\n", macs)
// clearEthernet(domcfg)
addEthernet(domcfg, "04:44:33:11:22:11", "worldbr")
addEthernet(domcfg, "04:44:33:33:44:55", "greenbr")
// add a check here to make these unique
// setRandomMacs(domcfg)
// print out the final mac addresses
macs = getMacs(domcfg)
fmt.Printf("Virt mac addr:%s\n", macs)
qcow := "/home/nfs/" + d.pb.Hostname + ".qcow2"
setSimpleDisk(domcfg, qcow)
writeoutXml(domcfg, "blahcarr")
os.Exit(0)
}