1 # Integration with the oestats build statistics server, see:
3 # http://opensource.bolloretelecom.eu/projects/oestats
5 # To make use of this class, add to your local.conf:
7 # INHERIT += "oestats-client"
8 # OESTATS_SERVER = "some.server.org:8000"
9 # OESTATS_BUILDER = "some_nickname"
11 def oestats_setid(d, val):
13 f = file(bb.data.getVar('TMPDIR', d, True) + '/oestats.id', 'w')
18 f = file(bb.data.getVar('TMPDIR', d, True) + '/oestats.id', 'r')
21 def oestats_send(server, action, vars = {}, files = {}):
26 bound = '----------ThIs_Is_tHe_bouNdaRY_$'
29 output.append('--' + bound)
30 output.append('Content-Disposition: form-data; name="%s"' % key)
32 output.append(vars[key])
35 output.append('--' + bound)
36 output.append('Content-Disposition: form-data; name="%s"; filename="%s"' % (key, files[key]['filename']))
37 output.append('Content-Type: %s' % files[key]['content-type'])
40 output.append(files[key]['content'])
41 output.append('--' + bound + '--')
43 body = "\r\n".join(output)
47 "User-agent": "oestats-client/0.1",
48 "Content-type": "multipart/form-data; boundary=%s" % bound,
49 "Content-length": str(len(body))}
52 conn = httplib.HTTPConnection(server)
53 conn.request("POST", action, body, headers)
54 response = conn.getresponse()
55 data = response.read()
59 def oestats_start(server, builder, d):
67 data = oestats_send(server, "/builds/start/", {
69 'revision': bb.data.getVar('METADATA_REVISION', d, True),
70 'machine': bb.data.getVar('MACHINE', d, True),
71 'distro': bb.data.getVar('DISTRO', d, True),
73 if re.match("^\d+$", data): id=data
79 bb.note("oestats: build %s" % id)
81 bb.note("oestats: error starting build, disabling stats")
84 def oestats_stop(server, d, status):
93 response = oestats_send(server, "/builds/stop/%s/" % id, {
97 bb.note("oestats: error stopping build")
99 def oestats_task(server, d, task, status):
105 id = oestats_getid(d)
108 # calculate build time
110 elapsed = time.time() - float(bb.data.getVar('OESTATS_STAMP', d, True))
114 # send the log for failures
116 if status == 'Failed':
117 logs = glob.glob("%s/log.%s.*" % (bb.data.getVar('T', d, True), task))
120 bb.note("oestats: sending log file : %s" % log)
122 'filename': 'log.txt',
123 'content': file(log).read(),
124 'content-type': 'text/plain'}
128 response = oestats_send(server, "/builds/task/%s/" % id, {
129 'package': bb.data.getVar('PN', d, True),
130 'version': bb.data.getVar('PV', d, True),
131 'revision': bb.data.getVar('PR', d, True),
134 'time': str(elapsed),
137 bb.note("oestats: error sending task, disabling stats")
140 addhandler oestats_eventhandler
141 python oestats_eventhandler () {
142 from bb.event import getName
146 if e.data is None or getName(e) == "MsgNote":
149 server = bb.data.getVar('OESTATS_SERVER', e.data, True)
150 builder = bb.data.getVar('OESTATS_BUILDER', e.data, True)
151 if not server or not builder:
154 if getName(e) == 'BuildStarted':
155 oestats_start(server, builder, e.data)
156 elif getName(e) == 'BuildCompleted':
157 oestats_stop(server, e.data, 'Completed')
158 elif getName(e) == 'TaskStarted':
159 bb.data.setVar('OESTATS_STAMP', repr(time.time()), e.data)
160 elif getName(e) == 'TaskSucceeded':
161 oestats_task(server, e.data, e.task, 'Succeeded')
162 elif getName(e) == 'TaskFailed':
163 oestats_task(server, e.data, e.task, 'Failed')