oestats-client.bbclass: use METADATA_REVISION variable (thanks hrw)
[vuplus_openembedded] / classes / oestats-client.bbclass
1 # Integration with the oestats build statistics server, see:
2 #
3 # http://opensource.bolloretelecom.eu/projects/oestats
4 #
5 # To make use of this class, add to your local.conf:
6 #
7 # INHERIT += "oestats-client"
8 # OESTATS_SERVER = "some.server.org:8000"
9 # OESTATS_BUILDER = "some title"
10
11 def oestats_setid(d, val):
12         import bb
13         f = file(bb.data.getVar('TMPDIR', d, True) + '/oestats.id', 'w')
14         f.write(val)
15
16 def oestats_getid(d):
17         import bb
18         f = file(bb.data.getVar('TMPDIR', d, True) + '/oestats.id', 'r')
19         return f.read()
20         
21 def oestats_send(server, action, vars = {}):
22         import httplib, urllib
23
24         params = urllib.urlencode(vars)
25         headers = {"Content-type": "application/x-www-form-urlencoded",
26                 "Accept": "text/plain"}
27         conn = httplib.HTTPConnection(server)
28         conn.request("POST", action, params, headers)
29         response = conn.getresponse()
30         conn.close()
31         return response
32
33 def oestats_start(server, builder, d):
34         import bb
35         import os.path
36
37         # send report
38         response = oestats_send(server, "/builds/start/", {
39                 'builder': builder,
40                 'revision': bb.data.getVar('METADATA_REVISION', d, True),
41                 'machine': bb.data.getVar('MACHINE', d, True),
42                 'distro': bb.data.getVar('DISTRO', d, True),
43         })
44         id = response.read()
45
46         # save the build id
47         oestats_setid(d, id)
48
49 def oestats_stop(server, d, status):
50         import bb
51
52         # retrieve build id
53         id = oestats_getid(d)
54
55         # send report
56         response = oestats_send(server, "/builds/stop/%s/" % id, {
57                 'status': status,
58         })
59
60 def oestats_task(server, d, task, status):
61         import bb
62         import time
63
64         # retrieve build id
65         id = oestats_getid(d)
66         try:
67                 elapsed = time.time() - float(bb.data.getVar('OESTATS_STAMP', d, True))
68         except:
69                 elapsed = 0
70
71         # send report
72         response = oestats_send(server, "/builds/task/%s/" % id, {
73                 'package': bb.data.getVar('PN', d, True),
74                 'version': bb.data.getVar('PV', d, True),
75                 'revision': bb.data.getVar('PR', d, True),
76                 'task': task,
77                 'status': status,
78                 'time': elapsed,
79         })
80
81 addhandler oestats_eventhandler
82 python oestats_eventhandler () {
83         from bb.event import getName
84         import bb
85         import time
86
87         if e.data is None or getName(e) == "MsgNote":
88                 return NotHandled
89
90         server = bb.data.getVar('OESTATS_SERVER', e.data, True)
91         builder = bb.data.getVar('OESTATS_BUILDER', e.data, True)
92         if not server or not builder:
93                 return NotHandled
94
95         if getName(e) == 'BuildStarted':
96                 oestats_start(server, builder, e.data)
97         elif getName(e) == 'BuildCompleted':
98                 oestats_stop(server, e.data, 'Completed')
99         elif getName(e) == 'TaskStarted':
100                 bb.data.setVar('OESTATS_STAMP', repr(time.time()), e.data)
101         elif getName(e) == 'TaskSucceeded':
102                 oestats_task(server, e.data, e.task, 'Succeeded')
103         elif getName(e) == 'TaskFailed':
104                 oestats_task(server, e.data, e.task, 'Failed')
105
106         return NotHandled
107 }