Package buildbot :: Package schedulers :: Module triggerable
[frames] | no frames]

Source Code for Module buildbot.schedulers.triggerable

  1  # ***** BEGIN LICENSE BLOCK ***** 
  2  # Version: MPL 1.1/GPL 2.0/LGPL 2.1 
  3  # 
  4  # The contents of this file are subject to the Mozilla Public License Version 
  5  # 1.1 (the "License"); you may not use this file except in compliance with 
  6  # the License. You may obtain a copy of the License at 
  7  # http://www.mozilla.org/MPL/ 
  8  # 
  9  # Software distributed under the License is distributed on an "AS IS" basis, 
 10  # WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License 
 11  # for the specific language governing rights and limitations under the 
 12  # License. 
 13  # 
 14  # The Original Code is Mozilla-specific Buildbot steps. 
 15  # 
 16  # The Initial Developer of the Original Code is 
 17  # Mozilla Foundation. 
 18  # Portions created by the Initial Developer are Copyright (C) 2009 
 19  # the Initial Developer. All Rights Reserved. 
 20  # 
 21  # Contributor(s): 
 22  #   Brian Warner <warner@lothar.com> 
 23  # 
 24  # Alternatively, the contents of this file may be used under the terms of 
 25  # either the GNU General Public License Version 2 or later (the "GPL"), or 
 26  # the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), 
 27  # in which case the provisions of the GPL or the LGPL are applicable instead 
 28  # of those above. If you wish to allow use of your version of this file only 
 29  # under the terms of either the GPL or the LGPL, and not to allow others to 
 30  # use your version of this file under the terms of the MPL, indicate your 
 31  # decision by deleting the provisions above and replace them with the notice 
 32  # and other provisions required by the GPL or the LGPL. If you do not delete 
 33  # the provisions above, a recipient may use your version of this file under 
 34  # the terms of any one of the MPL, the GPL or the LGPL. 
 35  # 
 36  # ***** END LICENSE BLOCK ***** 
 37   
 38  from twisted.internet import reactor, defer 
 39  from buildbot.schedulers import base 
 40  from buildbot.process.properties import Properties 
 41   
42 -class Triggerable(base.BaseScheduler):
43 """This scheduler doesn't do anything until it is triggered by a Trigger 44 step in a factory. In general, that step will not complete until all of 45 the builds that I fire have finished. 46 """ 47 48 compare_attrs = ('name', 'builderNames', 'properties')
49 - def __init__(self, name, builderNames, properties={}):
50 base.BaseScheduler.__init__(self, name, builderNames, properties) 51 self._waiters = {} 52 self.reason = "Triggerable(%s)" % name
53
54 - def trigger(self, ss, set_props=None):
55 """Trigger this scheduler. Returns a deferred that will fire when the 56 buildset is finished. 57 """ 58 59 # properties for this buildset are composed of our own properties, 60 # potentially overridden by anything from the triggering build 61 props = Properties() 62 props.updateFromProperties(self.properties) 63 if set_props: 64 props.updateFromProperties(set_props) 65 66 d = self.parent.db.runInteraction(self._trigger, ss, props) 67 # this returns a Deferred that fires when the buildset is complete, 68 # with the buildset results (SUCCESS or FAILURE). This Deferred is 69 # not persistent: if the master is bounced, the "upstream" build (the 70 # one which used steps.trigger.Trigger) will disappear anyways. 71 def _done(res): 72 return res[0] # chain the Deferred
73 d.addCallback(_done) 74 return d
75
76 - def _trigger(self, t, ss, props):
77 db = self.parent.db 78 ssid = db.get_sourcestampid(ss, t) 79 bsid = self.create_buildset(ssid, self.reason, t, props) 80 self._waiters[bsid] = d = defer.Deferred() 81 db.scheduler_subscribe_to_buildset(self.schedulerid, bsid, t) 82 reactor.callFromThread(self.parent.master.triggerSlaveManager) 83 return (d,) # apparently you can't return Deferreds from runInteraction
84
85 - def run(self):
86 # this exists just to notify triggerers that the builds they 87 # triggered are now done, i.e. if buildbot.steps.trigger.Trigger is 88 # called with waitForFinish=True. 89 d = self.parent.db.runInteraction(self._run) 90 return d
91 - def _run(self, t):
92 db = self.parent.db 93 res = db.scheduler_get_subscribed_buildsets(self.schedulerid, t) 94 # this returns bsid,ssid,results for all of our active subscriptions 95 for (bsid,ssid,complete,results) in res: 96 if complete: 97 d = self._waiters.pop(bsid, None) 98 if d: 99 reactor.callFromThread(d.callback, results) 100 db.scheduler_unsubscribe_buildset(self.schedulerid, bsid, t) 101 return None
102