From e1f505f1e540c9c783a25dc5ae39c66bf1f5cd50 Mon Sep 17 00:00:00 2001 From: John Carr Date: Sun, 3 Jun 2012 15:59:27 +0100 Subject: [PATCH] If 'poller' argument isn't provided, trigger all of them --- master/buildbot/status/web/hooks/poller.py | 26 ++++----- .../test_status_web_change_hooks_poller.py | 56 ++++++++++--------- master/docs/manual/cfg-statustargets.rst | 3 + 3 files changed, 45 insertions(+), 40 deletions(-) diff --git a/master/buildbot/status/web/hooks/poller.py b/master/buildbot/status/web/hooks/poller.py index 01fd43af49b..4ba20ff2bf4 100644 --- a/master/buildbot/status/web/hooks/poller.py +++ b/master/buildbot/status/web/hooks/poller.py @@ -21,26 +21,26 @@ def getChanges(req, options=None): change_svc = req.site.buildbot_service.master.change_svc - - if not "poller" in req.args: - raise ValueError("Request missing parameter 'poller'") + poll_all = not "poller" in req.args pollers = [] - for pollername in req.args['poller']: - try: - source = change_svc.getServiceNamed(pollername) - except KeyError: - raise ValueError("No such change source '%s'" % pollername) - + for source in change_svc: if not isinstance(source, PollingChangeSource): - raise ValueError("No such polling change source '%s'" % pollername) - + continue + if not hasattr(source, "name"): + continue + if not poll_all and not source.name in req.args['poller']: + continue pollers.append(source) + if not poll_all: + missing = set(req.args['poller']) - set(s.name for s in pollers) + if missing: + raise ValueError("Could not find pollers: %s" % ",".join(missing)) + for p in pollers: - source.doPoll() + p.doPoll() return [], None - diff --git a/master/buildbot/test/unit/test_status_web_change_hooks_poller.py b/master/buildbot/test/unit/test_status_web_change_hooks_poller.py index f02ea29b472..87573920f33 100644 --- a/master/buildbot/test/unit/test_status_web_change_hooks_poller.py +++ b/master/buildbot/test/unit/test_status_web_change_hooks_poller.py @@ -18,6 +18,8 @@ from buildbot.changes import base import buildbot.status.web.change_hook as change_hook from buildbot.test.fake.web import FakeRequest +from buildbot.changes.manager import ChangeManager + class TestPollingChangeHook(unittest.TestCase): class Subclass(base.PollingChangeSource): @@ -27,50 +29,50 @@ class Subclass(base.PollingChangeSource): def poll(self): self.called = True - def setUp(self): + def setUpRequest(self, args): self.changeHook = change_hook.ChangeHookResource(dialects={'poller' : True}) - self.changesrc= self.Subclass() - @defer.inlineCallbacks - def test_no_args(self): - self.request = FakeRequest(args={}) + self.request = FakeRequest(args=args) self.request.uri = "/change_hook/poller" self.request.method = "GET" - yield self.request.test_render(self.changeHook) - expected = "Request missing parameter 'poller'" - self.assertEqual(self.request.written, expected) - self.request.setResponseCode.assert_called_with(400, expected) + master = self.request.site.buildbot_service.master + master.change_svc = ChangeManager(master) + + self.changesrc = self.Subclass("example", None) + self.changesrc.setServiceParent(master.change_svc) + + anotherchangesrc = base.ChangeSource() + anotherchangesrc.setName("notapoller") + anotherchangesrc.setServiceParent(master.change_svc) + + return self.request.test_render(self.changeHook) @defer.inlineCallbacks - def test_no_poller(self): - self.request = FakeRequest(args={"poller":["example"]}) - self.request.uri = "/change_hook/poller" - self.request.method = "GET" - self.request.master.change_svc.getServiceNamed.side_effect = KeyError - yield self.request.test_render(self.changeHook) + def test_no_args(self): + yield self.setUpRequest({}) + self.assertEqual(self.request.written, "no changes found") + self.assertEqual(self.changesrc.called, True) - expected = "No such change source 'example'" + @defer.inlineCallbacks + def test_no_poller(self): + yield self.setUpRequest({"poller": ["nosuchpoller"]}) + expected = "Could not find pollers: nosuchpoller" self.assertEqual(self.request.written, expected) self.request.setResponseCode.assert_called_with(400, expected) + self.assertEqual(self.changesrc.called, False) @defer.inlineCallbacks def test_invalid_poller(self): - self.request = FakeRequest(args={"poller":["example"]}) - self.request.uri = "/change_hook/poller" - self.request.method = "GET" - yield self.request.test_render(self.changeHook) - - expected = "No such polling change source 'example'" + yield self.setUpRequest({"poller": ["notapoller"]}) + expected = "Could not find pollers: notapoller" self.assertEqual(self.request.written, expected) self.request.setResponseCode.assert_called_with(400, expected) + self.assertEqual(self.changesrc.called, False) @defer.inlineCallbacks def test_trigger_poll(self): - self.request = FakeRequest(args={"poller":["example"]}) - self.request.uri = "/change_hook/poller" - self.request.method = "GET" - self.request.master.change_svc.getServiceNamed.return_value = self.changesrc - yield self.request.test_render(self.changeHook) + yield self.setUpRequest({"poller": ["example"]}) + self.assertEqual(self.request.written, "no changes found") self.assertEqual(self.changesrc.called, True) diff --git a/master/docs/manual/cfg-statustargets.rst b/master/docs/manual/cfg-statustargets.rst index e7dabf52fb5..bdd37e1206e 100644 --- a/master/docs/manual/cfg-statustargets.rst +++ b/master/docs/manual/cfg-statustargets.rst @@ -736,6 +736,9 @@ Then you will be able to trigger a poll of the SVN repository by poking the curl http://yourbuildbot/change_hook/poller?poller=amanda +If no ``poller`` argument is provided then the hook will trigger polling of all +polling change sources. + .. bb:status:: MailNotifier