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  }