github.com/Cloud-Foundations/Dominator@v0.3.4/imageserver/httpd/showImage.go (about)

     1  package httpd
     2  
     3  import (
     4  	"bufio"
     5  	"fmt"
     6  	"io"
     7  	"net/http"
     8  	"time"
     9  
    10  	"github.com/Cloud-Foundations/Dominator/lib/format"
    11  	"github.com/Cloud-Foundations/Dominator/lib/image"
    12  	"github.com/Cloud-Foundations/Dominator/lib/json"
    13  )
    14  
    15  var timeFormat string = "02 Jan 2006 15:04:05.99 MST"
    16  
    17  func (s state) showImageHandler(w http.ResponseWriter, req *http.Request) {
    18  	writer := bufio.NewWriter(w)
    19  	defer writer.Flush()
    20  	imageName := req.URL.RawQuery
    21  	fmt.Fprintf(writer, "<title>image %s</title>\n", imageName)
    22  	fmt.Fprintln(writer, "<body>")
    23  	fmt.Fprintln(writer, "<h3>")
    24  	img := s.imageDataBase.GetImage(imageName)
    25  	if img == nil {
    26  		fmt.Fprintf(writer, "Image: %s UNKNOWN!\n", imageName)
    27  		return
    28  	}
    29  	fmt.Fprintf(writer, "Information for image: %s<br>\n", imageName)
    30  	fmt.Fprintln(writer, "</h3>")
    31  	fmt.Fprintf(writer, "Data size: <a href=\"listImage?%s\">%s</a><br>\n",
    32  		imageName, format.FormatBytes(img.FileSystem.TotalDataBytes))
    33  	fmt.Fprintf(writer, "Number of data inodes: %d<br>\n",
    34  		img.FileSystem.NumRegularInodes)
    35  	if numInodes := img.FileSystem.NumComputedRegularInodes(); numInodes > 0 {
    36  		fmt.Fprintf(writer,
    37  			"Number of computed inodes: <a href=\"listComputedInodes?%s\">%d</a><br>\n",
    38  			imageName, numInodes)
    39  	}
    40  	if img.Filter == nil {
    41  		fmt.Fprintln(writer, "Image has no filter: sparse image<br>")
    42  	} else if len(img.Filter.FilterLines) < 1 {
    43  		fmt.Fprintln(writer,
    44  			"Filter has 0 lines (empty filter: full coverage)<br>")
    45  	} else {
    46  		fmt.Fprintf(writer,
    47  			"Filter has <a href=\"listFilter?%s\">%d</a> lines<br>\n",
    48  			imageName, len(img.Filter.FilterLines))
    49  	}
    50  	if img.Triggers == nil || len(img.Triggers.Triggers) < 1 {
    51  		fmt.Fprintln(writer, "Image has no triggers<br>")
    52  	} else {
    53  		fmt.Fprintf(writer,
    54  			"Number of triggers: <a href=\"listTriggers?%s\">%d</a><br>\n",
    55  			imageName, len(img.Triggers.Triggers))
    56  	}
    57  	if !img.ExpiresAt.IsZero() {
    58  		fmt.Fprintf(writer, "Expires at: %s (in %s)<br>\n",
    59  			img.ExpiresAt.In(time.Local).Format(timeFormat),
    60  			format.Duration(time.Until(img.ExpiresAt)))
    61  	}
    62  	showAnnotation(writer, img.ReleaseNotes, imageName, "Release notes",
    63  		"listReleaseNotes")
    64  	showAnnotation(writer, img.BuildLog, imageName, "Build log",
    65  		"listBuildLog")
    66  	if img.CreatedBy != "" {
    67  		fmt.Fprintf(writer, "Created by: %s\n<br>", img.CreatedBy)
    68  	}
    69  	if img.CreatedFor != "" {
    70  		fmt.Fprintf(writer, "Created for: %s\n<br>", img.CreatedFor)
    71  	}
    72  	if !img.CreatedOn.IsZero() {
    73  		fmt.Fprintf(writer, "Created on: %s (%s old)\n<br>",
    74  			img.CreatedOn.In(time.Local).Format(timeFormat),
    75  			format.Duration(time.Since(img.CreatedOn)))
    76  	}
    77  	if len(img.BuildGitUrl) > 0 {
    78  		fmt.Fprintf(writer,
    79  			"Built from Git repository: %s on branch: %s at commit: %s<br>\n",
    80  			img.BuildGitUrl, img.BuildBranch, img.BuildCommitId)
    81  	}
    82  	if len(img.Packages) > 0 {
    83  		fmt.Fprintf(writer,
    84  			"Packages: <a href=\"listPackages?%s\">%d</a><br>\n",
    85  			imageName, len(img.Packages))
    86  	}
    87  	if img.SourceImage != "" {
    88  		if s.imageDataBase.CheckImage(img.SourceImage) {
    89  			fmt.Fprintf(writer,
    90  				"Source Image: <a href=\"showImage?%s\">%s</a><br>\n",
    91  				img.SourceImage, img.SourceImage)
    92  		} else {
    93  			fmt.Fprintf(writer, "Source Image: %s</a><br>\n", img.SourceImage)
    94  		}
    95  	}
    96  	if len(img.Tags) > 0 {
    97  		fmt.Fprintln(writer, "Tags:<br>")
    98  		fmt.Fprintln(writer,
    99  			`<pre style="background-color: #eee; border: 1px solid #999; display: block; float: left;">`)
   100  		json.WriteWithIndent(writer, "    ", img.Tags)
   101  		fmt.Fprintln(writer, `</pre><p style="clear: both;">`)
   102  	}
   103  	fmt.Fprintln(writer, "</body>")
   104  }
   105  
   106  func showAnnotation(writer io.Writer, annotation *image.Annotation,
   107  	imageName string, linkName string, baseURL string) {
   108  	if annotation == nil {
   109  		return
   110  	}
   111  	var url string
   112  	if annotation.URL != "" {
   113  		url = annotation.URL
   114  	} else {
   115  		url = baseURL + "?" + imageName
   116  	}
   117  	fmt.Fprintf(writer, "<a href=\"%s\">%s</a><br>\n", url, linkName)
   118  }