[llvm-commits] [zorg] r125901 - /zorg/trunk/llvmlab/llvmlab/ci/buildbot/statusclient.py
Daniel Dunbar
daniel at zuster.org
Fri Feb 18 08:42:43 PST 2011
Author: ddunbar
Date: Fri Feb 18 10:42:43 2011
New Revision: 125901
URL: http://llvm.org/viewvc/llvm-project?rev=125901&view=rev
Log:
llvmlab.ci.buildbot.statusclient: Factor out a BuilderInfo object.
Modified:
zorg/trunk/llvmlab/llvmlab/ci/buildbot/statusclient.py
Modified: zorg/trunk/llvmlab/llvmlab/ci/buildbot/statusclient.py
URL: http://llvm.org/viewvc/llvm-project/zorg/trunk/llvmlab/llvmlab/ci/buildbot/statusclient.py?rev=125901&r1=125900&r2=125901&view=diff
==============================================================================
--- zorg/trunk/llvmlab/llvmlab/ci/buildbot/statusclient.py (original)
+++ zorg/trunk/llvmlab/llvmlab/ci/buildbot/statusclient.py Fri Feb 18 10:42:43 2011
@@ -2,6 +2,31 @@
import urllib2
from flask import json
+class BuilderInfo(object):
+ """
+ BuilderInfo object for tracking per-builder status information being
+ monitored.
+ """
+
+ @staticmethod
+ def fromdata(data):
+ version = data['version']
+ if version != 0:
+ raise ValueError, "Unknown version"
+
+ return BuilderInfo(data['name'], set(data['builds']), data['last_poll'])
+
+ def todata(self):
+ return { 'version' : 0,
+ 'name' : self.name,
+ 'builds' : list(self.builds),
+ 'last_poll' : self.last_poll }
+
+ def __init__(self, name, builds, last_poll):
+ self.name = name
+ self.builds = builds
+ self.last_poll = last_poll
+
class StatusClient(object):
"""
StatusClient object for watching a buildbot master and dispatching signals
@@ -18,11 +43,10 @@
sc = StatusClient(data['master_url'], data['builders_poll_rate'],
data['builder_poll_rate'])
- sc.builders = set(data['builders'])
- sc.builds = dict((name, set(items))
- for name, items in data['builds'])
+ builders = [BuilderInfo.fromdata(b)
+ for b in data['builders']]
+ sc.builders = dict((b.name, b) for b in builders)
sc.last_builders_poll = data['last_builders_poll']
- sc.last_builder_poll = data['last_builder_poll']
return sc
def todata(self):
@@ -30,11 +54,9 @@
'master_url' : self.master_url,
'builder_poll_rate' : self.builder_poll_rate,
'builders_poll_rate' : self.builders_poll_rate,
- 'builders' : list(self.builders),
- 'builds' : [(name, list(items))
- for name,items in self.builds.items()],
- 'last_builders_poll' : self.last_builders_poll,
- 'last_builder_poll' : self.last_builder_poll }
+ 'builders' : [b.todata()
+ for b in self.builders.values()],
+ 'last_builders_poll' : self.last_builders_poll }
def __init__(self, master_url,
builders_poll_rate = 60.0,
@@ -45,17 +67,15 @@
self.master_url += '/'
# Initialize the data we track.
- self.builders = set()
- self.builds = {}
+ self.builders = {}
# Set poll rates (how frequently we are willing to recontact the
# master).
self.builders_poll_rate = float(builders_poll_rate)
self.builder_poll_rate = float(builder_poll_rate)
- # Set last poll times so we will repoll on startup.
+ # Set last poll time so we will repoll on startup.
self.last_builders_poll = -1
- self.last_builder_poll = {}
def get_json_result(self, query_items, arguments=None):
path = '/json/' + '/'.join(urllib2.quote(item)
@@ -81,62 +101,43 @@
yield event
# Update the current builds for each known builder.
- for builder in self.builders:
- last_poll = self.last_builder_poll.get(builder, -1)
- if current_time - last_poll >= self.builder_poll_rate:
+ for builder in self.builders.values():
+ if current_time - builder.last_poll >= self.builder_poll_rate:
for event in self.pull_builder(builder):
yield event
- def add_builder(self, name):
- yield ('added_builder', name)
- self.builders.add(name)
- self.last_builder_poll[name] = -1
- self.builds[name] = set()
-
- def remove_builder(self, name):
- yield ('removed_builder', name)
- self.builders.remove(name)
- self.last_builder_poll.pop(name)
- self.builds.pop(name)
-
- def add_build(self, name, id):
- yield ('add_build', name, id)
- self.builds[name].add(id)
- def remove_build(self, name, id):
- yield ('remove_build', name, id)
- self.builds[name].remove(id)
-
def pull_builders(self):
# Pull the builder names.
#
# FIXME: BuildBot should provide a more efficient query for this.
yield ('poll_builders',)
- builders = self.get_json_result(('builders',))
- builder_names = set(builders.keys())
-
- for name in builder_names - self.builders:
- for event in self.add_builder(name):
- yield event
- for name in self.builders - builder_names:
- for event in self.remove_builder(name):
- yield event
+ res = self.get_json_result(('builders',))
+ builder_names = set(res.keys())
+ current_builders = set(self.builders)
+
+ for name in builder_names - current_builders:
+ yield ('added_builder', name)
+ self.builders[name] = BuilderInfo(name, set(), -1)
+ for name in current_builders - builder_names:
+ yield ('removed_builder', name)
+ self.builders.remove(name)
self.last_builders_poll = time.time()
- def pull_builder(self, name):
+ def pull_builder(self, builder):
# Pull the builder data.
- yield ('poll_builder', name)
- builder = self.get_json_result(('builders', name))
- builds = set(builder['cachedBuilds'])
-
- for id in builds - self.builds[name]:
- for event in self.add_build(name, id):
- yield event
- for id in self.builds[name] - builds:
- for event in self.remove_build(name, id):
- yield event
+ yield ('poll_builder', builder.name)
+ res = self.get_json_result(('builders', builder.name))
+ builds = set(res['cachedBuilds'])
+
+ for id in builds - builder.builds:
+ yield ('add_build', builder.name, id)
+ builder.builds.add(id)
+ for id in builder.builds - builds:
+ yield ('remove_build', builder.name, id)
+ builder.builds.remove(id)
- self.last_builder_poll[name] = time.time()
+ builder.last_poll = time.time()
###
More information about the llvm-commits
mailing list