diff --git a/doDroplet.go b/doDroplet.go index e39d110..adba47c 100644 --- a/doDroplet.go +++ b/doDroplet.go @@ -11,6 +11,7 @@ import ( "net/url" "time" + "github.com/google/uuid" "go.wit.com/lib/protobuf/virtpb" "go.wit.com/log" ) @@ -123,6 +124,26 @@ func doEvent(e *virtpb.Event) *virtpb.Event { return result } + if e.Etype == virtpb.EventType_ADD { + log.Println("START ADD droplet event", e.Droplet.FormatTEXT()) + if e.Droplet == nil { + result.State = virtpb.Event_FAIL + return result + } + result.DropletName = e.Droplet.Hostname + result.Error = e.Droplet.FormatTEXT() // feedback to the other side for debugging + if e.Droplet != nil { + if err := createDroplet(e.Droplet, result); err != nil { + result.Error += fmt.Sprintf("createDroplet() err: %v", err) + result.State = virtpb.Event_FAIL + return result + } + } + log.Println("create droplet worked", e.Droplet.FormatTEXT()) + result.State = virtpb.Event_DONE + return result + } + log.Println("unknown event", e) result.Etype = e.Etype result.State = virtpb.Event_FAIL @@ -178,3 +199,48 @@ func updateDroplet(newd *virtpb.Droplet) *virtpb.Event { result.State = virtpb.Event_DONE return result } + +func createDroplet(newd *virtpb.Droplet, result *virtpb.Event) error { + if newd == nil { + return fmt.Errorf("droplet protobuf == nil") + } + + if newd.Uuid == "" { + newd.Uuid = uuid.New().String() + } + + d := me.cluster.FindDropletByUuid(newd.Uuid) + if d != nil { + return fmt.Errorf("droplet uuid already used") + } + + log.Println("found droplet to update:", newd.Uuid, newd.Hostname, newd.Cpus, newd.Memory) + + if newd.Hostname == "" { + return fmt.Errorf("Hostname can not be blank") + } + d = me.cluster.FindDropletByName(newd.Hostname) + if d != nil { + return fmt.Errorf("hostname already defined") + } + + newd.LocalOnly = "yes on: " + "farm03" + + // by default, on locally imported domains, set the preferred hypervisor! + newd.PreferredHypervisor = "farm03" + + newd.Current = new(virtpb.Current) + newd.Current.Hypervisor = "farm03" + newd.StartState = virtpb.DropletState_OFF + newd.Current.State = virtpb.DropletState_OFF + + me.cluster.AddDroplet(newd) + + if err := me.cluster.ConfigSave(); err != nil { + log.Info("configsave error", err) + return fmt.Errorf("ConfigSave() error: %v", err) + } + + result.State = virtpb.Event_DONE + return nil +}