[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