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 }