github.com/Cloud-Foundations/Dominator@v0.3.4/imageunpacker/httpd/status.go (about) 1 package httpd 2 3 import ( 4 "bufio" 5 "fmt" 6 "io" 7 "net/http" 8 "sort" 9 10 "github.com/Cloud-Foundations/Dominator/lib/format" 11 "github.com/Cloud-Foundations/Dominator/lib/html" 12 proto "github.com/Cloud-Foundations/Dominator/proto/imageunpacker" 13 ) 14 15 func getStreamDashboardLink(streamName string, ok bool) string { 16 if !ok { 17 return "" 18 } 19 return fmt.Sprintf("<a href=\"showStreamDashboard?%s\">%s</a>", 20 streamName, streamName) 21 } 22 23 func (s state) getStreamStatusLink(streamName string, 24 stream proto.ImageStreamInfo, ok bool) string { 25 if !ok { 26 return stream.Status.String() 27 } 28 fs, _ := s.unpacker.GetFileSystem(streamName) 29 if fs == nil { 30 return stream.Status.String() 31 } 32 return fmt.Sprintf("<a href=\"showFileSystem?%s\">%s</a>", 33 streamName, stream.Status.String()) 34 } 35 36 func (s state) statusHandler(w http.ResponseWriter, req *http.Request) { 37 if req.URL.Path != "/" { 38 http.NotFound(w, req) 39 return 40 } 41 writer := bufio.NewWriter(w) 42 defer writer.Flush() 43 fmt.Fprintln(writer, "<title>image-unpacker status page</title>") 44 fmt.Fprintln(writer, `<style> 45 table, th, td { 46 border-collapse: collapse; 47 } 48 </style>`) 49 fmt.Fprintln(writer, "<body>") 50 fmt.Fprintln(writer, "<center>") 51 fmt.Fprintln(writer, "<h1>image-unpacker status page</h1>") 52 fmt.Fprintln(writer, "</center>") 53 html.WriteHeaderWithRequest(writer, req) 54 fmt.Fprintln(writer, "<h3>") 55 s.writeDashboard(writer) 56 for _, htmlWriter := range htmlWriters { 57 htmlWriter.WriteHtml(writer) 58 } 59 fmt.Fprintln(writer, "</h3>") 60 fmt.Fprintln(writer, "<hr>") 61 html.WriteFooter(writer) 62 fmt.Fprintln(writer, "</body>") 63 } 64 65 func (s state) writeDashboard(writer io.Writer) { 66 status := s.unpacker.GetStatus() 67 fmt.Fprintln(writer, "Image streams:<br>") 68 fmt.Fprintln(writer, `<table border="1">`) 69 tw, _ := html.NewTableWriter(writer, true, 70 "Image Stream", "Device Id", "Device Name", "Size", "Status") 71 streamNames := make([]string, 0, len(status.ImageStreams)) 72 for streamName := range status.ImageStreams { 73 streamNames = append(streamNames, streamName) 74 } 75 sort.Strings(streamNames) 76 for _, streamName := range streamNames { 77 stream := status.ImageStreams[streamName] 78 tw.WriteRow("", "", 79 getStreamDashboardLink(streamName, true), 80 stream.DeviceId, 81 status.Devices[stream.DeviceId].DeviceName, 82 func() string { 83 size := status.Devices[stream.DeviceId].Size 84 if size < 1 { 85 return "" 86 } 87 return format.FormatBytes(size) 88 }(), 89 s.getStreamStatusLink(streamName, stream, true), 90 ) 91 } 92 tw.Close() 93 fmt.Fprintln(writer, "<br>") 94 fmt.Fprintln(writer, "Devices:<br>") 95 fmt.Fprintln(writer, `<table border="1">`) 96 tw, _ = html.NewTableWriter(writer, true, "Device Id", "Device Name", 97 "Size", "Image Stream", "Status") 98 deviceIds := make([]string, 0, len(status.Devices)) 99 for deviceId := range status.Devices { 100 deviceIds = append(deviceIds, deviceId) 101 } 102 sort.Strings(deviceIds) 103 for _, deviceId := range deviceIds { 104 deviceInfo := status.Devices[deviceId] 105 stream, ok := status.ImageStreams[deviceInfo.StreamName] 106 tw.WriteRow("", "", 107 deviceId, 108 deviceInfo.DeviceName, 109 format.FormatBytes(deviceInfo.Size), 110 getStreamDashboardLink(deviceInfo.StreamName, ok), 111 s.getStreamStatusLink(deviceInfo.StreamName, stream, ok), 112 ) 113 } 114 tw.Close() 115 fmt.Fprintln(writer, "<br>") 116 }