github.com/Cloud-Foundations/Dominator@v0.3.4/fleetmanager/hypervisors/showHypervisor.go (about) 1 package hypervisors 2 3 import ( 4 "bufio" 5 "fmt" 6 "io" 7 "net" 8 "net/http" 9 "sort" 10 11 "github.com/Cloud-Foundations/Dominator/lib/constants" 12 "github.com/Cloud-Foundations/Dominator/lib/html" 13 "github.com/Cloud-Foundations/Dominator/lib/json" 14 "github.com/Cloud-Foundations/Dominator/lib/url" 15 "github.com/Cloud-Foundations/Dominator/lib/verstr" 16 hyper_proto "github.com/Cloud-Foundations/Dominator/proto/hypervisor" 17 ) 18 19 func (m *Manager) showHypervisorHandler(w http.ResponseWriter, 20 req *http.Request) { 21 parsedQuery := url.ParseQuery(req.URL) 22 if len(parsedQuery.Flags) != 1 { 23 w.Header().Set("Content-Type", "text/plain; charset=utf-8") 24 w.WriteHeader(http.StatusBadRequest) 25 return 26 } 27 var hostname string 28 for name := range parsedQuery.Flags { 29 hostname = name 30 } 31 h, err := m.getLockedHypervisor(hostname, false) 32 if err != nil { 33 w.Header().Set("Content-Type", "text/plain; charset=utf-8") 34 w.WriteHeader(http.StatusNotFound) 35 return 36 } 37 defer h.mutex.RUnlock() 38 writer := bufio.NewWriter(w) 39 defer writer.Flush() 40 topology, err := m.getTopology() 41 if err != nil { 42 fmt.Fprintln(writer, err) 43 return 44 } 45 fmt.Fprintf(writer, "<title>Information for Hypervisor %s</title>\n", 46 hostname) 47 writer.WriteString(commonStyleSheet) 48 fmt.Fprintln(writer, "<body>") 49 fmt.Fprintln(writer, "Machine info:<br>") 50 fmt.Fprintln(writer, `<pre style="background-color: #eee; border: 1px solid #999; display: block; float: left;">`) 51 json.WriteWithIndent(writer, " ", h.machine) 52 fmt.Fprintln(writer, `</pre><p style="clear: both;">`) 53 subnets, err := topology.GetSubnetsForMachine(hostname) 54 if err != nil { 55 fmt.Fprintf(writer, "%s<br>\n", err) 56 } else { 57 fmt.Fprintln(writer, "Subnets:<br>") 58 fmt.Fprintln(writer, `<pre style="background-color: #eee; border: 1px solid #999; display: block; float: left;">`) 59 json.WriteWithIndent(writer, " ", subnets) 60 fmt.Fprintln(writer, `</pre><p style="clear: both;">`) 61 } 62 if !*manageHypervisors { 63 fmt.Fprintln(writer, "No visibility into local tags<br>") 64 } else if len(h.localTags) > 0 { 65 keys := make([]string, 0, len(h.localTags)) 66 for key := range h.localTags { 67 keys = append(keys, key) 68 } 69 sort.Strings(keys) 70 fmt.Fprintln(writer, "Local tags:<br>") 71 fmt.Fprintln(writer, `<table border="1">`) 72 tw, _ := html.NewTableWriter(writer, true, "Name", "Value") 73 for _, key := range keys { 74 tw.WriteRow("", "", key, h.localTags[key]) 75 } 76 tw.Close() 77 } 78 fmt.Fprintf(writer, "Status: %s<br>\n", h.getHealthStatus()) 79 fmt.Fprintf(writer, 80 "Number of VMs known: %d (<a href=\"http://%s:%d/listVMs\">live view</a>)<br>\n", 81 len(h.vms), hostname, constants.HypervisorPortNumber) 82 fmt.Fprintln(writer, "<br>") 83 m.showVMsForHypervisor(writer, h) 84 fmt.Fprintln(writer, "<br>") 85 m.showIPsForHypervisor(writer, h.machine.HostIpAddress) 86 fmt.Fprintln(writer, "</body>") 87 } 88 89 func (m *Manager) showIPsForHypervisor(writer io.Writer, hIP net.IP) { 90 if !*manageHypervisors { 91 fmt.Fprintln(writer, "No visibility into registered addresses<br>") 92 } else if ips, err := m.storer.GetIPsForHypervisor(hIP); err != nil { 93 fmt.Fprintf(writer, "Error getting IPs for Hypervisor: %s: %s<br>\n", 94 hIP, err) 95 return 96 } else { 97 fmt.Fprintln(writer, "Registered addresses:<br>") 98 ipList := make([]string, 0, len(ips)) 99 for _, ip := range ips { 100 ipList = append(ipList, ip.String()) 101 } 102 verstr.Sort(ipList) 103 for _, ip := range ipList { 104 fmt.Fprintln(writer, ip, "<br>") 105 } 106 } 107 } 108 109 func (m *Manager) showVMsForHypervisor(writer *bufio.Writer, 110 h *hypervisorType) { 111 fmt.Fprintln(writer, "VMs as of last update:<br>") 112 capacity := hyper_proto.GetCapacityResponse{ 113 MemoryInMiB: h.memoryInMiB, 114 NumCPUs: h.numCPUs, 115 TotalVolumeBytes: h.totalVolumeBytes, 116 } 117 vms := getVmListFromMap(h.vms, true) 118 err := m.listVMs(writer, vms, &capacity, "", "", url.OutputTypeHtml) 119 if err != nil { 120 fmt.Fprintln(writer, err) 121 return 122 } 123 fmt.Fprintln(writer, "<br>") 124 fmt.Fprintln(writer, "VMs by primary owner as of last update:<br>") 125 err = m.listVMsByPrimaryOwner(writer, vms, url.OutputTypeHtml) 126 if err != nil { 127 fmt.Fprintln(writer, err) 128 return 129 } 130 }