diff options
-rw-r--r-- | misc/dashboard/godashboard/gobuild.py | 33 | ||||
-rw-r--r-- | misc/dashboard/godashboard/main.html | 57 |
2 files changed, 59 insertions, 31 deletions
diff --git a/misc/dashboard/godashboard/gobuild.py b/misc/dashboard/godashboard/gobuild.py index de08490e8..6cc9e5828 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 ec874ce4f..388149ec3 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> |