diff options
author | James E. Blair <jeblair@hp.com> | 2014-08-15 15:24:24 -0700 |
---|---|---|
committer | James E. Blair <jeblair@hp.com> | 2014-08-15 15:45:49 -0700 |
commit | f8ff9937b5255561f532963c53bf4ec6ec138f27 (patch) | |
tree | 14a293805805a679970b6e78ef48301e9d80d9b8 | |
parent | c878c98977a5531af206f41bd3b34385d9306d78 (diff) | |
download | zuul-f8ff9937b5255561f532963c53bf4ec6ec138f27.tar.gz |
Fix queries for Zuul trigger
Against a live gerrit, we observed that sometimes gerrit may not
return data for a change. In the case of the zuul trigger's
project-change-merged event, it's best to just ignore errors
for those changes and proceed.
Also, the gerrit trigger was attempting to parse the timing
results from the query. The test did not catch this because it
did not supply them in the mocked method. Correct this as well.
Also, double check that the query used was the one expected in
the test.
Change-Id: I792127d29f67f53a419eb94e9e0afb83b6e1bcb2
-rwxr-xr-x | tests/base.py | 6 | ||||
-rw-r--r-- | tests/test_zuultrigger.py | 1 | ||||
-rw-r--r-- | zuul/trigger/gerrit.py | 15 | ||||
-rw-r--r-- | zuul/trigger/zuultrigger.py | 10 |
4 files changed, 23 insertions, 9 deletions
diff --git a/tests/base.py b/tests/base.py index 1b8294486..5f1529767 100755 --- a/tests/base.py +++ b/tests/base.py @@ -369,6 +369,7 @@ class FakeGerrit(object): self.fixture_dir = os.path.join(FIXTURE_DIR, 'gerrit') self.change_number = 0 self.changes = {} + self.queries = [] def addFakeChange(self, project, branch, subject, status='NEW'): self.change_number += 1 @@ -405,7 +406,10 @@ class FakeGerrit(object): def simpleQuery(self, query): # This is currently only used to return all open changes for a # project - return [change.query() for change in self.changes.values()] + self.queries.append(query) + l = [change.query() for change in self.changes.values()] + l.append({"type":"stats","rowCount":1,"runTimeMilliseconds":3}) + return l def startWatching(self, *args, **kw): pass diff --git a/tests/test_zuultrigger.py b/tests/test_zuultrigger.py index eb8fdc533..9e9bc61d2 100644 --- a/tests/test_zuultrigger.py +++ b/tests/test_zuultrigger.py @@ -102,3 +102,4 @@ class TestZuulTrigger(ZuulTestCase): "Merge Failed.\n\nThis change was unable to be automatically " "merged with the current state of the repository. Please rebase " "your change and upload a new patchset.") + self.assertEqual(self.fake_gerrit.queries[0], "project:org/project status:open") diff --git a/zuul/trigger/gerrit.py b/zuul/trigger/gerrit.py index 6a2c362eb..d05fc69b5 100644 --- a/zuul/trigger/gerrit.py +++ b/zuul/trigger/gerrit.py @@ -324,11 +324,18 @@ class Gerrit(object): return change def getProjectOpenChanges(self, project): - data = self.gerrit.simpleQuery("project:%s status:open" % project.name) + # This is a best-effort function in case Gerrit is unable to return + # a particular change. It happens. + query = "project:%s status:open" % (project.name,) + self.log.debug("Running query %s to get project open changes" % (query,)) + data = self.gerrit.simpleQuery(query) changes = [] - for record in data: - changes.append(self._getChange(record['number'], - record['currentPatchSet']['number'])) + for record in data[:-1]: + try: + changes.append(self._getChange(record['number'], + record['currentPatchSet']['number'])) + except Exception: + self.log.exception("Unable to query change %s" % (record.get('number'),)) return changes def updateChange(self, change): diff --git a/zuul/trigger/zuultrigger.py b/zuul/trigger/zuultrigger.py index 436311bbd..27098ab81 100644 --- a/zuul/trigger/zuultrigger.py +++ b/zuul/trigger/zuultrigger.py @@ -47,7 +47,8 @@ class ZuulTrigger(object): try: self._createProjectChangeMergedEvents(change) except Exception: - self.log.exception("Unable to create project-change-merged events for %s" % (change,)) + self.log.exception("Unable to create project-change-merged events for %s" % + (change,)) def onChangeEnqueued(self, change, pipeline): # Called each time a change is enqueued in a pipeline @@ -55,12 +56,13 @@ class ZuulTrigger(object): try: self._createParentChangeEnqueuedEvents(change, pipeline) except Exception: - self.log.exception("Unable to create parent-change-enqueued events for %s in %s" % (change, pipeline)) + self.log.exception("Unable to create parent-change-enqueued events for %s in %s" % + (change, pipeline)) def _createProjectChangeMergedEvents(self, change): changes = self.sched.triggers['gerrit'].getProjectOpenChanges(change.project) - for change in changes: - self._createProjectChangeMergedEvent(change) + for open_change in changes: + self._createProjectChangeMergedEvent(open_change) def _createProjectChangeMergedEvent(self, change): event = TriggerEvent() |