From 3266340ecc1bfb52b04fe8e289287402c62f96af Mon Sep 17 00:00:00 2001 From: "James E. Blair" Date: Fri, 1 Jun 2012 10:04:18 -0700 Subject: [PATCH] Add support for ref-updated events. Fix paramiko import problem. Fix pep8 error. Change-Id: I7098da304ddfca18dfcc6bf79369479a73c8ae94 --- zuul-server | 11 +++++++--- zuul/launcher/jenkins.py | 17 ++++++++++------ zuul/model.py | 43 ++++++++++++++++++++++++++++++---------- zuul/scheduler.py | 13 +++++------- zuul/trigger/gerrit.py | 14 +++++++++++++ 5 files changed, 71 insertions(+), 27 deletions(-) diff --git a/zuul-server b/zuul-server index ba9e17920e..c55c252a40 100755 --- a/zuul-server +++ b/zuul-server @@ -21,9 +21,9 @@ import logging.config import os import signal -import zuul.scheduler -import zuul.launcher.jenkins -import zuul.trigger.gerrit +# No zuul imports here because they pull in paramiko which must not be +# imported until after the daemonization. +# https://github.com/paramiko/paramiko/issues/59 class Server(object): @@ -70,6 +70,11 @@ class Server(object): signal.signal(signal.SIGHUP, self.reconfigure_handler) def main(self): + # See comment at top of file about zuul imports + import zuul.scheduler + import zuul.launcher.jenkins + import zuul.trigger.gerrit + self.sched = zuul.scheduler.Scheduler() jenkins = zuul.launcher.jenkins.Jenkins(self.config, self.sched) diff --git a/zuul/launcher/jenkins.py b/zuul/launcher/jenkins.py index ec386a382a..1e59a57ffb 100644 --- a/zuul/launcher/jenkins.py +++ b/zuul/launcher/jenkins.py @@ -167,13 +167,18 @@ class Jenkins(object): self.log.info("Launch job %s for change %s with dependent changes %s" % (job, change, dependent_changes)) uuid = str(uuid1()) - changes_str = '^'.join( - ['%s:%s:%s' % (c.project.name, c.branch, c.refspec) - for c in dependent_changes + [change]]) params = dict(UUID=uuid, - GERRIT_PROJECT=change.project.name, - GERRIT_BRANCH=change.branch, - GERRIT_CHANGES=changes_str) + GERRIT_PROJECT=change.project.name) + if change.refspec: + changes_str = '^'.join( + ['%s:%s:%s' % (c.project.name, c.branch, c.refspec) + for c in dependent_changes + [change]]) + params['GERRIT_BRANCH'] = change.branch + params['GERRIT_CHANGES'] = changes_str + if change.ref: + params['GERRIT_REFNAME'] = change.ref + params['GERRIT_OLDREV'] = change.oldrev + params['GERRIT_NEWREV'] = change.newrev build = Build(job, uuid) self.builds[uuid] = build # We can get the started notification on another thread before diff --git a/zuul/model.py b/zuul/model.py index cd2b851d74..5a630d9363 100644 --- a/zuul/model.py +++ b/zuul/model.py @@ -145,29 +145,47 @@ class Project(object): class Change(object): - def __init__(self, queue_name, project, branch, number, patchset, refspec): + def __init__(self, queue_name, project, event): self.queue_name = queue_name self.project = project - self.branch = branch - self.number = number - self.patchset = patchset - self.refspec = refspec + self.branch = None + self.number = None + self.patchset = None + self.refspec = None + self.ref = None + self.oldrev = None + self.newrev = None + + if event.change_number: + self.branch = event.branch + self.number = event.change_number + self.patchset = event.patch_number + self.refspec = event.refspec + if event.ref: + self.ref = event.ref + self.oldrev = event.oldrev + self.newrev = event.newrev + self.jobs = {} self.job_urls = {} self.change_ahead = None self.change_behind = None self.running_builds = [] + def _id(self): + if self.number: + return '%s,%s' % (self.number, self.patchset) + return self.newrev + def __str__(self): - return '' % (id(self), self.number, self.patchset) + return '' % (id(self), self._id()) def formatStatus(self, indent=0): indent_str = ' ' * indent ret = '' - ret += '%sProject %s change %s,%s\n' % (indent_str, - self.project.name, - self.number, - self.patchset) + ret += '%sProject %s change %s\n' % (indent_str, + self.project.name, + self._id()) for job in self.project.getJobs(self.queue_name): result = self.jobs.get(job.name) ret += '%s %s: %s\n' % (indent_str, job.name, result) @@ -250,14 +268,19 @@ class Change(object): class TriggerEvent(object): def __init__(self): self.data = None + # common self.type = None self.project_name = None + # patchset-created, comment-added, etc. self.change_number = None self.patch_number = None self.refspec = None self.approvals = [] self.branch = None + # ref-updated self.ref = None + self.oldrev = None + self.newrew = None def __str__(self): ret = '