From b35c04414a96ce62e19ff31649a09ba0c2cc45b6 Mon Sep 17 00:00:00 2001 From: Jeff Carr Date: Fri, 25 Oct 2024 20:05:04 -0500 Subject: [PATCH] checking for duplicate filenames works Signed-off-by: Jeff Carr --- Makefile | 2 +- addDroplet.go | 61 ++++++++++++++++++++++++++++++++------------------- main.go | 1 - validate.go | 52 +++++++++++++++++++++++++++++++++++++++---- 4 files changed, 88 insertions(+), 28 deletions(-) diff --git a/Makefile b/Makefile index a3541c8..5c7ec1b 100644 --- a/Makefile +++ b/Makefile @@ -10,7 +10,7 @@ all: ./virtigo --help xml-add: - ./virtigo --libvirt ~/libvirt/*.xml --xml-ignore-disk + ./virtigo --libvirt ~/libvirt/*.xml start-all-droplets: curl --silent http://localhost:8080/start?start=git.wit.org diff --git a/addDroplet.go b/addDroplet.go index 9027526..7cd9676 100644 --- a/addDroplet.go +++ b/addDroplet.go @@ -166,7 +166,7 @@ func updateDroplet(d *DropletT, domcfg *libvirtxml.Domain) ([]*pb.Event, error) nete, err := updateNetwork(d, domcfg) if err != nil { log.Info("updateNetwork() failed", err) - return alle, errors.New("updateNetwork() failed") + return alle, err } for _, e := range nete { @@ -176,8 +176,14 @@ func updateDroplet(d *DropletT, domcfg *libvirtxml.Domain) ([]*pb.Event, error) log.Info("TODO: fix updateDisk() change events") log.Info("TODO: fix updateDisk() change events") log.Info("TODO: fix updateDisk() change events") - if !updateDisk(d, domcfg) { - return alle, errors.New("updateDisk() failed") + nete, err = updateDisk(d, domcfg) + if err != nil { + log.Info("updateDisk() failed", err) + return alle, err + } + + for _, e := range nete { + alle = append(alle, e) } if alle == nil { @@ -185,8 +191,6 @@ func updateDroplet(d *DropletT, domcfg *libvirtxml.Domain) ([]*pb.Event, error) return alle, nil } log.Info("libvirt xml import worked. droplet changed", domcfg.Name) - // log.Info("all change events", alle) - me.changed = true // append each change event for _, e := range alle { @@ -349,9 +353,11 @@ func updateNetwork(d *DropletT, domcfg *libvirtxml.Domain) ([]*pb.Event, error) */ // returns false if something went wrong -func updateDisk(d *DropletT, domcfg *libvirtxml.Domain) bool { +func updateDisk(d *DropletT, domcfg *libvirtxml.Domain) ([]*pb.Event, error) { + var alle []*pb.Event + if (d == nil) || (domcfg == nil) { - return false + return nil, errors.New("domcfg == nil") } for _, disk := range domcfg.Devices.Disks { var t *libvirtxml.DomainDiskSourceFile @@ -366,21 +372,32 @@ func updateDisk(d *DropletT, domcfg *libvirtxml.Domain) bool { continue } - var found bool = false - for _, disk := range d.pb.Disks { - if disk.Filename == filename { - log.Verbose("OKAY. FOUND filename", filename) - found = true + e, err := insertFilename(d.pb, filename) + if err != nil { + return alle, err + } + if e == nil { + continue + } + alle = append(alle, e) + + /* + var found bool = false + for _, disk := range d.pb.Disks { + if disk.Filename == filename { + log.Verbose("OKAY. FOUND filename", filename) + found = true + } } - } - if !found { - var disk *pb.Disk - disk = new(pb.Disk) - disk.Filename = filename - d.pb.Disks = append(d.pb.Disks, disk) - log.Info("New filename", filename) - me.changed = true - } + if !found { + var disk *pb.Disk + disk = new(pb.Disk) + disk.Filename = filename + d.pb.Disks = append(d.pb.Disks, disk) + log.Info("New filename", filename) + me.changed = true + } + */ } - return true + return alle, nil } diff --git a/main.go b/main.go index ae4babe..df698f8 100644 --- a/main.go +++ b/main.go @@ -63,7 +63,6 @@ func main() { } checkUniqueFilenames() - for _, filename := range argv.Xml { domcfg, err := readXml(filename) if err != nil { diff --git a/validate.go b/validate.go index 2f7de9b..5791c03 100644 --- a/validate.go +++ b/validate.go @@ -14,6 +14,7 @@ package main */ import ( + "errors" "os" "path/filepath" @@ -50,6 +51,49 @@ func addClusterFilepath(dir string) { } } +// returns the droplet using a filename +func lookupFilename(filename string) *pb.Droplet { + filebase := filepath.Base(filename) + + for _, d := range me.cluster.Droplets { + for _, disk := range d.Disks { + if filebase == disk.Filename { + return d + } + } + } + return nil +} + +func insertFilename(d *pb.Droplet, filename string) (*pb.Event, error) { + dupd := lookupFilename(filename) + if dupd != nil { + log.Info("file", filename, "already on droplet", dupd.Hostname) + log.Info("file", filename, "on new droplet", d.Hostname) + log.Info("duplicate disk names (--xml-ignore-disk to ignore)") + return nil, errors.New("duplicate disk names") + } + filebase := filepath.Base(filename) + dir := filepath.Dir(filename) + for _, disk := range d.Disks { + if disk.Filename == filebase { + log.Info("already have disk", filename) + return nil, nil + } + } + // make a new Add Event + e := NewChangeEvent(d, "Add Disk", "", filename) + + // add the disk protobuf entry + var disk *pb.Disk + disk = new(pb.Disk) + disk.Filename = filebase + disk.Filepath = dir + d.Disks = append(d.Disks, disk) + log.Info("New filename", filebase, dir) + return e, nil +} + func checkUniqueFilenames() bool { var ok bool = true var disks map[string]string @@ -60,10 +104,10 @@ func checkUniqueFilenames() bool { filename := disk.Filename if _, ok := disks[filename]; ok { /* - if argv.IgnDisk { - log.Info("ignore dup disk", filename, disks[filename], d.Hostname) - } else { - } + if argv.IgnDisk { + log.Info("ignore dup disk", filename, disks[filename], d.Hostname) + } else { + } */ log.Info("file", filename, "on droplet", disks[filename]) log.Info("file", filename, "on droplet", d.Hostname)