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  }