aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2010-01-27 13:09:58 -0800
committerRuss Cox <rsc@golang.org>2010-01-27 13:09:58 -0800
commite0afb0c38b80675f347b2e840b5fd3b10cabcf91 (patch)
tree5add3f4c2c5b6eaf172a5d6bb9a5a71fc273ddff
parentf39dc9fff28749da312d711f0256fc8dfd9f9246 (diff)
downloadgo-e0afb0c38b80675f347b2e840b5fd3b10cabcf91.tar.gz
go-e0afb0c38b80675f347b2e840b5fd3b10cabcf91.zip
godashboard: fiddling
* some tweaks to dashboard html/css layout * use hmac to generate per-builder subkeys R=agl1 CC=golang-dev https://golang.org/cl/194092
-rw-r--r--misc/dashboard/godashboard/gobuild.py33
-rw-r--r--misc/dashboard/godashboard/main.html57
2 files changed, 59 insertions, 31 deletions
diff --git a/misc/dashboard/godashboard/gobuild.py b/misc/dashboard/godashboard/gobuild.py
index de08490e8e..6cc9e5828d 100644
--- a/misc/dashboard/godashboard/gobuild.py
+++ b/misc/dashboard/godashboard/gobuild.py
@@ -12,6 +12,7 @@ from google.appengine.ext.webapp.util import run_wsgi_app
import binascii
import datetime
import hashlib
+import hmac
import logging
import os
import re
@@ -70,21 +71,29 @@ class MainPage(webapp.RequestHandler):
results = q.fetch(30)
revs = [toRev(r) for r in results]
- allbuilders = set()
+ builders = {}
for r in revs:
for b in r['builds']:
- allbuilders.add(b['builder'])
+ f = b['builder'].split('-', 3)
+ goos = f[0]
+ goarch = f[1]
+ note = ""
+ if len(f) > 2:
+ note = f[2]
+ builders[b['builder']] = {'goos': goos, 'goarch': goarch, 'note': note}
+
for r in revs:
have = set(x['builder'] for x in r['builds'])
- need = allbuilders.difference(have)
+ need = set(builders.keys()).difference(have)
for n in need:
r['builds'].append({'builder': n, 'log':'', 'ok': False})
r['builds'].sort(cmp = byBuilder)
+ r['shortdesc'] = r['desc'].split('\n', 2)[0]
- builders = list(allbuilders)
+ builders = list(builders.items())
builders.sort()
- values = {"revs": revs, "builders": builders}
+ values = {"revs": revs, "builders": [v for k,v in builders]}
path = os.path.join(os.path.dirname(__file__), 'main.html')
self.response.out.write(template.render(path, values))
@@ -107,9 +116,13 @@ class GetHighwater(webapp.RequestHandler):
self.response.set_status(200)
self.response.out.write(hw.commit)
+def auth(req):
+ k = req.get('key')
+ return k == hmac.new(key.accessKey, req.get('builder')).hexdigest() or k == key.accessKey
+
class SetHighwater(webapp.RequestHandler):
def post(self):
- if self.request.get('key') != key.accessKey:
+ if not auth(self.request):
self.response.set_status(403)
return
@@ -141,7 +154,7 @@ class LogHandler(webapp.RequestHandler):
# it cannot be created by Build.
class Init(webapp.RequestHandler):
def post(self):
- if self.request.get('key') != key.accessKey:
+ if not auth(self.request):
self.response.set_status(403)
return
@@ -167,7 +180,7 @@ class Init(webapp.RequestHandler):
# Build is the main command: it records the result of a new build.
class Build(webapp.RequestHandler):
def post(self):
- if self.request.get('key') != key.accessKey:
+ if not auth(self.request):
self.response.set_status(403)
return
@@ -248,7 +261,7 @@ class Benchmarks(webapp.RequestHandler):
self.response.out.write(']}\n')
def post(self):
- if self.request.get('key') != key.accessKey:
+ if not auth(self.request):
self.response.set_status(403)
return
@@ -414,7 +427,7 @@ application = webapp.WSGIApplication(
('/build', Build),
('/benchmarks', Benchmarks),
('/benchmarks/.*', GetBenchmarks),
- ])
+ ], debug=True)
def main():
run_wsgi_app(application)
diff --git a/misc/dashboard/godashboard/main.html b/misc/dashboard/godashboard/main.html
index ec874ce4ff..388149ec31 100644
--- a/misc/dashboard/godashboard/main.html
+++ b/misc/dashboard/godashboard/main.html
@@ -1,16 +1,20 @@
<!DOCTYPE HTML>
<html>
<head>
- <title>Go build</title>
+ <title>Go dashboard</title>
<style>
- td.revision {
- font-family: monospace;
+ h1 {
+ font-size: 1em;
+ font-weight: bold;
+ }
+ h2 {
+ font-size: 1em;
+ font-weight: bold;
}
table.alternate {
white-space: nowrap;
}
-
table.alternate tr td {
padding-right: 10px;
}
@@ -18,54 +22,66 @@
padding-right: 0;
}
table.alternate tr:nth-child(2n) {
- background-color: #eef;
+ background-color: #f8f8f8;
}
- td.user {
+ td.revision {
+ }
+ span.hash {
font-family: monospace;
+ font-size: small;
+ color: #aaa;
+ }
+ span.nodeseq {
+ }
+ td.user {
+ font-size: small;
}
td.date {
- font-size: 0.8em;
+ color: #aaa;
+ font-size: small;
}
td.result {
text-align: center;
}
+ span.ok {
+ }
td.desc {
- font-size: 0.9em;
+ font-size: small;
font-family: sans-serif;
}
th.builder {
- font-variant: small-caps;
- font-size: 1.2em;
- color: #966;
- padding-right: 1em;
- }
- span.ok {
- color: green;
+ font-weight: bold;
+ padding-right: 0.5em;
}
</style>
</head>
<body>
+ <h1>Go dashboard</h1>
+
+ <h2>Build status</h2>
<table class="alternate" cellpadding="0" cellspacing="0">
<tr>
+ <th></th>
{% for b in builders %}
- <th class="builder">{{b}}</th>
+ <th class="builder">{{b.goos}}<br>{{b.goarch}}<br>{{b.note}}</th>
{% endfor %}
<th></th>
<th></th>
<th></th>
- <th></th>
</tr>
{% for r in revs %}
<tr>
+ <td class="revision"><span class="hash"><a href="https://code.google.com/p/go/source/detail?r={{r.node}}">{{r.node|slice:":12"}}</a></span></td>
+
{% for b in r.builds %}
<td class="result">
{% if b.ok %}
- <span class="ok">☺</span>
+ <span class="ok">ok</span>
{% else %}
{% if b.log %}
- <a href="/log/{{b.log}}">failed</a>
+ <a href="/log/{{b.log}}">fail</a>
{% else %}
<span/>
{% endif %}
@@ -73,10 +89,9 @@
</td>
{% endfor %}
- <td class="revision"><a href="https://code.google.com/p/go/source/detail?r={{r.node}}">{{r.node|slice:":12"}}</a></td>
<td class="user">{{r.user|escape}}</td>
<td class="date">{{r.date|escape}}</td>
- <td class="desc">{{r.desc|escape}}</td>
+ <td class="desc">{{r.shortdesc|escape}}</td>
</tr>
{% endfor %}
</table>