def load_info(self): # reload list of packages (allows us to update the list without restarting the daemon) reload(config) self.td_active = config.td_active self.max_poll_interval = config.td_max_poll_interval self.network_error_interval = config.td_network_error_interval self.num_sequential = config.td_num_sequential self.sequential = config.td_sequential self.src_repo = src_repo_utils.svn(config.MONO_ROOT, key_file=config.src_key_file) self.distfiles = datastore.source_file_repo() self.pack_objs = {} for pack in config.td_packages: self.pack_objs[pack] = packaging.package("", pack)
def index(req, **vars): # Debug to see what's available in req #return("\n".join(dir(req))) # Validate/sanitize args to catch some common security errors vars = www_utils.sanitize_args(vars) # Default to HEAD if it's not specified if vars.has_key('HEAD_or_RELEASE'): HEAD_or_RELEASE = vars['HEAD_or_RELEASE'] else: HEAD_or_RELEASE = 'HEAD' if HEAD_or_RELEASE != "HEAD" and HEAD_or_RELEASE != "RELEASE": return("Invalid parameters") scriptname = os.path.basename(req.canonical_filename) # Pull this in from the release repo plat_objs = build.get_platform_objs() pack_objs, noarch_pack_objs = build.get_package_objs(honor_disable_webview=True) req.content_type = "text/html" req.write( """ %s <HTML> <HEAD> <TITLE>Mono Build Status - %s</TITLE> <link rel="stylesheet" href="../build.css" type="text/css"> <script language="javascript" src="../build.js" type="text/javascript"></script> <meta http-equiv="refresh" content="60"> </HEAD> <BODY> <H1>Mono Build Status - %s</H1> """ % (doc_type, HEAD_or_RELEASE, HEAD_or_RELEASE)) # Display status of tarball daemon tarball_daemon_status = "Active" td_color = "#008A10" if not config.td_active: tarball_daemon_status = "Stopped" td_color = "#999999" # Display status of scheduler daemon sched_daemon_status = "Active" sd_color = "#008A10" if not config.sd_active: sched_daemon_status = "Stopped" sd_color = "#999999" req.write(""" <h2>Tarball daemon: <span style='color:%s'>%s</span> Scheduler daemon: <span style='color:%s'>%s</span></h2> """ % (td_color,tarball_daemon_status,sd_color,sched_daemon_status)) legend_html = """ <h3>Build Matrix Legend</h3> <div> <table class="legend"> <tbody> <tr> <th class="inprogress">In Progress</th> <th class="success">Success</th> <th class="failure">Build Failed</th> <th class="testfailure">Tests Failed</th> <th class="timeout">Timed Out</th> <th class="new">New</th> </tr> </tbody> </table> <p> <table> <tr><td>Inner color:</td><td>current build</td><td>%s</td><td>Black label:</td><td>Active platform</td></tr> <tr><td>Outer color:</td><td>previous build</td><td></td><td>Grey label:</td><td><span style='color:#999999'>Stopped platform</span></td></tr> </table> </p> </div>""" % (' ' * 20) req.write(legend_html) req.write(""" <h3>Build Matrix</h3> <div> <table class="buildstatus"> """) # Get unique list of used platforms platforms = {} for obj in pack_objs: for host in obj.info['BUILD_HOSTS']: platforms[host] = "" # Remove unused plat_objs num_removed = 0 for i in range(0, len(plat_objs)): if not platforms.has_key(plat_objs[i - num_removed].name): plat_objs.pop(i - num_removed) num_removed += 1 count = 0 # Only read once here src = datastore.source_file_repo() src.load_info() # Iterate through arch packages, and then noarch packages for (platforms, packs) in [ (plat_objs, pack_objs), (['noarch'], noarch_pack_objs) ]: req.write("<tr><td></td>\n") for obj in packs: req.write("<th>%s</th>\n" % obj.name) req.write("</tr>\n") # Add row for mktarball status req.write("<tr><th>mktarball</th>\n") for package in packs: info = src.get_tarball_state_info(HEAD_or_RELEASE, package.name, read_info=False) revision = "" revision2 = "" state = "" state2 = "" if len(info['revisions']) > 0: revision = info['revisions'][0] state = info['state'][revision] link = '<a href="../tarball_logs/%s/%s/%s.log">%s</a>' % (HEAD_or_RELEASE, package.name, revision, revision) if len(info['revisions']) > 1: revision2 = info['revisions'][1] state2 = info['state'][revision2] if revision2: req.write('<td class="%s">' % state2) req.write('<center><table class="%s"><tr><td>' % (state)) req.write(link) req.write("</td></tr></table></center>") req.write("</td>\n") else: req.write('<td class="%s">' % state) req.write(link) req.write("</td>\n") else: req.write('<td class="new">') req.write("</td>\n") req.write("</tr>\n") # End of mktarball row # list out non-noarch packages for platform in platforms: if platform == 'noarch': platform_name = "noarch" else: platform_name = platform.name # TODO: Find out if the platform is removed from the schedulers list isRunning = platform_name in config.sd_latest_build_distros if platform_name == "noarch": isRunning = True color = "black" if not isRunning: color = "#999999" styled_text = "<span style='color:%s'>%s</span>" % (color, platform_name) #status_image = "<img src='%s'>" % status_image #req.write("<tr><th>%s <br>%s</th>\n" % (platform_name,status_image)) req.write("<tr><th>%s</th>\n" % styled_text) for package in packs: #req.write("<br>".join(package.info.keys())) if platform == "noarch": platform_name = package.info['BUILD_HOSTS'][0] # if this is a valid package for this platform... if package.info['BUILD_HOSTS'].count(platform_name): # show the last two builds (otherwise, it's going to mostly be showing yellow) versions = build.get_versions(HEAD_or_RELEASE, platform_name, package.name) # in <num> format version = "" version2 = "" state = "" # pop and get first version if len(versions) > 0: version = versions.pop() build_info = datastore.build_info(HEAD_or_RELEASE, platform_name, package.name, version) state = build_info.get_state() # pop and get second version if len(versions) > 0: version2 = versions.pop() build_info2 = datastore.build_info(HEAD_or_RELEASE, platform_name, package.name, version2) state2 = build_info2.get_state() # if it's a valid package, but hasn't been built yet... if state == "": state = "new" link = "" else: link = '<a href="%s/packagestatus?platform=%s&package=%s&HEAD_or_RELEASE=%s">%s</a>' % ( scriptname, platform_name, package.name, HEAD_or_RELEASE, version) # if there's a previous version, print a container table if version2: req.write('<td class="%s">' % state2) req.write('<center><table class="%s"><tr><td>' % (state)) req.write(link) req.write("</td></tr></table></center>") req.write("</td>\n") else: req.write('<td class="%s">' % state) req.write(link) req.write("</td>\n") else: req.write('<td class="notused">') req.write("</td>\n") req.write("</tr>\n") # Separator section ( # Don't write this on the last one ) if count == 0: req.write("<tr><td></td></tr>\n") count+= 1 req.write("</table>\n</div>") # Legend req.write(legend_html) # Link to toggle between HEAD and RELEASE if HEAD_or_RELEASE == "RELEASE": toggle_link = "HEAD" else: toggle_link = "RELEASE" req.write("""<p><a href="%s?HEAD_or_RELEASE=%s">%s Status</a></p>""" % (scriptname, toggle_link, toggle_link) ) # Footer req.write(""" </BODY> </HTML> """)
# ############################################################## ############################################################## # sync thread options # Use rsync to synchronize the last n builds sync_log = logger.Logger(filename="sync.log", print_screen=0, compressed=0) # ############################################################## ############################################################## # scheduler threads options version_re = re.compile(".*-(.*).(tar.gz|tar.bz2|zip)") tarballs = datastore.source_file_repo() # Set the lock object tarball_lock = threading.Lock() scheduler_log = logger.Logger(filename="scheduler.log", print_screen=0, compressed=0) # ############################################################## # TODO: CTRL-C is killing mktarball... what's going on? (looks like tarball-builder-daemon didn't work either...? Could it be a python regression?) class tarball_builder(threading.Thread): def __init__(self): threading.Thread.__init__(self) self.load_info() def load_info(self):
# ############################################################## ############################################################## # sync thread options # Use rsync to synchronize the last n builds sync_log = logger.Logger(filename='sync.log', print_screen=0, compressed=0) # ############################################################## ############################################################## # scheduler threads options version_re = re.compile(".*-(.*).(tar.gz|tar.bz2|zip)") tarballs = datastore.source_file_repo() # Set the lock object tarball_lock = threading.Lock() scheduler_log = logger.Logger(filename='scheduler.log', print_screen=0, compressed=0) # ############################################################## # TODO: CTRL-C is killing mktarball... what's going on? (looks like tarball-builder-daemon didn't work either...? Could it be a python regression?) class tarball_builder(threading.Thread): def __init__(self): threading.Thread.__init__(self)
def index(req, **vars): # Debug to see what's available in req #return("\n".join(dir(req))) # Validate/sanitize args to catch some common security errors vars = www_utils.sanitize_args(vars) # Default to HEAD if it's not specified if vars.has_key('HEAD_or_RELEASE'): HEAD_or_RELEASE = vars['HEAD_or_RELEASE'] else: HEAD_or_RELEASE = 'HEAD' if HEAD_or_RELEASE != "HEAD" and HEAD_or_RELEASE != "RELEASE": return ("Invalid parameters") scriptname = os.path.basename(req.canonical_filename) # Pull this in from the release repo plat_objs = build.get_platform_objs() pack_objs, noarch_pack_objs = build.get_package_objs( honor_disable_webview=True) req.content_type = "text/html" req.write(""" %s <HTML> <HEAD> <TITLE>Mono Build Status - %s</TITLE> <link rel="stylesheet" href="../build.css" type="text/css"> <script language="javascript" src="../build.js" type="text/javascript"></script> <meta http-equiv="refresh" content="60"> </HEAD> <BODY> <H1>Mono Build Status - %s</H1> """ % (doc_type, HEAD_or_RELEASE, HEAD_or_RELEASE)) # Display status of tarball daemon tarball_daemon_status = "Active" td_color = "#008A10" if not config.td_active: tarball_daemon_status = "Stopped" td_color = "#999999" # Display status of scheduler daemon sched_daemon_status = "Active" sd_color = "#008A10" if not config.sd_active: sched_daemon_status = "Stopped" sd_color = "#999999" req.write(""" <h2>Tarball daemon: <span style='color:%s'>%s</span> Scheduler daemon: <span style='color:%s'>%s</span></h2> """ % (td_color, tarball_daemon_status, sd_color, sched_daemon_status)) legend_html = """ <h3>Build Matrix Legend</h3> <div> <table class="legend"> <tbody> <tr> <th class="inprogress">In Progress</th> <th class="success">Success</th> <th class="failure">Build Failed</th> <th class="testfailure">Tests Failed</th> <th class="timeout">Timed Out</th> <th class="new">New</th> </tr> </tbody> </table> <p> <table> <tr><td>Inner color:</td><td>current build</td><td>%s</td><td>Black label:</td><td>Active platform</td></tr> <tr><td>Outer color:</td><td>previous build</td><td></td><td>Grey label:</td><td><span style='color:#999999'>Stopped platform</span></td></tr> </table> </p> </div>""" % (' ' * 20) req.write(legend_html) req.write(""" <h3>Build Matrix</h3> <div> <table class="buildstatus"> """) # Get unique list of used platforms platforms = {} for obj in pack_objs: for host in obj.info['BUILD_HOSTS']: platforms[host] = "" # Remove unused plat_objs num_removed = 0 for i in range(0, len(plat_objs)): if not platforms.has_key(plat_objs[i - num_removed].name): plat_objs.pop(i - num_removed) num_removed += 1 count = 0 # Only read once here src = datastore.source_file_repo() src.load_info() # Iterate through arch packages, and then noarch packages for (platforms, packs) in [(plat_objs, pack_objs), (['noarch'], noarch_pack_objs)]: req.write("<tr><td></td>\n") for obj in packs: req.write("<th>%s</th>\n" % obj.name) req.write("</tr>\n") # Add row for mktarball status req.write("<tr><th>mktarball</th>\n") for package in packs: info = src.get_tarball_state_info(HEAD_or_RELEASE, package.name, read_info=False) revision = "" revision2 = "" state = "" state2 = "" if len(info['revisions']) > 0: revision = info['revisions'][0] state = info['state'][revision] link = '<a href="../tarball_logs/%s/%s/%s.log">%s</a>' % ( HEAD_or_RELEASE, package.name, revision, revision) if len(info['revisions']) > 1: revision2 = info['revisions'][1] state2 = info['state'][revision2] if revision2: req.write('<td class="%s">' % state2) req.write('<center><table class="%s"><tr><td>' % (state)) req.write(link) req.write("</td></tr></table></center>") req.write("</td>\n") else: req.write('<td class="%s">' % state) req.write(link) req.write("</td>\n") else: req.write('<td class="new">') req.write("</td>\n") req.write("</tr>\n") # End of mktarball row # list out non-noarch packages for platform in platforms: if platform == 'noarch': platform_name = "noarch" else: platform_name = platform.name # TODO: Find out if the platform is removed from the schedulers list isRunning = platform_name in config.sd_latest_build_distros if platform_name == "noarch": isRunning = True color = "black" if not isRunning: color = "#999999" styled_text = "<span style='color:%s'>%s</span>" % (color, platform_name) #status_image = "<img src='%s'>" % status_image #req.write("<tr><th>%s <br>%s</th>\n" % (platform_name,status_image)) req.write("<tr><th>%s</th>\n" % styled_text) for package in packs: #req.write("<br>".join(package.info.keys())) if platform == "noarch": platform_name = package.info['BUILD_HOSTS'][0] # if this is a valid package for this platform... if package.info['BUILD_HOSTS'].count(platform_name): # show the last two builds (otherwise, it's going to mostly be showing yellow) versions = build.get_versions( HEAD_or_RELEASE, platform_name, package.name) # in <num> format version = "" version2 = "" state = "" # pop and get first version if len(versions) > 0: version = versions.pop() build_info = datastore.build_info( HEAD_or_RELEASE, platform_name, package.name, version) state = build_info.get_state() # pop and get second version if len(versions) > 0: version2 = versions.pop() build_info2 = datastore.build_info( HEAD_or_RELEASE, platform_name, package.name, version2) state2 = build_info2.get_state() # if it's a valid package, but hasn't been built yet... if state == "": state = "new" link = "" else: link = '<a href="%s/packagestatus?platform=%s&package=%s&HEAD_or_RELEASE=%s">%s</a>' % ( scriptname, platform_name, package.name, HEAD_or_RELEASE, version) # if there's a previous version, print a container table if version2: req.write('<td class="%s">' % state2) req.write('<center><table class="%s"><tr><td>' % (state)) req.write(link) req.write("</td></tr></table></center>") req.write("</td>\n") else: req.write('<td class="%s">' % state) req.write(link) req.write("</td>\n") else: req.write('<td class="notused">') req.write("</td>\n") req.write("</tr>\n") # Separator section ( # Don't write this on the last one ) if count == 0: req.write("<tr><td></td></tr>\n") count += 1 req.write("</table>\n</div>") # Legend req.write(legend_html) # Link to toggle between HEAD and RELEASE if HEAD_or_RELEASE == "RELEASE": toggle_link = "HEAD" else: toggle_link = "RELEASE" req.write("""<p><a href="%s?HEAD_or_RELEASE=%s">%s Status</a></p>""" % (scriptname, toggle_link, toggle_link)) # Footer req.write(""" </BODY> </HTML> """)