github.com/Cloud-Foundations/Dominator@v0.3.4/dom/herd/showImagesForSubs.go (about)

     1  package herd
     2  
     3  import (
     4  	"bufio"
     5  	"fmt"
     6  	"io"
     7  	"net/http"
     8  	"strings"
     9  
    10  	"github.com/Cloud-Foundations/Dominator/lib/constants"
    11  	"github.com/Cloud-Foundations/Dominator/lib/html"
    12  	"github.com/Cloud-Foundations/Dominator/lib/srpc"
    13  	"github.com/Cloud-Foundations/Dominator/lib/tags/tagmatcher"
    14  	"github.com/Cloud-Foundations/Dominator/lib/url"
    15  	proto "github.com/Cloud-Foundations/Dominator/proto/dominator"
    16  )
    17  
    18  func (herd *Herd) getInfoForSubs(request proto.GetInfoForSubsRequest) (
    19  	[]proto.SubInfo, error) {
    20  	selectFunc := makeSelector(request.LocationsToMatch,
    21  		request.StatusesToMatch, tagmatcher.New(request.TagsToMatch, false))
    22  	if len(request.Hostnames) < 1 {
    23  		herd.RLock()
    24  		defer herd.RUnlock()
    25  		subInfos := make([]proto.SubInfo, 0, len(herd.subsByIndex))
    26  		for _, sub := range herd.subsByIndex {
    27  			if selectFunc(sub) {
    28  				subInfos = append(subInfos, sub.makeInfo())
    29  			}
    30  		}
    31  		return subInfos, nil
    32  	}
    33  	subInfos := make([]proto.SubInfo, 0, len(request.Hostnames))
    34  	herd.RLock()
    35  	defer herd.RUnlock()
    36  	for _, hostname := range request.Hostnames {
    37  		if sub, ok := herd.subsByName[hostname]; ok {
    38  			if selectFunc(sub) {
    39  				subInfos = append(subInfos, sub.makeInfo())
    40  			}
    41  		}
    42  	}
    43  	return subInfos, nil
    44  }
    45  
    46  func (herd *Herd) listImagesForSubsHandler(w http.ResponseWriter,
    47  	req *http.Request) {
    48  	querySelectFunc := makeUrlQuerySelector(req.URL.Query())
    49  	selectFunc := func(sub *Sub) bool {
    50  		return selectAliveSub(sub) && querySelectFunc(sub)
    51  	}
    52  	writer := bufio.NewWriter(w)
    53  	defer writer.Flush()
    54  	parsedQuery := url.ParseQuery(req.URL)
    55  	switch parsedQuery.OutputType() {
    56  	case url.OutputTypeCsv:
    57  		herd.showSubsCSV(writer, selectFunc)
    58  	case url.OutputTypeHtml: // Want the benchmarking endpoint instead.
    59  		fmt.Fprintln(writer, "HTML output not supported")
    60  	case url.OutputTypeJson:
    61  		herd.showSubsJSON(writer, selectFunc)
    62  	case url.OutputTypeText:
    63  		fmt.Fprintln(writer, "Text output not supported")
    64  	default:
    65  		fmt.Fprintln(writer, "Unknown output type")
    66  	}
    67  }
    68  
    69  func (herd *Herd) showImagesForSubsHandler(w io.Writer, req *http.Request) {
    70  	querySelectFunc := makeUrlQuerySelector(req.URL.Query())
    71  	herd.showImagesForSubsHTML(w, func(sub *Sub) bool {
    72  		return selectAliveSub(sub) && querySelectFunc(sub)
    73  	})
    74  }
    75  
    76  func (herd *Herd) showImagesForSubsHTML(writer io.Writer,
    77  	selectFunc func(*Sub) bool) {
    78  	fmt.Fprintf(writer, "<title>Dominator images for subs</title>")
    79  	fmt.Fprintln(writer, `<style>
    80                            table, th, td {
    81                            border-collapse: collapse;
    82                            }
    83                            </style>`)
    84  	if srpc.CheckTlsRequired() {
    85  		fmt.Fprintln(writer, "<body>")
    86  	} else {
    87  		fmt.Fprintln(writer, "<body bgcolor=\"#ffb0b0\">")
    88  		fmt.Fprintln(writer,
    89  			`<h1><center><font color="red">Running in insecure mode. You can get pwned!!!</center></font></h1>`)
    90  	}
    91  	if herd.updatesDisabledReason != "" {
    92  		fmt.Fprintf(writer, "<center>")
    93  		herd.writeDisableStatus(writer)
    94  		fmt.Fprintln(writer, "</center>")
    95  	}
    96  	fmt.Fprintln(writer, `<table border="1" style="width:100%">`)
    97  	tw, _ := html.NewTableWriter(writer, true, "Name", "Required Image",
    98  		"Planned Image", "Status", "Last Image Update", "Last Note")
    99  	subs := herd.getSelectedSubs(selectFunc)
   100  	for _, sub := range subs {
   101  		showImagesForSub(tw, sub)
   102  	}
   103  	tw.Close()
   104  }
   105  
   106  func showImagesForSub(tw *html.TableWriter, sub *Sub) {
   107  	var background string
   108  	if sub.isInsecure {
   109  		background = "yellow"
   110  	}
   111  	tw.OpenRow("", background)
   112  	defer tw.CloseRow()
   113  	subURL := fmt.Sprintf("http://%s:%d/",
   114  		strings.SplitN(sub.String(), "*", 2)[0], constants.SubPortNumber)
   115  	tw.WriteData("", fmt.Sprintf("<a href=\"%s\">%s</a>", subURL, sub))
   116  	sub.herd.showImage(tw, sub.mdb.RequiredImage, true)
   117  	sub.herd.showImage(tw, sub.mdb.PlannedImage, false)
   118  	tw.WriteData("",
   119  		fmt.Sprintf("<a href=\"showSub?%s\">%s</a>",
   120  			sub.mdb.Hostname, sub.publishedStatus.html()))
   121  	sub.herd.showImage(tw, sub.lastSuccessfulImageName, false)
   122  	tw.WriteData("", sub.lastNote)
   123  }