merge of '23febe44719cb1ea7557c584ce7c762da82df4d5'
[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_revision(dir):
12         import re
13         try:
14                 f = file("%s/_MTN/revision" % dir)
15                 m = re.search(r"old_revision \[(.*)\]", f.read())
16                 return m.group(1)
17         except:
18                 return
19
20 def oestats_send(server, action, vars = {}):
21         import httplib, urllib
22
23         params = urllib.urlencode(vars)
24         headers = {"Content-type": "application/x-www-form-urlencoded",
25                 "Accept": "text/plain"}
26         conn = httplib.HTTPConnection(server)
27         conn.request("POST", action, params, headers)
28         response = conn.getresponse()
29         conn.close()
30         return response
31
32 def oestats_start(server, builder, d):
33         import bb
34         import os.path
35
36         # collect information about revisions
37         path_bb = bb.data.getVar('BBPATH', d, 1)
38         for p in (path_bb or "").split(':'):
39                 revision = oestats_revision(p)
40                 if revision:
41                         break
42
43         # send report
44         response = oestats_send(server, "/builds/start/", {
45                 'builder': builder,
46                 'revision': revision,
47                 'machine': bb.data.getVar( 'MACHINE', d, True ),
48                 'distro': bb.data.getVar( 'DISTRO', d, True ),
49         })
50         id = response.read()
51
52         # save the build id
53         bb.note("Stats id: %s" % id)
54         f = file(bb.data.getVar('TMPDIR', d, True)+"/oestats.id", 'w')
55         f.write(id)
56
57 def oestats_stop(server, d, status):
58         import bb
59
60         # retrieve build id
61         f = file(bb.data.getVar('TMPDIR',d,True)+"/oestats.id", 'r')
62         id = f.read()
63
64         # send report
65         response = oestats_send(server, "/builds/stop/%s/" % id, {
66                 'status': status,
67         })
68
69 def oestats_task(server, d, task, status):
70         import bb
71
72         # retrieve build id
73         f = file(bb.data.getVar('TMPDIR',d,True)+"/oestats.id", 'r')
74         id = f.read()
75
76         # send report
77         response = oestats_send(server, "/builds/task/%s/" % id, {
78                 'package': bb.data.getVar('PN', d, True),
79                 'version': bb.data.getVar('PV', d, True),
80                 'revision': bb.data.getVar('PR', d, True),
81                 'task': task,
82                 'status': status,
83         })
84
85 addhandler oestats_eventhandler
86 python oestats_eventhandler () {
87         from bb.event import getName
88         import bb
89
90         if e.data is None or getName(e) == "MsgNote":
91                 return NotHandled
92
93         server = bb.data.getVar('OESTATS_SERVER', e.data, True)
94         builder = bb.data.getVar('OESTATS_BUILDER', e.data, True)
95         if not server or not builder:
96                 return NotHandled
97
98         if getName(e) == 'BuildStarted':
99                 oestats_start(server, builder, e.data)
100         elif getName(e) == 'BuildCompleted':
101                 oestats_stop(server, e.data, 'Completed')
102         elif getName(e) == 'TaskSucceeded':
103                 oestats_task(server, e.data, e.task, 'Succeeded')
104         elif getName(e) == 'TaskFailed':
105                 oestats_task(server, e.data, e.task, 'Failed')
106
107         return NotHandled
108 }