1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 from twisted.internet import defer
17 from twisted.application import service
18 from twisted.python import log, reflect
19 from buildbot.process import metrics
20 from buildbot import config, util
21
22 -class SchedulerManager(config.ReconfigurableServiceMixin,
23 service.MultiService):
28
29 @defer.deferredGenerator
31 timer = metrics.Timer("SchedulerManager.reconfigService")
32 timer.start()
33
34 old_by_name = dict((sch.name, sch) for sch in self)
35 old_set = set(old_by_name.iterkeys())
36 new_by_name = new_config.schedulers
37 new_set = set(new_by_name.iterkeys())
38
39 removed_names, added_names = util.diffSets(old_set, new_set)
40
41
42
43
44
45
46 for n in old_set & new_set:
47 old = old_by_name[n]
48 new = new_by_name[n]
49
50 if reflect.qual(old.__class__) != reflect.qual(new.__class__):
51 removed_names.add(n)
52 added_names.add(n)
53
54
55 elif not hasattr(old, 'reconfigService'):
56 if old != new:
57 removed_names.add(n)
58 added_names.add(n)
59
60
61
62 for sch_name in removed_names:
63 log.msg("removing scheduler '%s'" % (sch_name,))
64 sch = old_by_name[sch_name]
65 wfd = defer.waitForDeferred(
66 defer.maybeDeferred(lambda :
67 sch.disownServiceParent()))
68 yield wfd
69 wfd.getResult()
70 sch.master = None
71
72
73
74 for sch_name in added_names:
75 log.msg("adding scheduler '%s'" % (sch_name,))
76 sch = new_by_name[sch_name]
77
78
79 class_name = '%s.%s' % (sch.__class__.__module__,
80 sch.__class__.__name__)
81 wfd = defer.waitForDeferred(
82 self.master.db.state.getObjectId(
83 sch.name, class_name))
84 yield wfd
85 objectid = wfd.getResult()
86
87
88 sch.objectid = objectid
89 sch.master = self.master
90
91
92 sch.setServiceParent(self)
93
94 metrics.MetricCountEvent.log("num_schedulers", len(list(self)),
95 absolute=True)
96
97
98 wfd = defer.waitForDeferred(
99 config.ReconfigurableServiceMixin.reconfigService(self,
100 new_config))
101 yield wfd
102 wfd.getResult()
103
104 timer.stop()
105