summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--http.go11
-rw-r--r--importDomain.go84
-rw-r--r--poll.go5
3 files changed, 73 insertions, 27 deletions
diff --git a/http.go b/http.go
index 875f782..727bc99 100644
--- a/http.go
+++ b/http.go
@@ -91,16 +91,7 @@ func okHandler(w http.ResponseWriter, r *http.Request) {
}
if route == "/dumpdroplet" {
- hostname := r.URL.Query().Get("hostname")
- d := me.cluster.FindDropletByName(hostname)
- if d == nil {
- log.Log(WARN, "can not find droplet hostname=", hostname)
- fmt.Fprintln(w, "can not find droplet hostname=", hostname)
- return
- }
- t := d.FormatTEXT()
- log.Log(WARN, t)
- fmt.Fprintln(w, t)
+ me.cluster.DumpDroplet(w, r)
return
}
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
}
diff --git a/poll.go b/poll.go
index 46313eb..31579f7 100644
--- a/poll.go
+++ b/poll.go
@@ -49,7 +49,7 @@ func (h *HyperT) pollHypervisor() {
log.Log(WARN, name, "local Adding new entry with AddDropletLocal()")
log.Log(WARN, name, "local Adding new entry with AddDropletLocal()")
me.cluster.AddDropletLocal(name, h.pb.Hostname)
- return
+ continue
}
start := d.SprintHeader()
h.lastDroplets[name] = time.Now()
@@ -78,7 +78,8 @@ func (h *HyperT) pollHypervisor() {
// this should mean a droplet is running where the config file says it probably should be running
if d.PreferredHypervisor == h.pb.Hostname {
- log.Log(EVENT, start, "poll shows new droplet", d.Hostname, "(matches config hypervisor", h.pb.Hostname+")")
+ log.Log(EVENT, start, "poll shows new droplet", d.Hostname,
+ "(matches config hypervisor", h.pb.Hostname+")")
d.Current.Hypervisor = h.pb.Hostname
continue
}