Package buildbot :: Package status :: Module buildrequest
[frames] | no frames]

Source Code for Module buildbot.status.buildrequest

  1  # This file is part of Buildbot.  Buildbot is free software: you can 
  2  # redistribute it and/or modify it under the terms of the GNU General Public 
  3  # License as published by the Free Software Foundation, version 2. 
  4  # 
  5  # This program is distributed in the hope that it will be useful, but WITHOUT 
  6  # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 
  7  # FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more 
  8  # details. 
  9  # 
 10  # You should have received a copy of the GNU General Public License along with 
 11  # this program; if not, write to the Free Software Foundation, Inc., 51 
 12  # Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 
 13  # 
 14  # Copyright Buildbot Team Members 
 15   
 16  from zope.interface import implements 
 17  from twisted.python import log 
 18  from twisted.internet import defer 
 19  from buildbot import interfaces 
 20  from buildbot.util.eventual import eventually 
21 22 -class BuildRequestStatus:
23 implements(interfaces.IBuildRequestStatus) 24
25 - def __init__(self, buildername, brid, status):
26 self.buildername = buildername 27 self.brid = brid 28 self.status = status 29 self.master = status.master 30 31 self._buildrequest = None 32 self._buildrequest_lock = defer.DeferredLock()
33 34 @defer.deferredGenerator
35 - def _getBuildRequest(self):
36 """ 37 Get the underlying BuildRequest object for this status. This is a slow 38 operation! 39 40 @returns: BuildRequest instance or None, via Deferred 41 """ 42 # late binding to avoid an import cycle 43 from buildbot.process import buildrequest 44 45 # this is only set once, so no need to lock if we already have it 46 if self._buildrequest: 47 yield self._buildrequest 48 49 wfd = defer.waitForDeferred( 50 self._buildrequest_lock.acquire()) 51 yield wfd 52 wfd.getResult() 53 54 try: 55 if not self._buildrequest: 56 wfd = defer.waitForDeferred( 57 self.master.db.buildrequests.getBuildRequest(self.brid)) 58 yield wfd 59 brd = wfd.getResult() 60 61 wfd = defer.waitForDeferred( 62 buildrequest.BuildRequest.fromBrdict(self.master, brd)) 63 yield wfd 64 self._buildrequest = wfd.getResult() 65 except: # try/finally isn't allowed in generators in older Pythons 66 self._buildrequest_lock.release() 67 raise 68 69 self._buildrequest_lock.release() 70 71 yield self._buildrequest
72
73 - def buildStarted(self, build):
74 self.status._buildrequest_buildStarted(build.status) 75 self.builds.append(build.status)
76 77 # methods called by our clients 78 @defer.deferredGenerator
79 - def getSourceStamp(self):
80 wfd = defer.waitForDeferred( 81 self._getBuildRequest()) 82 yield wfd 83 br = wfd.getResult() 84 85 yield br.source
86
87 - def getBuilderName(self):
88 return self.buildername
89 90 @defer.deferredGenerator
91 - def getBuilds(self):
92 builder = self.status.getBuilder(self.getBuilderName()) 93 builds = [] 94 95 wfd = defer.waitForDeferred( 96 self.master.db.builds.getBuildsForRequest(self.brid)) 97 yield wfd 98 bdicts = wfd.getResult() 99 100 buildnums = sorted([ bdict['number'] for bdict in bdicts ]) 101 102 for buildnum in buildnums: 103 bs = builder.getBuild(buildnum) 104 if bs: 105 builds.append(bs) 106 yield builds
107
108 - def subscribe(self, observer):
109 d = self.getBuilds() 110 def notify_old(oldbuilds): 111 for bs in oldbuilds: 112 eventually(observer, bs)
113 d.addCallback(notify_old) 114 d.addCallback(lambda _ : 115 self.status._buildrequest_subscribe(self.brid, observer)) 116 d.addErrback(log.err, 'while notifying subscribers')
117
118 - def unsubscribe(self, observer):
119 self.status._buildrequest_unsubscribe(self.brid, observer)
120 121 @defer.deferredGenerator
122 - def getSubmitTime(self):
123 wfd = defer.waitForDeferred( 124 self._getBuildRequest()) 125 yield wfd 126 br = wfd.getResult() 127 128 yield br.submittedAt
129
130 - def asDict(self):
131 result = {} 132 # Constant 133 result['source'] = None # not available sync, sorry 134 result['builderName'] = self.buildername 135 result['submittedAt'] = None # not availably sync, sorry 136 137 # Transient 138 result['builds'] = [] # not available async, sorry 139 return result
140 141 @defer.deferredGenerator
142 - def asDict_async(self):
143 result = {} 144 145 wfd = defer.waitForDeferred( 146 self.getSourceStamp()) 147 yield wfd 148 ss = wfd.getResult() 149 result['source'] = ss.asDict() 150 151 result['builderName'] = self.getBuilderName() 152 153 wfd = defer.waitForDeferred( 154 self.getSubmitTime()) 155 yield wfd 156 submittedAt = wfd.getResult() 157 result['submittedAt'] = submittedAt 158 159 wfd = defer.waitForDeferred( 160 self.getBuilds()) 161 yield wfd 162 builds = wfd.getResult() 163 164 result['builds'] = [ build.asDict() for build in builds ] 165 166 yield result
167