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 }