| Index: scripts/tools/slave_alloc_update.py
|
| diff --git a/scripts/tools/slave_alloc_update.py b/scripts/tools/slave_alloc_update.py
|
| new file mode 100755
|
| index 0000000000000000000000000000000000000000..7e2f94504d6c7e62c3d6c0a5f9818bc3ad660544
|
| --- /dev/null
|
| +++ b/scripts/tools/slave_alloc_update.py
|
| @@ -0,0 +1,81 @@
|
| +#!/usr/bin/env python
|
| +# Copyright 2015 The Chromium Authors. All rights reserved.
|
| +# Use of this source code is governed by a BSD-style license that can be
|
| +# found in the LICENSE file.
|
| +
|
| +"""Command-line tool to update slave allocation JSON for slave pools that are
|
| +managed by `<build>/scripts/common/slave_alloc.py`.
|
| +
|
| +This script is directed at a master, and will:
|
| + 1) Load the master's `slaves.cfg` and process it.
|
| + 2) For each identified SlaveAllocator instance, regenerate the slave pool JSON
|
| + file.
|
| +"""
|
| +
|
| +import argparse
|
| +import logging
|
| +import os
|
| +import sys
|
| +
|
| +import common.chromium_utils
|
| +import common.env
|
| +import common.slave_alloc
|
| +
|
| +
|
| +def _UpdateSlaveAlloc(master_dir, sa):
|
| + logging.info('Updating slaves for master "%s": [%s]',
|
| + os.path.basename(master_dir), sa.state_path)
|
| + with common.chromium_utils.MasterEnvironment(master_dir):
|
| + sa.SaveState()
|
| +
|
| +
|
| +def _UpdateMaster(master_name):
|
| + master_dir = common.chromium_utils.MasterPath(master_name)
|
| + slaves_cfg_path = os.path.join(os.path.abspath(master_dir), 'slaves.cfg')
|
| + if not os.path.isfile(slaves_cfg_path):
|
| + raise ValueError('Master directory does not contain "slaves.cfg": %s' % (
|
| + master_dir,))
|
| +
|
| + logging.debug('Loading "slaves.cfg" from: [%s]', slaves_cfg_path)
|
| + cfg = common.chromium_utils.ParsePythonCfg(slaves_cfg_path, fail_hard=False)
|
| +
|
| + updated = False
|
| + for name, sa in (cfg or {}).iteritems():
|
| + if isinstance(sa, common.slave_alloc.SlaveAllocator):
|
| + logging.debug('Identified slave allocator variable [%s]', name)
|
| + _UpdateSlaveAlloc(master_dir, sa)
|
| + updated = True
|
| + return updated
|
| +
|
| +
|
| +def main(argv):
|
| + parser = argparse.ArgumentParser()
|
| + parser.add_argument('-v', '--verbose',
|
| + action='count', default=0,
|
| + help='Increase verbosity. This can be specified multiple times.')
|
| + parser.add_argument('masters', metavar='NAME', nargs='+',
|
| + help='Name of the master to update.')
|
| + args = parser.parse_args(argv)
|
| +
|
| + # Configure logging verbosity.
|
| + if args.verbose == 0:
|
| + level = logging.WARNING
|
| + elif args.verbose == 1:
|
| + level = logging.INFO
|
| + else:
|
| + level = logging.DEBUG
|
| + logging.getLogger().setLevel(level)
|
| +
|
| + # Update each master directory.
|
| + for name in args.masters:
|
| + if not _UpdateMaster(name):
|
| + raise ValueError('No slave allocators identified for [%s]' % (name,))
|
| +
|
| +
|
| +if __name__ == '__main__':
|
| + logging.basicConfig()
|
| + try:
|
| + sys.exit(main(sys.argv[1:]))
|
| + except Exception as e:
|
| + logging.exception('Uncaught exception encountered during execution: %s', e)
|
| + sys.exit(2)
|
|
|