from buildbot.steps.blocker import Blocker, BuilderStatusReceiver, BadStepError from buildbot.process import buildstep from buildbot.status.results import SUCCESS, FAILURE class YoctoBlocker(Blocker): VALID_IDLE_POLICIES = Blocker.VALID_IDLE_POLICIES + ("run",) name = "YoctoBlocker" def _getBuildStatus(self, botmaster, builderName): try: builder = botmaster.builders[builderName] except KeyError: raise BadStepError("no builder named %r" % builderName) myBuildStatus = self.build.getStatus() builderStatus = builder.builder_status matchingBuild = None all_builds = builderStatus.getCurrentBuilds() for buildStatus in all_builds: if self.buildsMatch(myBuildStatus, buildStatus): matchingBuild = buildStatus break if matchingBuild is None: msg = "no matching builds found in builder %r" % builderName if self.idlePolicy == "error": raise BadStepError(msg + " (is it idle?)") elif self.idlePolicy == "ignore": self._log(msg + ": skipping it") return None elif self.idlePolicy == "block": self._log(msg + ": will block until it starts a build") self._blocking_builders.add(builderStatus) return None elif self.idlePolicy == "run": self._log(msg + ": start build for break the block") from buildbot.process.builder import BuilderControl from buildbot.sourcestamp import SourceStamp bc = BuilderControl(builder, botmaster) bc.submitBuildRequest(SourceStamp(), "start for break the block", props = { 'uniquebuildnumber': (myBuildStatus.getProperties()['uniquebuildnumber'], 'Build'), } ) all_builds = (builderStatus.buildCache.values() + builderStatus.getCurrentBuilds()) for buildStatus in all_builds: if self.buildsMatch(myBuildStatus, buildStatus): matchingBuild = buildStatus break self._blocking_builders.add(builderStatus) self._log("found builder %r: %r", builderName, builder) return matchingBuild def buildsMatch(self, buildStatus1, buildStatus2): return \ buildStatus1.getProperties().has_key("DEST") and \ buildStatus2.getProperties().has_key("DEST") and \ buildStatus1.getProperties()["DEST"] == \ buildStatus2.getProperties()["DEST"]