diff options
Diffstat (limited to 'importDomain.go')
| -rw-r--r-- | importDomain.go | 84 |
1 files changed, 69 insertions, 15 deletions
diff --git a/importDomain.go b/importDomain.go index 7d58bbe..1091b4e 100644 --- a/importDomain.go +++ b/importDomain.go @@ -4,9 +4,11 @@ import ( "errors" "fmt" "net/http" + "time" pb "go.wit.com/lib/protobuf/virtbuf" "go.wit.com/log" + "libvirt.org/go/libvirtxml" ) // attempts to create a new virtual machine @@ -14,7 +16,7 @@ import ( func importDomain(w http.ResponseWriter, r *http.Request) (string, error) { name := r.URL.Query().Get("domainName") if name == "" { - result := "start failed. name is blank " + r.URL.Path + result := "importDomain() failed. name is blank " + r.URL.Path log.Warn(result) fmt.Fprintln(w, result) return "", errors.New(result) @@ -36,35 +38,87 @@ func importDomain(w http.ResponseWriter, r *http.Request) (string, error) { fmt.Fprintln(w, result) return result, errors.New(result) } - result := start + " local FOUND! LocalOnly = " + d.LocalOnly - log.Log(WARN, result) - fmt.Fprintln(w, result) if d.Current.State != pb.DropletState_OFF { result := "error: libvirt domain " + name + " is not off" log.Info(result) fmt.Fprintln(w, result) return result, errors.New(result) } - result = start + "about to attempt import " - result += "(" + d.LocalOnly + ")" - result += " " + d.Hostname - log.Log(WARN, result) - fmt.Fprintln(w, result) h := findHypervisorByName(d.Current.Hypervisor) if h == nil { - result = "unknown hypervisor = " + d.Current.Hypervisor + result := "unknown hypervisor = " + d.Current.Hypervisor log.Log(WARN, result) fmt.Fprintln(w, result) return result, errors.New(result) } - result = "finally ready to h.start(d)" + + // attempt to get the domain record from virtigo + xml, err := postImportDomain(h.pb.Hostname, name) + if err != nil { + log.Log(WARN, err) + fmt.Fprintln(w, err) + return "", err + } + + domcfg := &libvirtxml.Domain{} + err = domcfg.Unmarshal(string(xml)) + if err != nil { + log.Info("Marshal failed", name, err) + log.Warn(string(xml)) + fmt.Fprintln(w, string(xml)) + return "", err + } + + result := fmt.Sprintln("marshal worked", domcfg.Name, domcfg.UUID) log.Log(WARN, result) fmt.Fprintln(w, result) - ok, output := h.start(d) - if ok { - return result + output, nil + return result, nil +} + +// this must be bool in string because accumulated output is sometimes +// written to STDOUT, sometimes to http +func (h *HyperT) importDomain(d *pb.Droplet) (bool, string) { + ready, result := me.cluster.DropletReady(d) + if !ready { + return false, result } - return result + output, errors.New("start " + name + " on hypervisor " + h.pb.Hostname) + + url := "http://" + h.pb.Hostname + ":2520/import?domain=" + d.Hostname + var msg string + var data []byte + msg = d.FormatJSON() + data = []byte(msg) // Convert the string to []byte + req, err := httpPost(url, data) + if err != nil { + return false, fmt.Sprintln("error:", err) + } + log.Info("http post url:", url) + log.Info("http post data:", msg) + + result = "EVENT import droplet url: " + url + "\n" + result += "EVENT import droplet response: " + string(req) + + // increment the counter for a start attempt working + d.Current.StartAttempts += 1 + + // mark the cluster as unstable so droplet starts can be throttled + me.unstable = time.Now() + + return true, result +} + +func postImportDomain(hostname string, name string) ([]byte, error) { + url := "http://" + hostname + ":2520/import?domain=" + hostname + var msg string + var data []byte + msg = "import " + name + data = []byte(msg) // Convert the string to []byte + req, err := httpPost(url, data) + if err != nil { + return nil, err + } + + return req, nil } |
