github.com/Cloud-Foundations/Dominator@v0.3.4/hypervisor/manager/html.go (about)

     1  package manager
     2  
     3  import (
     4  	"fmt"
     5  	"io"
     6  	"sort"
     7  	"strings"
     8  	"time"
     9  
    10  	"github.com/Cloud-Foundations/Dominator/lib/format"
    11  	"github.com/Cloud-Foundations/Dominator/lib/meminfo"
    12  )
    13  
    14  func (m *Manager) writeHtml(writer io.Writer) {
    15  	if m.disabled {
    16  		fmt.Fprintln(writer,
    17  			`Hypervisor is <font color="red">disabled</font><p>`)
    18  	}
    19  	if wrote, _ := m.lockWatcher.WriteHtml(writer, ""); wrote {
    20  		fmt.Fprintln(writer, "<br>")
    21  	}
    22  	summary := m.getSummary()
    23  	if age := time.Since(summary.updatedAt); age > time.Second {
    24  		fmt.Fprintf(writer,
    25  			"<font color=\"salmon\">Dashboard data are %s old</font><p>\n",
    26  			format.Duration(age))
    27  	}
    28  	writeCountLinks(writer, "Number of VMs known", "listVMs?state=",
    29  		summary.numRunning+summary.numStopped)
    30  	writeCountLinks(writer, "Number of VMs running", "listVMs?state=running",
    31  		summary.numRunning)
    32  	writeCountLinks(writer, "Number of VMs stopped", "listVMs?state=stopped",
    33  		summary.numStopped)
    34  	fmt.Fprintln(writer, "<br>")
    35  	fmt.Fprintf(writer,
    36  		"Available addresses: <a href=\"listAvailableAddresses\">%d</a><br>\n",
    37  		summary.numFreeAddresses)
    38  	fmt.Fprintf(writer,
    39  		"Registered addresses: <a href=\"listRegisteredAddresses\">%d</a><br>\n",
    40  		summary.numRegisteredAddresses)
    41  	fmt.Fprintf(writer, "Available CPU: %s<br>\n",
    42  		format.FormatMilli(uint64(summary.availableMilliCPU)))
    43  	if memInfo, err := meminfo.GetMemInfo(); err != nil {
    44  		fmt.Fprintf(writer, "Error getting available RAM: %s<br>\n", err)
    45  	} else {
    46  		fmt.Fprintf(writer, "Available RAM: real: %s, unallocated: %s<br>\n",
    47  			format.FormatBytes(memInfo.Available),
    48  			format.FormatBytes(summary.memUnallocated<<20))
    49  	}
    50  	sort.Strings(summary.ownerGroups)
    51  	sort.Strings(summary.ownerUsers)
    52  	if len(summary.ownerGroups) > 0 {
    53  		fmt.Fprintf(writer, "Owner groups: %s<br>\n",
    54  			strings.Join(summary.ownerGroups, " "))
    55  	}
    56  	if len(summary.ownerUsers) > 0 {
    57  		fmt.Fprintf(writer, "Owner users: %s<br>\n",
    58  			strings.Join(summary.ownerUsers, " "))
    59  	}
    60  	if m.serialNumber != "" {
    61  		fmt.Fprintf(writer, "Serial number: \"%s\"<br>\n", m.serialNumber)
    62  	}
    63  	fmt.Fprintf(writer,
    64  		"Number of subnets: <a href=\"listSubnets\">%d</a><br>\n",
    65  		summary.numSubnets)
    66  	fmt.Fprintf(writer,
    67  		"Volume directories: <a href=\"showVolumeDirectories\">%d</a>",
    68  		len(m.volumeInfos))
    69  	fmt.Fprintln(writer, " <a href=\"listVolumeDirectories\">(text)</a><br>")
    70  	if m.objectCache == nil {
    71  		fmt.Fprintln(writer, "No object cache<br>")
    72  	} else {
    73  		m.objectCache.WriteHtml(writer)
    74  	}
    75  }
    76  
    77  func writeCountLinks(writer io.Writer, text, path string, count uint) {
    78  	fmt.Fprintf(writer,
    79  		"%s: <a href=\"%s\">%d</a> (<a href=\"%s&output=text\">text</a>)<br>\n",
    80  		text, path, count, path)
    81  }