Skip to content

Commit

Permalink
If 'poller' argument isn't provided, trigger all of them
Browse files Browse the repository at this point in the history
  • Loading branch information
Jc2k committed Jun 3, 2012
1 parent a94047b commit e1f505f
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 40 deletions.
26 changes: 13 additions & 13 deletions master/buildbot/status/web/hooks/poller.py
Expand Up @@ -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


56 changes: 29 additions & 27 deletions master/buildbot/test/unit/test_status_web_change_hooks_poller.py
Expand Up @@ -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):
Expand All @@ -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)

3 changes: 3 additions & 0 deletions master/docs/manual/cfg-statustargets.rst
Expand Up @@ -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
Expand Down

0 comments on commit e1f505f

Please sign in to comment.