github.com/cloud-foundations/dominator@v0.0.0-20221004181915-6e4fee580046/hypervisor/manager/html.go (about)

     1  package manager
     2  
     3  import (
     4  	"fmt"
     5  	"io"
     6  	"sort"
     7  	"strings"
     8  
     9  	"github.com/Cloud-Foundations/Dominator/lib/format"
    10  	"github.com/Cloud-Foundations/Dominator/lib/meminfo"
    11  )
    12  
    13  func (m *Manager) writeHtml(writer io.Writer) {
    14  	numRunning, numStopped := m.getNumVMs()
    15  	writeCountLinks(writer, "Number of VMs known", "listVMs?state=",
    16  		numRunning+numStopped)
    17  	writeCountLinks(writer, "Number of VMs running", "listVMs?state=running",
    18  		numRunning)
    19  	writeCountLinks(writer, "Number of VMs stopped", "listVMs?state=stopped",
    20  		numStopped)
    21  	fmt.Fprintln(writer, "<br>")
    22  	m.mutex.RLock()
    23  	memUnallocated := m.getUnallocatedMemoryInMiBWithLock()
    24  	numSubnets := len(m.subnets)
    25  	numFreeAddresses := len(m.addressPool.Free)
    26  	numRegisteredAddresses := len(m.addressPool.Registered)
    27  	ownerGroups := make([]string, 0, len(m.ownerGroups))
    28  	for group := range m.ownerGroups {
    29  		ownerGroups = append(ownerGroups, group)
    30  	}
    31  	ownerUsers := make([]string, 0, len(m.ownerUsers))
    32  	for user := range m.ownerUsers {
    33  		ownerUsers = append(ownerUsers, user)
    34  	}
    35  	m.mutex.RUnlock()
    36  	fmt.Fprintf(writer,
    37  		"Available addresses: <a href=\"listAvailableAddresses\">%d</a><br>\n",
    38  		numFreeAddresses)
    39  	fmt.Fprintf(writer,
    40  		"Registered addresses: <a href=\"listRegisteredAddresses\">%d</a><br>\n",
    41  		numRegisteredAddresses)
    42  	fmt.Fprintf(writer, "Available CPU: %g<br>\n",
    43  		float64(m.getAvailableMilliCPU())*1e-3)
    44  	if memInfo, err := meminfo.GetMemInfo(); err != nil {
    45  		fmt.Fprintf(writer, "Error getting available RAM: %s<br>\n", err)
    46  	} else {
    47  		fmt.Fprintf(writer, "Available RAM: real: %s, unallocated: %s<br>\n",
    48  			format.FormatBytes(memInfo.Available),
    49  			format.FormatBytes(memUnallocated<<20))
    50  	}
    51  	sort.Strings(ownerGroups)
    52  	sort.Strings(ownerUsers)
    53  	if len(ownerGroups) > 0 {
    54  		fmt.Fprintf(writer, "Owner groups: %s<br>\n",
    55  			strings.Join(ownerGroups, " "))
    56  	}
    57  	if len(ownerUsers) > 0 {
    58  		fmt.Fprintf(writer, "Owner users: %s<br>\n",
    59  			strings.Join(ownerUsers, " "))
    60  	}
    61  	if m.serialNumber != "" {
    62  		fmt.Fprintf(writer, "Serial number: \"%s\"<br>\n", m.serialNumber)
    63  	}
    64  	fmt.Fprintf(writer,
    65  		"Number of subnets: <a href=\"listSubnets\">%d</a><br>\n", numSubnets)
    66  	fmt.Fprint(writer, "Volume directories:")
    67  	for _, dirname := range m.volumeDirectories {
    68  		fmt.Fprint(writer, " ", dirname)
    69  		if m.volumeInfos[dirname].canTrim {
    70  			fmt.Fprint(writer, "(TRIM)")
    71  		}
    72  	}
    73  	fmt.Fprintln(writer, "<br>")
    74  	if m.objectCache == nil {
    75  		fmt.Fprintln(writer, "No object cache<br>")
    76  	} else {
    77  		m.objectCache.WriteHtml(writer)
    78  	}
    79  }
    80  
    81  func writeCountLinks(writer io.Writer, text, path string, count uint) {
    82  	fmt.Fprintf(writer,
    83  		"%s: <a href=\"%s\">%d</a> (<a href=\"%s&output=text\">text</a>)<br>\n",
    84  		text, path, count, path)
    85  }