[llvm-commits] [zorg] r125888 - /zorg/trunk/llvmlab/llvmlab/ci/buildbot/statusclient.py

Daniel Dunbar daniel at zuster.org
Fri Feb 18 08:42:05 PST 2011


Author: ddunbar
Date: Fri Feb 18 10:42:05 2011
New Revision: 125888

URL: http://llvm.org/viewvc/llvm-project?rev=125888&view=rev
Log:
llvmlab.ci.buildbot.statusclient: Add support for tracking build add/remove
events.

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=125888&r1=125887&r2=125888&view=diff
==============================================================================
--- zorg/trunk/llvmlab/llvmlab/ci/buildbot/statusclient.py (original)
+++ zorg/trunk/llvmlab/llvmlab/ci/buildbot/statusclient.py Fri Feb 18 10:42:05 2011
@@ -18,7 +18,10 @@
 
         sc = StatusClient(data['master_url'], data['builders_poll_rate'])
         sc.builders = set(data['builders'])
+        sc.builds = dict((name, set(items))
+                         for name, items in data['builds'])
         sc.last_builders_poll = data['last_builders_poll']
+        sc.last_builder_poll = data['last_builder_poll']
         return sc
 
     def todata(self):
@@ -26,26 +29,34 @@
                  'master_url' : self.master_url,
                  'builders_poll_rate' : self.builders_poll_rate,
                  'builders' : list(self.builders),
-                 'last_builders_poll' : self.last_builders_poll}
+                 '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 }
 
     def __init__(self, master_url,
-                 builders_poll_rate = 60.0):
-        self.master_url = master_url
-        self.builders = set()
-
+                 builders_poll_rate = 60.0,
+                 builder_poll_rate = 5.0):
         # Normalize the master URL.
+        self.master_url = master_url
         if self.master_url.endswith('/'):
             self.master_url += '/'
 
+        # Initialize the data we track.
+        self.builders = set()
+        self.builds = {}
+
         # 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.
         self.last_builders_poll = -1
+        self.last_builder_poll = {}
 
     def get_json_result(self, query_items, arguments=None):
-        path = '/json/' + ','.join(urllib2.quote(item)
+        path = '/json/' + '/'.join(urllib2.quote(item)
                                    for item in query_items)
         if arguments is not None:
             path += '?' + urllib2.urlencode(arguments)
@@ -67,7 +78,31 @@
             for event in self.pull_builders():
                 yield event
 
-        yield 1
+        # 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 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.
@@ -78,13 +113,29 @@
         builder_names = set(builders.keys())
 
         for name in builder_names - self.builders:
-            yield ('added_builder', name)
+            for event in self.add_builder(name):
+                yield event
         for name in self.builders - builder_names:
-            yield ('removed_builder', name)
+            for event in self.remove_builder(name):
+                yield event
 
-        self.builders = builder_names
         self.last_builders_poll = time.time()
 
+    def pull_builder(self, name):
+        # 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
+
+        self.last_builder_poll[name] = time.time()
+
 ###
 
 def main():
@@ -124,7 +175,7 @@
         while 1:
             for event in sc.pull_events():
                 print time.time(), event
-                time.sleep(.1)
+            time.sleep(.1)
     except KeyboardInterrupt:
         print "(interrupted, stopping)"
 





More information about the llvm-commits mailing list