| OLD | NEW |
| (Empty) | |
| 1 # Copyright (c) 2013 The Chromium Authors. All rights reserved. |
| 2 # Use of this source code is governed by a BSD-style license that can be |
| 3 # found in the LICENSE file. |
| 4 |
| 5 from buildbot.scheduler import Scheduler |
| 6 from buildbot.scheduler import Triggerable |
| 7 |
| 8 import collections |
| 9 |
| 10 # This file contains useful functions for masters whose slaves run recipes. |
| 11 |
| 12 def AddSchedulersAndTriggers(buildmaster_config=None, |
| 13 slave_list=None, |
| 14 scheduler_name=None, |
| 15 branch=None): |
| 16 """Adds schedulers and triggers to the BuildmasterConfig based on |
| 17 the contents of slaves.cfg, passed in as a slave_list. |
| 18 |
| 19 This function relies on certain structure in the slaves.cfg, in |
| 20 particular the custom 'triggered_by' property, which is not yet |
| 21 commonly used to define triggers. |
| 22 |
| 23 Returns a dictionary mapping builder name, for those builders which |
| 24 invoke triggers, to the (synthesized) name of the trigger. |
| 25 |
| 26 TODO(kbr): this function does not yet support builders with |
| 27 multiple slaves behind them, but could be updated to do so. |
| 28 |
| 29 Throws an Exception if a non-existent builder is mentioned in |
| 30 another builder's 'triggered_by' property. |
| 31 |
| 32 Arguments: |
| 33 |
| 34 buildmaster_config: a BuildmasterConfig into which the |
| 35 'schedulers' property will be defined. |
| 36 |
| 37 slave_list: a SlavesList constructed from slaves.cfg. |
| 38 |
| 39 scheduler_name: the name of the Scheduler for the polling (not |
| 40 triggered) builders. |
| 41 """ |
| 42 c = buildmaster_config |
| 43 polling_builders = [] |
| 44 # Maps the parent builder to a set of the names of the builders it triggers. |
| 45 trigger_map = collections.defaultdict(list) |
| 46 # Maps the name of the parent builder to the (synthesized) name of its |
| 47 # trigger, wrapped in a list. |
| 48 trigger_name_map = {} |
| 49 next_group_id = 0 |
| 50 for slave in slave_list.slaves: |
| 51 builder = slave['builder'] |
| 52 parent_builder = slave.get('triggered_by') |
| 53 if parent_builder is not None: |
| 54 if slave_list.GetSlave(builder=parent_builder) is None: |
| 55 raise Exception('Could not find parent builder %s for builder %s' % |
| 56 (parent_builder, builder)) |
| 57 trigger_map[parent_builder].append(builder) |
| 58 if parent_builder not in trigger_name_map: |
| 59 trigger_name_map[parent_builder] = 'trigger_group_%d' % next_group_id |
| 60 next_group_id += 1 |
| 61 else: |
| 62 polling_builders.append(builder) |
| 63 s_gpu = Scheduler(name=scheduler_name, |
| 64 branch=branch, |
| 65 treeStableTimer=60, |
| 66 builderNames=polling_builders) |
| 67 c['schedulers'] = [s_gpu] |
| 68 for name, builders in trigger_map.iteritems(): |
| 69 c['schedulers'].append(Triggerable(name=trigger_name_map[name], |
| 70 builderNames=builders)) |
| 71 return trigger_name_map |
| 72 |
| 73 def AddRecipeBasedBuilders(buildmaster_config=None, |
| 74 slave_list=None, |
| 75 annotator=None, |
| 76 trigger_name_map=None): |
| 77 """Writes builders which use recipes to the BuildmasterConfig's |
| 78 'builders' list, using the AnnotatorFactory's BaseFactory. |
| 79 Specifies some common factory properties for these builders. |
| 80 |
| 81 Arguments: |
| 82 |
| 83 buildmaster_config: a BuildmasterConfig into which the |
| 84 'builders' property will be defined. |
| 85 |
| 86 slave_list: a SlavesList constructed from slaves.cfg. |
| 87 |
| 88 annotator: an AnnotatorFactory instance. |
| 89 |
| 90 trigger_name_map: the trigger name map returned by |
| 91 AddSchedulersAndTriggers, above. |
| 92 """ |
| 93 builders = [] |
| 94 for slave in slave_list.slaves: |
| 95 if 'recipe' in slave: |
| 96 factory_properties = { |
| 97 'test_results_server': 'test-results.appspot.com', |
| 98 'generate_gtest_json': True, |
| 99 'build_config': slave['build_config'] |
| 100 } |
| 101 if 'perf_id' in slave: |
| 102 factory_properties['show_perf_results'] = True |
| 103 factory_properties['perf_id'] = slave['perf_id'] |
| 104 name = slave['builder'] |
| 105 builders.append({ |
| 106 'name': name, |
| 107 'factory': annotator.BaseFactory( |
| 108 slave['recipe'], |
| 109 factory_properties, |
| 110 [trigger_name_map[name]] if name in trigger_name_map else None) |
| 111 }) |
| 112 buildmaster_config['builders'] = builders |
| OLD | NEW |