Kill StormCachingBuildFarm - regular build farm now uses Storm.
authorJelmer Vernooij <jelmer@samba.org>
Fri, 3 Dec 2010 23:00:03 +0000 (00:00 +0100)
committerJelmer Vernooij <jelmer@samba.org>
Fri, 3 Dec 2010 23:00:03 +0000 (00:00 +0100)
admin.py
buildfarm/__init__.py
buildfarm/hostdb.py
buildfarm/sqldb.py
buildfarm/tests/test_buildfarm.py
buildfarm/tests/test_sqldb.py
buildfarm/web/__init__.py
builds.py
import-and-analyse.py
mail-dead-hosts.py
tools/fix.py

index 07c01648525840c81c04cce52ca25d536c51c0b1..60679f815da553e827d91e90fb38a621544a46d1 100755 (executable)
--- a/admin.py
+++ b/admin.py
@@ -18,9 +18,9 @@
 #
 
 from buildfarm import (
+    BuildFarm,
     hostdb,
     )
-from buildfarm.sqldb import StormCachingBuildFarm
 import commands
 import os
 import smtplib
@@ -28,7 +28,7 @@ import sys
 import time
 from email.MIMEText import MIMEText
 
-buildfarm = StormCachingBuildFarm()
+buildfarm = BuildFarm()
 
 def update_rsyncd_secrets():
     temp_rsyncd_secrets = os.path.join(os.path.dirname(__file__), "../rsyncd.secrets.new")
index b515b123f83606a7dcd949ccf0f2f137490add71..c8fd125283d4211c57d3c94a78612fc4f78796c3 100644 (file)
 #   along with this program; if not, write to the Free Software
 #   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 
+from buildfarm.sqldb import distinct_builds, Cast, StormBuild, setup_schema, StormCachingBuildResultStore, StormHostDatabase
+from buildfarm.tree import Tree
+from storm.database import create_database
+from storm.expr import Desc
+from storm.store import Store
+
 import ConfigParser
 import os
 import re
 
-GIT_ROOT = "/data/git"
-
-
-class Tree(object):
-    """A tree to build."""
-
-    def __init__(self, name, scm, repo, branch, subdir="", srcdir=""):
-        self.name = name
-        self.repo = repo
-        self.scm = scm
-        self.branch = branch
-        self.subdir = subdir
-        self.srcdir = srcdir
-        self.scm = scm
-
-    def get_branch(self):
-        if self.scm == "git":
-            from buildfarm.history import GitBranch
-            return GitBranch(os.path.join(GIT_ROOT, self.repo), self.branch)
-        else:
-            raise NotImplementedError(self.scm)
-
-    def __repr__(self):
-        return "<%s %r>" % (self.__class__.__name__, self.name)
-
-
 def read_trees_from_conf(path):
     """Read trees from a configuration file.
 
@@ -76,7 +56,9 @@ class BuildFarm(object):
     OLDAGE = 60*60*4,
     DEADAGE = 60*60*24*4
 
-    def __init__(self, path=None):
+    def __init__(self, path=None, store=None, timeout=0.5):
+        self.timeout = timeout
+        self.store = store
         if path is None:
             path = os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))
         self.path = path
@@ -94,9 +76,8 @@ class BuildFarm(object):
         return "%s(%r)" % (self.__class__.__name__, self.path)
 
     def _open_build_results(self):
-        from buildfarm.build import BuildResultStore
         path = os.path.join(self.path, "data", "oldrevs")
-        return BuildResultStore(path)
+        return StormCachingBuildResultStore(path, self._get_store())
 
     def _open_upload_build_results(self):
         from buildfarm.build import UploadBuildResultStore
@@ -104,15 +85,15 @@ class BuildFarm(object):
         return UploadBuildResultStore(path)
 
     def _open_hostdb(self):
-        from buildfarm import hostdb
-        return hostdb.PlainTextHostDatabase.from_file(os.path.join(self.webdir, "hosts.list"))
+        return StormHostDatabase(self._get_store())
 
     def _load_compilers(self):
         from buildfarm import util
         return set(util.load_list(os.path.join(self.webdir, "compilers.list")))
 
     def commit(self):
-        pass
+        if self.store is not None:
+            self.store.commit()
 
     def lcov_status(self, tree):
         """get status of build"""
@@ -144,27 +125,31 @@ class BuildFarm(object):
                 yield build
 
     def get_last_builds(self):
-        return sorted(self.get_new_builds(), reverse=True)
+        result = self._get_store().find(StormBuild)
+        return distinct_builds(result.order_by(Desc(StormBuild.upload_time)))
 
     def get_tree_builds(self, tree):
-        ret = []
-        for build in self.builds.get_all_builds():
-            if build.tree == tree:
-                ret.append(build)
-        ret.sort(reverse=True)
-        return ret
+        result = self._get_store().find(StormBuild,
+            Cast(StormBuild.tree, "TEXT") == Cast(tree, "TEXT"))
+        return distinct_builds(result.order_by(Desc(StormBuild.upload_time)))
 
     def host_last_build(self, host):
         return max([build.upload_time for build in self.get_host_builds(host)])
 
     def get_host_builds(self, host):
-        from buildfarm.build import NoSuchBuildError
-        ret = []
-        for compiler in self.compilers:
-            for tree in sorted(self.trees.keys()):
-                try:
-                    ret.append(self.get_build(tree, host, compiler))
-                except NoSuchBuildError:
-                    pass
-        ret.sort(reverse=True)
-        return ret
+        result = self._get_store().find(StormBuild, StormBuild.host == host)
+        return distinct_builds(result.order_by(Desc(StormBuild.upload_time)))
+
+    def _get_store(self):
+        if self.store is not None:
+            return self.store
+        db_path = os.path.join(self.path, "db", "hostdb.sqlite")
+        db = create_database("sqlite:%s?timeout=%f" % (db_path, self.timeout))
+        self.store = Store(db)
+        setup_schema(self.store)
+        return self.store
+
+    def get_revision_builds(self, tree, revision=None):
+        return self._get_store().find(StormBuild,
+            Cast(StormBuild.tree, "TEXT") == Cast(tree, "TEXT"),
+            Cast(StormBuild.revision, "TEXT") == Cast(revision, "TEXT"))
index d56e152438f65f561f732ed5f616c9dd4fd667ff..6e762deb8a08f6b474e6b36fdcfaac74c3d485cf 100644 (file)
@@ -124,31 +124,3 @@ class HostDatabase(object):
 
     def commit(self):
         pass
-
-
-class PlainTextHostDatabase(HostDatabase):
-
-    def __init__(self, hosts):
-        self._hosts = hosts
-
-    @classmethod
-    def from_file(cls, path):
-        ret = {}
-        f = open(path, 'r')
-        try:
-            for l in f:
-                (host, platform) = l.split(":", 1)
-                ret[host] = platform.strip().decode("utf-8")
-        finally:
-            f.close()
-        return cls(ret)
-
-    def hosts(self):
-        for name, platform in self._hosts.iteritems():
-            yield Host(name, platform=platform)
-
-    def __getitem__(self, name):
-        try:
-            return Host(name=name, platform=self._hosts[name])
-        except KeyError:
-            raise NoSuchHost(name)
index 8c080ecd78148a8ce5020f8ea287287a6ba49ee8..2ef6f00a94b3ba2cb502871fe2bf5ddf8ebab926 100644 (file)
@@ -17,8 +17,7 @@
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #
 
-from buildfarm import (
-    BuildFarm,
+from buildfarm.tree import (
     Tree,
     )
 from buildfarm.build import (
@@ -281,51 +280,6 @@ def distinct_builds(builds):
         yield build
 
 
-class StormCachingBuildFarm(BuildFarm):
-
-    def __init__(self, path=None, store=None, timeout=0.5):
-        self.timeout = timeout
-        self.store = store
-        super(StormCachingBuildFarm, self).__init__(path)
-
-    def _get_store(self):
-        if self.store is not None:
-            return self.store
-        db_path = os.path.join(self.path, "db", "hostdb.sqlite")
-        db = create_database("sqlite:%s?timeout=%f" % (db_path, self.timeout))
-        self.store = Store(db)
-        setup_schema(self.store)
-        return self.store
-
-    def _open_hostdb(self):
-        return StormHostDatabase(self._get_store())
-
-    def _open_build_results(self):
-        path = os.path.join(self.path, "data", "oldrevs")
-        return StormCachingBuildResultStore(path, self._get_store())
-
-    def get_host_builds(self, host):
-        result = self._get_store().find(StormBuild, StormBuild.host == host)
-        return distinct_builds(result.order_by(Desc(StormBuild.upload_time)))
-
-    def get_tree_builds(self, tree):
-        result = self._get_store().find(StormBuild,
-            Cast(StormBuild.tree, "TEXT") == Cast(tree, "TEXT"))
-        return distinct_builds(result.order_by(Desc(StormBuild.upload_time)))
-
-    def get_last_builds(self):
-        result = self._get_store().find(StormBuild)
-        return distinct_builds(result.order_by(Desc(StormBuild.upload_time)))
-
-    def get_revision_builds(self, tree, revision=None):
-        return self._get_store().find(StormBuild,
-            Cast(StormBuild.tree, "TEXT") == Cast(tree, "TEXT"),
-            Cast(StormBuild.revision, "TEXT") == Cast(revision, "TEXT"))
-
-    def commit(self):
-        self.store.commit()
-
-
 class StormTree(Tree):
     __storm_table__ = "tree"
 
index 49e505154f6405bfe7d97467bebd9a276247275b..36ff66fe3885124a594cc733c04446165a7c58b7 100644 (file)
@@ -71,14 +71,16 @@ branch = HEAD
         self.assertEquals(t["pidl"].scm, "git")
 
 
-class BuildFarmTestBase(object):
+class BuildFarmTests(BuildFarmTestCase):
 
     def setUp(self):
+        super(BuildFarmTests, self).setUp()
         self.write_compilers(["cc"])
         self.write_hosts({"myhost": "Fedora",
                           "charis": "Debian"})
         self.write_trees({"trivial": {"scm": "git", "repo": "git://foo", "branch": "master"},
                           "other": {"scm": "git", "repo": "other.git", "branch": "HEAD"}})
+        self.x = BuildFarm(self.path)
 
     def test_get_new_builds_empty(self):
         self.assertEquals([], list(self.x.get_new_builds()))
@@ -147,10 +149,3 @@ class BuildFarmTestBase(object):
         self.assertEquals("cc", build.compiler)
         self.assertIs(None, build.revision)
 
-
-class BuildFarmTests(BuildFarmTestBase, BuildFarmTestCase):
-
-    def setUp(self):
-        BuildFarmTestCase.setUp(self)
-        BuildFarmTestBase.setUp(self)
-        self.x = BuildFarm(self.path)
index 42b0f1d2e84ab77dfa1315adc5060bd1a17f3b52..684d912f707f3dd6d078e271e2f97c79b9ad8bd0 100644 (file)
@@ -20,28 +20,15 @@ from buildfarm.build import (
     NoSuchBuildError,
     )
 from buildfarm.tests import BuildFarmTestCase
-from buildfarm.tests.test_buildfarm import BuildFarmTestBase
 from buildfarm.tests.test_build import BuildResultStoreTestBase
 from buildfarm.tests.test_hostdb import HostDatabaseTests
 from buildfarm.sqldb import (
     StormHostDatabase,
-    StormCachingBuildFarm,
     )
 
 import testtools
 
 
-class StormCachingBuildFarmTestCase(BuildFarmTestCase):
-
-    def setUp(self):
-        super(StormCachingBuildFarmTestCase, self).setUp()
-        self.buildfarm = StormCachingBuildFarm(self.path)
-
-    def write_hosts(self, hosts):
-        for host in hosts:
-            self.buildfarm.hostdb.createhost(host)
-
-
 class StormHostDatabaseTests(testtools.TestCase, HostDatabaseTests):
 
     def setUp(self):
@@ -49,10 +36,10 @@ class StormHostDatabaseTests(testtools.TestCase, HostDatabaseTests):
         self.db = StormHostDatabase()
 
 
-class StormCachingBuildResultStoreTests(StormCachingBuildFarmTestCase,BuildResultStoreTestBase):
+class StormCachingBuildResultStoreTests(BuildFarmTestCase,BuildResultStoreTestBase):
 
     def setUp(self):
-        StormCachingBuildFarmTestCase.setUp(self)
+        BuildFarmTestCase.setUp(self)
         BuildResultStoreTestBase.setUp(self)
         self.x = self.buildfarm.builds
 
@@ -75,12 +62,3 @@ BUILD COMMIT REVISION: myrev
 """)
         self.x.upload_build(Build(path[:-4], "tdb", "charis", "cc"))
         self.assertEquals("myrev", self.x.get_latest_revision("tdb", "charis", "cc"))
-
-
-
-class StormCachingBuildFarmTests(BuildFarmTestBase, StormCachingBuildFarmTestCase):
-
-    def setUp(self):
-        StormCachingBuildFarmTestCase.setUp(self)
-        BuildFarmTestBase.setUp(self)
-        self.x = self.buildfarm
index c4ff3f9bbfef7082703a7262e8a298e3f0b951b5..17d5a556e2b66e6254cc2673fd16a977cdfaebf6 100755 (executable)
@@ -973,8 +973,8 @@ if __name__ == '__main__':
     parser.add_option("--port", help="Port to listen on [localhost:8000]",
         default="localhost:8000", type=str)
     opts, args = parser.parse_args()
-    from buildfarm.sqldb import StormCachingBuildFarm
-    buildfarm = StormCachingBuildFarm()
+    from buildfarm.sqldb import BuildFarm
+    buildfarm = BuildFarm()
     buildApp = BuildFarmApp(buildfarm)
     from wsgiref.simple_server import make_server
     import mimetypes
index d08c33904e7bf300cd3c611fcc1e9d2edce12617..8f2105142819b53850690ee2e1e6a02966f774a6 100755 (executable)
--- a/builds.py
+++ b/builds.py
@@ -16,7 +16,7 @@
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #
 
-from buildfarm.sqldb import StormCachingBuildFarm
+from buildfarm.sqldb import BuildFarm
 import optparse
 import sys
 
@@ -26,7 +26,7 @@ parser.add_option("--last", help="Print last builds.", action="store_true")
 
 (opts, args) = parser.parse_args()
 
-buildfarm = StormCachingBuildFarm()
+buildfarm = BuildFarm()
 
 if opts.tree:
     builds = buildfarm.get_tree_builds(opts.tree)
index 6a791f716f3adcee91bf75fe82f489f9f2f1ad83..6202f7f00b97ae6dcca716e6956d95265d6ed7dd 100755 (executable)
@@ -14,7 +14,7 @@ from buildfarm.build import (
     MissingRevisionInfo,
     NoSuchBuildError,
     )
-from buildfarm.sqldb import StormCachingBuildFarm
+from buildfarm.sqldb import BuildFarm
 from buildfarm.web import build_uri
 from email.mime.text import MIMEText
 import logging
@@ -31,7 +31,7 @@ parser.add_option("--verbose", help="Be verbose", action="count")
 resource.setrlimit(resource.RLIMIT_RSS, (300000, 300000))
 resource.setrlimit(resource.RLIMIT_DATA, (300000, 300000))
 
-buildfarm = StormCachingBuildFarm(timeout=40.0)
+buildfarm = BuildFarm(timeout=40.0)
 
 smtp = smtplib.SMTP()
 smtp.connect()
index 22f7bcac321100076b6ebc959228ced543dff8a5..f4b13fdeb92b3077809577f5bd4a84082b0a58b2 100755 (executable)
@@ -17,7 +17,7 @@
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #
 
-from buildfarm.sqldb import StormCachingBuildFarm
+from buildfarm.sqldb import BuildFarm
 from buildfarm.web import host_uri
 import optparse
 import smtplib
@@ -28,7 +28,7 @@ parser = optparse.OptionParser()
 parser.add_option("--dry-run", help="Don't actually send any emails.", action="store_true")
 (opts, args) = parser.parse_args()
 
-buildfarm = StormCachingBuildFarm(timeout=40.0)
+buildfarm = BuildFarm(timeout=40.0)
 
 smtp = smtplib.SMTP()
 smtp.connect()
index 8108084b867f8de3fb91571f234dd52606b6f5f1..9cec88f9704b27403f4f2f35a882471fbb62c218 100755 (executable)
@@ -12,9 +12,9 @@ from buildfarm.build import (
     )
 from buildfarm.hostdb import NoSuchHost
 
-from buildfarm.sqldb import StormCachingBuildFarm, StormBuild
+from buildfarm.sqldb import BuildFarm, StormBuild
 
-buildfarm = StormCachingBuildFarm()
+buildfarm = BuildFarm()
 
 store = buildfarm._get_store()