summaryrefslogtreecommitdiff
path: root/validate.go
diff options
context:
space:
mode:
authorJeff Carr <[email protected]>2024-10-27 04:53:39 -0500
committerJeff Carr <[email protected]>2024-10-27 04:53:39 -0500
commit212b582060107d8e64ca9dbe8e194cc922e460fa (patch)
tree00948d77892ca8ec5aa65a4754d0f9b0fda3853b /validate.go
parentd948581300ecea1b5407662be9e812ddf237e6cf (diff)
sets unique spice port and saves config filesv0.2
Signed-off-by: Jeff Carr <[email protected]>
Diffstat (limited to 'validate.go')
-rw-r--r--validate.go119
1 files changed, 86 insertions, 33 deletions
diff --git a/validate.go b/validate.go
index 16d78ac..505b022 100644
--- a/validate.go
+++ b/validate.go
@@ -177,46 +177,99 @@ func ValidateDroplets(cluster *pb.Cluster) (map[string]string, map[string]string
return umap, macs, nil
}
-/*
-func safeValidateDroplets(cluster *pb.Cluster) (map[string]string, map[string]string) {
- // uuid map to check for duplicates
- var umap map[string]string
- umap = make(map[string]string)
-
- // mac address map to check for duplicates
- var macs map[string]string
- macs = make(map[string]string)
-
- for _, d := range cluster.Droplets {
- // Generate a new UUID
- if d.Uuid == "" {
- u := uuid.New()
- d.Uuid = u.String()
+// checks a droplet right before a start event
+// verify ethernet mac address
+// verify uuid (but probably can ignore this since it's not used)
+// check qemu domain id
+// check spice and vnc ports
+// check filenames
+func ValidateDroplet(check *pb.Droplet) error {
+ // check for duplicate uuid's
+ for _, d := range me.cluster.Droplets {
+ if check == d {
+ continue
}
-
- // seconds, ok := timeZone[tz]; ok {
- if _, ok := umap[d.Uuid]; ok {
+ if d.Uuid == check.Uuid {
// UUID already exists
- log.Info("duplicate UUID", d.Uuid, umap[d.Uuid])
log.Info("duplicate UUID", d.Uuid, d.Hostname)
- // os.Exit(-1)
+ log.Info("duplicate UUID", d.Uuid, check.Hostname)
+ return errors.New("duplicate UUID: " + d.Uuid)
}
- umap[d.Uuid] = d.Hostname
+ }
- for _, n := range d.Networks {
- // log.Println("network:", n.Mac, d.Uuid, d.Hostname)
- if _, ok := macs[n.Mac]; ok {
- // UUID already exists
- log.Info("duplicate MAC", n.Mac, macs[n.Mac], umap[macs[n.Mac]])
- log.Info("duplicate MAC", n.Mac, d.Hostname)
- // os.Exit(-1)
+ // check for duplicate mac addresses
+ for _, checkn := range check.Networks {
+ for _, d := range me.cluster.Droplets {
+ if check == d {
+ continue
+ }
+ for _, n := range d.Networks {
+ if checkn.Mac == n.Mac {
+ // MAC already exists
+ log.Info("duplicate MAC", n.Mac, d.Hostname)
+ log.Info("duplicate MAC", n.Mac, check.Hostname)
+ return errors.New("duplicate MAC: " + n.Mac)
+ }
}
- macs[n.Mac] = d.Uuid
}
}
- log.Println("validated okay: no duplicate MAC addr")
- log.Println("validated okay: no duplicate UUID")
- return umap, macs
+ if err := setUniqueSpicePort(check); err != nil {
+ return err
+ }
+ return nil
+}
+
+func setUniqueSpicePort(check *pb.Droplet) error {
+ var ports map[int64]*pb.Droplet
+ ports = make(map[int64]*pb.Droplet)
+
+ // check spice ports
+ // checkn.SpicePort = getUniqueSpicePort()
+ for _, d := range me.cluster.Droplets {
+ if d.SpicePort == 0 {
+ continue
+ }
+ if _, ok := ports[d.SpicePort]; ok {
+ log.Info("duplicate ports", d.SpicePort)
+ return errors.New("duplicate ports")
+ }
+ ports[d.SpicePort] = d
+ }
+
+ for p, d := range ports {
+ log.Info("found spice port", p, "on", d.Hostname)
+ }
+
+ var start int64
+ start = 6000
+ for {
+ if _, ok := ports[start]; ok {
+ d := ports[start]
+ log.Info("already using port", start, "on", d.Hostname)
+ if d == check {
+ log.Info("this is good because it's me!", check.Hostname, d.Hostname)
+ return nil
+ }
+ start += 1
+ continue
+ }
+ // generate change port event
+ log.Info("going to try port", start, "on", check.Hostname)
+ e := check.NewChangeEvent("SpicePort", check.SpicePort, start)
+ me.cluster.Events = append(me.cluster.Events, e)
+
+ // set port to start
+ check.SpicePort = start
+
+ // write out config file
+ if err := me.cluster.ConfigSave(); err != nil {
+ log.Info("config save error inside here is bad", err)
+ return err
+ }
+
+ return nil
+ }
+ // for loop never gets here
+ return nil
}
-*/