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  }