summaryrefslogtreecommitdiff
path: root/importDomain.go
diff options
context:
space:
mode:
Diffstat (limited to 'importDomain.go')
-rw-r--r--importDomain.go84
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
}