From e73944763eedc60f6ea034a8e6b0e231cdb95b25 Mon Sep 17 00:00:00 2001 From: Jeremy Laine Date: Thu, 15 May 2008 12:09:16 +0000 Subject: oestats-client.bbclass: initial version of an oe-specific tinderbox tool --- classes/oestats-client.bbclass | 108 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 classes/oestats-client.bbclass diff --git a/classes/oestats-client.bbclass b/classes/oestats-client.bbclass new file mode 100644 index 0000000000..da70a77825 --- /dev/null +++ b/classes/oestats-client.bbclass @@ -0,0 +1,108 @@ +# Integration with the oestats build statistics server, see: +# +# http://opensource.bolloretelecom.eu/projects/oestats +# +# To make use of this class, add to your local.conf: +# +# INHERIT += "oestats-client" +# OESTATS_SERVER = "some.server.org:8000" +# OESTATS_BUILDER = "some title" + +def oestats_revision(dir): + import re + try: + f = file("%s/_MTN/revision" % dir) + m = re.search(r"old_revision \[(.*)\]", f.read()) + return m.group(1) + except: + return + +def oestats_send(server, action, vars = {}): + import httplib, urllib + + params = urllib.urlencode(vars) + headers = {"Content-type": "application/x-www-form-urlencoded", + "Accept": "text/plain"} + conn = httplib.HTTPConnection(server) + conn.request("POST", action, params, headers) + response = conn.getresponse() + conn.close() + return response + +def oestats_start(server, builder, d): + import bb + import os.path + + # collect information about revisions + path_bb = bb.data.getVar('BBPATH', d, 1) + for p in (path_bb or "").split(':'): + revision = oestats_revision(p) + if revision: + break + + # send report + response = oestats_send(server, "/builds/start/", { + 'builder': builder, + 'revision': revision, + 'machine': bb.data.getVar( 'MACHINE', d, True ), + 'distro': bb.data.getVar( 'DISTRO', d, True ), + }) + id = response.read() + + # save the build id + bb.note("Stats id: %s" % id) + f = file(bb.data.getVar('TMPDIR', d, True)+"/oestats.id", 'w') + f.write(id) + +def oestats_stop(server, d, status): + import bb + + # retrieve build id + f = file(bb.data.getVar('TMPDIR',d,True)+"/oestats.id", 'r') + id = f.read() + + # send report + response = oestats_send(server, "/builds/stop/%s/" % id, { + 'status': status, + }) + +def oestats_task(server, d, task, status): + import bb + + # retrieve build id + f = file(bb.data.getVar('TMPDIR',d,True)+"/oestats.id", 'r') + id = f.read() + + # send report + response = oestats_send(server, "/builds/task/%s/" % id, { + 'package': bb.data.getVar('PN', d, True), + 'version': bb.data.getVar('PV', d, True), + 'revision': bb.data.getVar('PR', d, True), + 'task': task, + 'status': status, + }) + +addhandler oestats_eventhandler +python oestats_eventhandler () { + from bb.event import getName + import bb + + if e.data is None or getName(e) == "MsgNote": + return NotHandled + + server = bb.data.getVar('OESTATS_SERVER', e.data, True) + builder = bb.data.getVar('OESTATS_BUILDER', e.data, True) + if not server or not builder: + return NotHandled + + if getName(e) == 'BuildStarted': + oestats_start(server, builder, e.data) + elif getName(e) == 'BuildCompleted': + oestats_stop(server, e.data, 'Completed') + elif getName(e) == 'TaskSucceeded': + oestats_task(server, e.data, e.task, 'Succeeded') + elif getName(e) == 'TaskFailed': + oestats_task(server, e.data, e.task, 'Failed') + + return NotHandled +} -- cgit v1.2.3