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"
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(d, server, action, vars = {}, files = {}):
27 bound = '----------ThIs_Is_tHe_bouNdaRY_$'
30 output.append('--' + bound)
31 output.append('Content-Disposition: form-data; name="%s"' % key)
33 output.append(vars[key])
36 output.append('--' + bound)
37 output.append('Content-Disposition: form-data; name="%s"; filename="%s"' % (key, files[key]['filename']))
38 output.append('Content-Type: %s' % files[key]['content-type'])
41 output.append(files[key]['content'])
42 output.append('--' + bound + '--')
44 body = "\r\n".join(output)
48 "User-agent": "oestats-client/0.5",
49 "Content-type": "multipart/form-data; boundary=%s" % bound,
50 "Content-length": str(len(body))}
53 proxy = bb.data.getVar('HTTP_PROXY', d, True )
55 if (proxy.endswith('/')):
57 if (proxy.startswith('http://')):
59 conn = httplib.HTTPConnection(proxy)
60 action = "http://%s%s" %(server, action)
62 conn = httplib.HTTPConnection(server)
63 conn.request("POST", action, body, headers)
64 response = conn.getresponse()
65 data = response.read()
69 def oestats_start(server, builder, d):
77 data = oestats_send(d, server, "/builds/", {
79 'build_arch': bb.data.getVar('BUILD_ARCH', d, True),
80 'metadata_branch': bb.data.getVar('METADATA_BRANCH', d, True),
81 'metadata_revision': bb.data.getVar('METADATA_REVISION', d, True),
82 'machine': bb.data.getVar('MACHINE', d, True),
83 'distro': bb.data.getVar('DISTRO', d, True),
85 if re.match("^\d+$", data): id=data
91 bb.note("oestats: build %s" % id)
93 bb.note("oestats: error starting build, disabling stats")
96 def oestats_stop(server, d, failures):
100 id = oestats_getid(d)
110 response = oestats_send(d, server, "/builds/%s/" % id, {
113 if status == 'Failed':
114 bb.note("oestats: build failed, see http://%s%s" % (server,response))
116 bb.note("oestats: error stopping build")
118 def oestats_task(server, d, task, status):
125 id = oestats_getid(d)
128 # calculate build time
130 elapsed = time.time() - float(bb.data.getVar('OESTATS_STAMP', d, True))
136 if status == 'Failed':
137 logs = glob.glob("%s/log.%s.*" % (bb.data.getVar('T', d, True), task))
141 'filename': 'log.txt',
142 'content': file(log).read(),
143 'content-type': 'text/plain'}
144 if task == 'do_package':
145 qalog = "%s/log.qa_package" % bb.data.getVar('T', d, True)
146 if os.path.exists(qalog):
148 'filename': 'qalog.txt',
149 'content': file(qalog).read(),
150 'content-type': 'text/plain'}
155 'package': bb.data.getVar('PN', d, True),
156 'version': bb.data.getVar('PV', d, True),
157 'revision': bb.data.getVar('PR', d, True),
158 'depends': bb.data.getVar('DEPENDS', d, True),
161 'time': str(elapsed)}
162 bug_number = bb.data.getVar('OESTATS_BUG_NUMBER', d, True)
163 bug_tracker = bb.data.getVar('OESTATS_BUG_TRACKER', d, True)
164 if bug_number and bug_tracker:
165 vars['bug_number'] = bug_number
166 vars['bug_tracker'] = bug_tracker
170 response = oestats_send(d, server, "/tasks/", vars, files)
171 if status == 'Failed':
172 bb.note("oestats: task failed, see http://%s%s" % (server, response))
174 bb.note("oestats: error sending task, disabling stats")
177 addhandler oestats_eventhandler
178 python oestats_eventhandler () {
179 from bb.event import getName
183 if e.data is None or getName(e) == "MsgNote":
186 server = bb.data.getVar('OESTATS_SERVER', e.data, True)
187 builder = bb.data.getVar('OESTATS_BUILDER', e.data, True)
188 if not server or not builder:
191 if getName(e) == 'BuildStarted':
192 oestats_start(server, builder, e.data)
193 elif getName(e) == 'BuildCompleted':
194 oestats_stop(server, e.data, e.getFailures())
195 elif getName(e) == 'TaskStarted':
196 bb.data.setVar('OESTATS_STAMP', repr(time.time()), e.data)
197 elif getName(e) == 'TaskSucceeded':
198 oestats_task(server, e.data, e.task, 'Succeeded')
199 elif getName(e) == 'TaskFailed':
200 oestats_task(server, e.data, e.task, 'Failed')