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 }