|  | # 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. | 
|  |  | 
|  | """Common library methods used by both coordinator and task machines.""" | 
|  |  | 
|  | import argparse | 
|  | import logging | 
|  | import os | 
|  | import socket | 
|  | import sys | 
|  |  | 
|  | # pylint: disable=relative-import | 
|  | # Import event directly here since it is used to decorate a module-level method. | 
|  | import event | 
|  |  | 
|  | LOGGING_LEVELS = ['DEBUG', 'INFO', 'WARNING', 'WARN', 'ERROR'] | 
|  | MY_IP = socket.gethostbyname(socket.gethostname()) | 
|  | DEFAULT_TIMEOUT_SECS = 30 * 60  # 30 minutes | 
|  | THIS_DIR = os.path.dirname(os.path.abspath(__file__)) | 
|  | LEGION_IMPORT_FIX = os.path.join(THIS_DIR, '..', '..') | 
|  | SWARMING_DIR = os.path.join(THIS_DIR, '..', '..', '..', 'tools', | 
|  | 'swarming_client') | 
|  |  | 
|  |  | 
|  | def InitLogging(): | 
|  | """Initialize the logging module. | 
|  |  | 
|  | Raises: | 
|  | argparse.ArgumentError if the --verbosity arg is incorrect. | 
|  | """ | 
|  | parser = argparse.ArgumentParser() | 
|  | logging_action = parser.add_argument('--verbosity', default='INFO') | 
|  | args, _ = parser.parse_known_args() | 
|  | if args.verbosity not in LOGGING_LEVELS: | 
|  | raise argparse.ArgumentError( | 
|  | logging_action, 'Only levels %s supported' % str(LOGGING_LEVELS)) | 
|  | logging.basicConfig( | 
|  | format='%(asctime)s %(filename)s:%(lineno)s %(levelname)s] %(message)s', | 
|  | datefmt='%H:%M:%S', level=args.verbosity) | 
|  |  | 
|  |  | 
|  | def GetOutputDir(): | 
|  | """Get the isolated output directory specified on the command line.""" | 
|  | parser = argparse.ArgumentParser() | 
|  | parser.add_argument('--output-dir') | 
|  | args, _ = parser.parse_known_args() | 
|  | return args.output_dir | 
|  |  | 
|  |  | 
|  | def GetUnusedPort(): | 
|  | """Finds and returns an unused port.""" | 
|  | s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) | 
|  | s.bind(('localhost', 0)) | 
|  | _, port = s.getsockname() | 
|  | s.close() | 
|  | return port | 
|  |  | 
|  |  | 
|  | def SetupEnvironment(): | 
|  | """Perform all environmental setup steps needed.""" | 
|  | InitLogging() | 
|  | sys.path.append(LEGION_IMPORT_FIX) | 
|  | sys.path.append(SWARMING_DIR) | 
|  |  | 
|  |  | 
|  | def Shutdown(): | 
|  | """Raises the on_shutdown event.""" | 
|  | OnShutdown() | 
|  |  | 
|  |  | 
|  | @event.Event | 
|  | def OnShutdown(): | 
|  | """Shutdown event dispatcher. | 
|  |  | 
|  | To use this simply use the following code example: | 
|  | common_lib.OnShutdown += my_handler_method | 
|  |  | 
|  | my_handler_method will be called when OnShutdown is called (this is done via | 
|  | the Shutdown method above, but can be called directly as well. | 
|  | """ | 
|  | pass | 
|  |  |