+def tinder_http_post(server, selector, content_type, body):
+ import httplib
+ # now post it
+ for i in range(0,5):
+ try:
+ h = httplib.HTTP(server)
+ h.putrequest('POST', selector)
+ h.putheader('content-type', content_type)
+ h.putheader('content-length', str(len(body)))
+ h.endheaders()
+ h.send(body)
+ errcode, errmsg, headers = h.getreply()
+ #print errcode, errmsg, headers
+ return (errcode,errmsg, headers, h.file)
+ except:
+ print "Error sending the report!"
+ # try again
+ pass
+
+ # return some garbage
+ return (-1, "unknown", "unknown", None)
+
def tinder_form_data(bound, dict, log):
- """
- Create the boundary for the HTTP Post
- """
output = []
-
# for each key in the dictionary
for name in dict:
+ assert dict[name]
output.append( "--" + bound )
output.append( 'Content-Disposition: form-data; name="%s"' % name )
output.append( "" )
for the tinderbox to be happy.
"""
- from bb import data
+ from bb import data, build
import os,random
# the variables we will need to send on this form post
"os" : os.uname()[0],
"os_version" : os.uname()[2],
"compiler" : "gcc",
- "clobber" : data.getVar('TINDER_CLOBBER', d, True)
+ "clobber" : data.getVar('TINDER_CLOBBER', d, True) or "0",
+ "srcdate" : data.getVar('SRCDATE', d, True),
+ "PN" : data.getVar('PN', d, True),
+ "PV" : data.getVar('PV', d, True),
+ "PR" : data.getVar('PR', d, True),
+ "FILE" : data.getVar('FILE', d, True) or "N/A",
+ "TARGETARCH" : data.getVar('TARGET_ARCH', d, True),
+ "TARGETFPU" : data.getVar('TARGET_FPU', d, True) or "Unknown",
+ "TARGETOS" : data.getVar('TARGET_OS', d, True) or "Unknown",
+ "MACHINE" : data.getVar('MACHINE', d, True) or "Unknown",
+ "DISTRO" : data.getVar('DISTRO', d, True) or "Unknown",
+ "zecke-rocks" : "sure",
}
# optionally add the status
on the server.
"""
from bb import data
- import httplib
# get the body and type
content_type, body = tinder_format_http_post(d,None,None)
selector = url + "/xml/build_start.pl"
- print "selector %s and url %s" % (selector, url)
+ #print "selector %s and url %s" % (selector, url)
# now post it
- h = httplib.HTTP(server)
- h.putrequest('POST', selector)
- h.putheader('content-type', content_type)
- h.putheader('content-length', str(len(body)))
- h.endheaders()
- h.send(body)
- errcode, errmsg, headers = h.getreply()
- print errcode, errmsg, headers
- report = h.file.read()
+ errcode, errmsg, headers, h_file = tinder_http_post(server,selector,content_type, body)
+ #print errcode, errmsg, headers
+ report = h_file.read()
# now let us find the machine id that was assigned to us
search = "<machine id='"
f.write(report)
-def tinder_send_http(d, status, log):
+def tinder_send_http(d, status, _log):
"""
Send this log as build status
"""
from bb import data
- import httplib
# get the body and type
- content_type, body = tinder_format_http_post(d,status,log)
server = data.getVar('TINDER_HOST', d, True )
url = data.getVar('TINDER_URL', d, True )
selector = url + "/xml/build_status.pl"
- # now post it
- h = httplib.HTTP(server)
- h.putrequest('POST', selector)
- h.putheader('content-type', content_type)
- h.putheader('content-length', str(len(body)))
- h.endheaders()
- h.send(body)
- errcode, errmsg, headers = h.getreply()
- print errcode, errmsg, headers
- print h.file.read()
+ # now post it - in chunks of 10.000 charachters
+ new_log = _log
+ while len(new_log) > 0:
+ content_type, body = tinder_format_http_post(d,status,new_log[0:18000])
+ errcode, errmsg, headers, h_file = tinder_http_post(server,selector,content_type, body)
+ #print errcode, errmsg, headers
+ #print h.file.read()
+ new_log = new_log[18000:]
def tinder_print_info(d):
bbfiles = data.getVar( 'BBFILES', d, True )
tarch = data.getVar( 'TARGET_ARCH', d, True )
fpu = data.getVar( 'TARGET_FPU', d, True )
+ oerev = data.getVar( 'OE_REVISION', d, True ) or "unknown"
# there is a bug with tipple quoted strings
# i will work around but will fix the original
output.append("MACHINE = '%(machine)s'" )
output.append("DISTRO = '%(distro)s'" )
output.append("BBFILES = '%(bbfiles)s'" )
+ output.append("OEREV = '%(oerev)s'" )
output.append("== End Tinderbox Client Info" )
# now create the real output
return "\n".join(output) % vars()
-def tinder_tinder_start(d):
+def tinder_tinder_start(d, event):
"""
PRINT the configuration of this build
"""
time_start = tinder_time_string()
config = tinder_print_info(d)
- env = tinder_print_env()
+ #env = tinder_print_env()
time_end = tinder_time_string()
+ packages = " ".join( event.getPkgs() )
output = []
output.append( "---> TINDERBOX PRINTING CONFIGURATION %(time_start)s" )
output.append( config )
- output.append( env )
+ #output.append( env )
output.append( "<--- TINDERBOX FINISHED PRINTING CONFIGURATION %(time_end)s" )
+ output.append( "---> TINDERBOX BUILDING '%(packages)s'" )
+ output.append( "<--- TINDERBOX STARTING BUILD NOW" )
+
+ output.append( "" )
+
return "\n".join(output) % vars()
def tinder_do_tinder_report(event):
information immediately. The caching/queuing needs to be
implemented. Also sending more or less information is not
implemented yet.
+
+ We have two temporary files stored in the TMP directory. One file
+ contains the assigned machine id for the tinderclient. This id gets
+ assigned when we connect the box and start the build process the second
+ file is used to workaround an EventHandler limitation. If BitBake is ran
+ with the continue option we want the Build to fail even if we get the
+ BuildCompleted Event. In this case we have to look up the status and
+ send it instead of 100/success.
"""
from bb.event import getName
- from bb import data, mkdirhier
+ from bb import data, mkdirhier, build
import os, glob
# variables
name = getName(event)
log = ""
status = 1
-
# Check what we need to do Build* shows we start or are done
if name == "BuildStarted":
tinder_build_start(event.data)
- log = tinder_tinder_start(event.data)
+ log = tinder_tinder_start(event.data,event)
try:
# truncate the tinder log file
- f = file(data.getVar('TINDER_LOG', event.data, True), 'rw+')
- f.truncate(0)
+ f = file(data.getVar('TINDER_LOG', event.data, True), 'w')
+ f.write("")
f.close()
+ except:
+ pass
+
+ try:
+ # write a status to the file. This is needed for the -k option
+ # of BitBake
+ g = file(data.getVar('TMPDIR', event.data, True)+"/tinder-status", 'w')
+ g.write("")
+ g.close()
except IOError:
pass
if len(log_file) != 0:
to_file = data.getVar('TINDER_LOG', event.data, True)
- log = open(log_file[0], 'r').readlines()
+ log += "".join(open(log_file[0], 'r').readlines())
# set the right 'HEADER'/Summary for the TinderBox
if name == "TaskStarted":
- log += "--> TINDERBOX Task %s started" % event.task
+ log += "---> TINDERBOX Task %s started\n" % event.task
elif name == "TaskSucceeded":
- log += "<-- TINDERBOX Task %s done (SUCCESS)" % event.task
+ log += "<--- TINDERBOX Task %s done (SUCCESS)\n" % event.task
elif name == "TaskFailed":
- log += "<-- TINDERBOX Task %s failed (FAILURE)" % event.task
+ log += "<--- TINDERBOX Task %s failed (FAILURE)\n" % event.task
elif name == "PkgStarted":
- log += "--> TINDERBOX Package %s started" % data.getVar('P', event.data, True)
+ log += "---> TINDERBOX Package %s started\n" % data.getVar('PF', event.data, True)
elif name == "PkgSucceeded":
- log += "<-- TINDERBOX Package %s done (SUCCESS)" % data.getVar('P', event.data, True)
+ log += "<--- TINDERBOX Package %s done (SUCCESS)\n" % data.getVar('PF', event.data, True)
elif name == "PkgFailed":
- log += "<-- TINDERBOX Package %s failed (FAILURE)" % data.getVar('P', event.data, True)
+ if not data.getVar('TINDER_AUTOBUILD', event.data, True) == "0":
+ build.exec_func('do_clean', event.data)
+ log += "<--- TINDERBOX Package %s failed (FAILURE)\n" % data.getVar('PF', event.data, True)
status = 200
+ # remember the failure for the -k case
+ h = file(data.getVar('TMPDIR', event.data, True)+"/tinder-status", 'w')
+ h.write("200")
elif name == "BuildCompleted":
+ log += "Build Completed\n"
status = 100
+ # Check if we have a old status...
+ try:
+ h = file(data.getVar('TMPDIR',event.data,True)+'/tinder-status', 'r')
+ status = int(h.read())
+ except:
+ pass
+
+ elif name == "MultipleProviders":
+ log += "---> TINDERBOX Multiple Providers\n"
+ log += "multiple providers are available (%s);\n" % ", ".join(event.getCandidates())
+ log += "consider defining PREFERRED_PROVIDER_%s\n" % event.getItem()
+ log += "is runtime: %d\n" % event.isRuntime()
+ log += "<--- TINDERBOX Multiple Providers\n"
+ elif name == "NoProvider":
+ log += "Error: No Provider for: %s\n" % event.getItem()
+ log += "Error:Was Runtime: %d\n" % event.isRuntime()
+ status = 200
+ # remember the failure for the -k case
+ h = file(data.getVar('TMPDIR', event.data, True)+"/tinder-status", 'w')
+ h.write("200")
# now post the log
if len(log) == 0:
addhandler tinderclient_eventhandler
python tinderclient_eventhandler() {
from bb import note, error, data
- from bb.event import NotHandled
+ from bb.event import NotHandled, getName
+
+ if e.data is None or getName(e) == "MsgNote":
+ return NotHandled
do_tinder_report = data.getVar('TINDER_REPORT', e.data, True)
if do_tinder_report and do_tinder_report == "1":