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