buildbot/steps/trigger.py: remove unused imports to hush pyflakes
[buildbot.git] / buildbot / steps / trigger.py
blob8cfb6adcb4259d716935e878e2139aeaa70ca1bd
1 from buildbot.process.buildstep import LoggingBuildStep, SUCCESS, FAILURE, EXCEPTION
2 from buildbot.steps.shell import WithProperties
3 from buildbot.scheduler import Triggerable
4 from twisted.internet import defer
6 class Trigger(LoggingBuildStep):
7 """
8 I trigger a Triggerable. It's fun.
9 """
10 name = "trigger"
12 flunkOnFailure = True
14 def __init__(self,
15 schedulers=[],
16 updateSourceStamp=False,
17 waitForFinish=False,
18 **kwargs):
19 """
20 Trigger the given schedulers when this step is executed.
22 @var schedulers: list of schedulers' names that should be triggered. Schedulers
23 can be specified using WithProperties, if desired.
25 @var updateSourceStamp: should I update the source stamp to
26 an absolute SourceStamp before triggering a new build?
28 @var waitForFinish: should I wait for all of the triggered schedulers to finish
29 their builds?
30 """
31 assert schedulers, "You must specify a scheduler to trigger"
32 self.schedulers = schedulers
33 self.updateSourceStamp = updateSourceStamp
34 self.waitForFinish = waitForFinish
35 self.running = False
36 LoggingBuildStep.__init__(self, **kwargs)
37 self.addFactoryArguments(schedulers=schedulers,
38 updateSourceStamp=updateSourceStamp,
39 waitForFinish=waitForFinish)
41 def interrupt(self, reason):
42 if self.running:
43 self.step_status.setColor("red")
44 self.step_status.setText(["interrupted"])
46 def start(self):
47 self.running = True
48 ss = self.build.getSourceStamp()
49 if self.updateSourceStamp:
50 ss = ss.getAbsoluteSourceStamp(self.build.getProperty('got_revision'))
51 # (is there an easier way to find the BuildMaster?)
52 all_schedulers = self.build.builder.botmaster.parent.allSchedulers()
53 all_schedulers = dict([(sch.name, sch) for sch in all_schedulers])
54 unknown_schedulers = []
55 triggered_schedulers = []
57 dl = []
58 for scheduler in self.schedulers:
59 if isinstance(scheduler, WithProperties):
60 scheduler = scheduler.render(self.build)
61 if all_schedulers.has_key(scheduler):
62 sch = all_schedulers[scheduler]
63 if isinstance(sch, Triggerable):
64 dl.append(sch.trigger(ss))
65 triggered_schedulers.append(scheduler)
66 else:
67 unknown_schedulers.append(scheduler)
68 else:
69 unknown_schedulers.append(scheduler)
71 if unknown_schedulers:
72 self.step_status.setColor("red")
73 self.step_status.setText(['no scheduler:'] + unknown_schedulers)
74 rc = FAILURE
75 else:
76 rc = SUCCESS
77 self.step_status.setText(['triggered'] + triggered_schedulers)
78 if self.waitForFinish:
79 self.step_status.setColor("yellow")
80 else:
81 self.step_status.setColor("green")
83 if self.waitForFinish:
84 d = defer.DeferredList(dl, consumeErrors=1)
85 else:
86 d = defer.succeed([])
88 def cb(rclist):
89 rc = SUCCESS
90 for was_cb, buildsetstatus in rclist:
91 # TODO: make this algo more configurable
92 if not was_cb:
93 rc = EXCEPTION
94 break
95 if buildsetstatus.getResults() == FAILURE:
96 rc = FAILURE
97 return self.finished(rc)
99 def eb(why):
100 return self.finished(FAILURE)
102 d.addCallbacks(cb, eb)