OLD | NEW |
1 # Copyright 2013 The LUCI Authors. All rights reserved. | 1 # Copyright 2013 The LUCI Authors. All rights reserved. |
2 # Use of this source code is governed under the Apache License, Version 2.0 | 2 # Use of this source code is governed under the Apache License, Version 2.0 |
3 # that can be found in the LICENSE file. | 3 # that can be found in the LICENSE file. |
4 | 4 |
5 """Swarming bot main process. | 5 """Swarming bot main process. |
6 | 6 |
7 This is the program that communicates with the Swarming server, ensures the code | 7 This is the program that communicates with the Swarming server, ensures the code |
8 is always up to date and executes a child process to run tasks and upload | 8 is always up to date and executes a child process to run tasks and upload |
9 results back. | 9 results back. |
10 | 10 |
(...skipping 498 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
509 'dimensions': {u'id': ['none']}, | 509 'dimensions': {u'id': ['none']}, |
510 'state': {}, | 510 'state': {}, |
511 'version': generate_version(), | 511 'version': generate_version(), |
512 } | 512 } |
513 base_dir = os.path.dirname(THIS_FILE) | 513 base_dir = os.path.dirname(THIS_FILE) |
514 # Use temporary Bot object to call get_attributes. Attributes are needed to | 514 # Use temporary Bot object to call get_attributes. Attributes are needed to |
515 # construct the "real" bot.Bot. | 515 # construct the "real" bot.Bot. |
516 attributes = get_attributes( | 516 attributes = get_attributes( |
517 bot.Bot( | 517 bot.Bot( |
518 remote_client.createRemoteClient(config['server'], | 518 remote_client.createRemoteClient(config['server'], |
519 None, config['is_grpc']), | 519 None, config.get('swarming_grpc_proxy')), |
520 attributes, | 520 attributes, |
521 config['server'], | 521 config['server'], |
522 config['server_version'], | 522 config['server_version'], |
523 base_dir, | 523 base_dir, |
524 _on_shutdown_hook)) | 524 _on_shutdown_hook)) |
525 | 525 |
526 # Make remote client callback use the returned bot object. We assume here | 526 # Make remote client callback use the returned bot object. We assume here |
527 # RemoteClient doesn't call its callback in the constructor (since 'botobj' is | 527 # RemoteClient doesn't call its callback in the constructor (since 'botobj' is |
528 # undefined during the construction). | 528 # undefined during the construction). |
529 botobj = bot.Bot( | 529 botobj = bot.Bot( |
530 remote_client.createRemoteClient( | 530 remote_client.createRemoteClient( |
531 config['server'], | 531 config['server'], |
532 lambda: _get_authentication_headers(botobj), | 532 lambda: _get_authentication_headers(botobj), |
533 config['is_grpc']), | 533 config.get('swarming_grpc_proxy')), |
534 attributes, | 534 attributes, |
535 config['server'], | 535 config['server'], |
536 config['server_version'], | 536 config['server_version'], |
537 base_dir, | 537 base_dir, |
538 _on_shutdown_hook) | 538 _on_shutdown_hook) |
539 return botobj | 539 return botobj |
540 | 540 |
541 | 541 |
542 def _cleanup_bot_directory(botobj): | 542 def _cleanup_bot_directory(botobj): |
543 """Delete anything not expected in the swarming bot directory. | 543 """Delete anything not expected in the swarming bot directory. |
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
697 | 697 |
698 def _run_bot_inner(arg_error, quit_bit): | 698 def _run_bot_inner(arg_error, quit_bit): |
699 """Runs the bot until an event occurs. | 699 """Runs the bot until an event occurs. |
700 | 700 |
701 One of the three following even can occur: | 701 One of the three following even can occur: |
702 - host reboots | 702 - host reboots |
703 - bot process restarts (this includes self-update) | 703 - bot process restarts (this includes self-update) |
704 - bot process shuts down (this includes a signal is received) | 704 - bot process shuts down (this includes a signal is received) |
705 """ | 705 """ |
706 config = get_config() | 706 config = get_config() |
707 if config['enable_ts_monitoring']: | 707 if config.get('enable_ts_monitoring'): |
708 _init_ts_mon() | 708 _init_ts_mon() |
709 try: | 709 try: |
710 # First thing is to get an arbitrary url. This also ensures the network is | 710 # First thing is to get an arbitrary url. This also ensures the network is |
711 # up and running, which is necessary before trying to get the FQDN below. | 711 # up and running, which is necessary before trying to get the FQDN below. |
712 # There's no need to do error handling here - the "ping" is just to "wake | 712 # There's no need to do error handling here - the "ping" is just to "wake |
713 # up" the network; if there's something seriously wrong, the handshake will | 713 # up" the network; if there's something seriously wrong, the handshake will |
714 # fail and we'll handle it there. | 714 # fail and we'll handle it there. |
715 remote = remote_client.createRemoteClient(config['server'], None, | 715 remote = remote_client.createRemoteClient(config['server'], None, |
716 config['is_grpc']) | 716 config.get('swarming_grpc_proxy')) |
717 remote.ping() | 717 remote.ping() |
718 except Exception: | 718 except Exception: |
719 # url_read() already traps pretty much every exceptions. This except | 719 # url_read() already traps pretty much every exceptions. This except |
720 # clause is kept there "just in case". | 720 # clause is kept there "just in case". |
721 logging.exception('server_ping threw') | 721 logging.exception('server_ping threw') |
722 | 722 |
723 # If we are on GCE, we want to make sure GCE metadata server responds, since | 723 # If we are on GCE, we want to make sure GCE metadata server responds, since |
724 # we use the metadata to derive bot ID, dimensions and state. | 724 # we use the metadata to derive bot ID, dimensions and state. |
725 if platforms.is_gce(): | 725 if platforms.is_gce(): |
726 logging.info('Running on GCE, waiting for the metadata server') | 726 logging.info('Running on GCE, waiting for the metadata server') |
(...skipping 453 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1180 """Returns the data from config.json.""" | 1180 """Returns the data from config.json.""" |
1181 global _ERROR_HANDLER_WAS_REGISTERED | 1181 global _ERROR_HANDLER_WAS_REGISTERED |
1182 try: | 1182 try: |
1183 with contextlib.closing(zipfile.ZipFile(THIS_FILE, 'r')) as f: | 1183 with contextlib.closing(zipfile.ZipFile(THIS_FILE, 'r')) as f: |
1184 config = json.load(f.open('config/config.json', 'r')) | 1184 config = json.load(f.open('config/config.json', 'r')) |
1185 if config['server'].endswith('/'): | 1185 if config['server'].endswith('/'): |
1186 raise ValueError('Invalid server entry %r' % config['server']) | 1186 raise ValueError('Invalid server entry %r' % config['server']) |
1187 except (IOError, OSError, TypeError, ValueError): | 1187 except (IOError, OSError, TypeError, ValueError): |
1188 logging.exception('Invalid config.json!') | 1188 logging.exception('Invalid config.json!') |
1189 config = { | 1189 config = { |
1190 'enable_ts_monitoring': False, | |
1191 'is_grpc': False, | |
1192 'server': '', | 1190 'server': '', |
1193 'server_version': 'version1', | 1191 'server_version': 'version1', |
1194 } | 1192 } |
1195 if not _ERROR_HANDLER_WAS_REGISTERED and config['server']: | 1193 if not _ERROR_HANDLER_WAS_REGISTERED and config['server']: |
1196 on_error.report_on_exception_exit(config['server']) | 1194 on_error.report_on_exception_exit(config['server']) |
1197 _ERROR_HANDLER_WAS_REGISTERED = True | 1195 _ERROR_HANDLER_WAS_REGISTERED = True |
1198 return config | 1196 return config |
1199 | 1197 |
1200 | 1198 |
1201 def main(argv): | 1199 def main(argv): |
(...skipping 30 matching lines...) Expand all Loading... |
1232 error = None | 1230 error = None |
1233 if len(args.unsupported) != 0: | 1231 if len(args.unsupported) != 0: |
1234 error = 'Unexpected arguments: %s' % args | 1232 error = 'Unexpected arguments: %s' % args |
1235 try: | 1233 try: |
1236 return _run_bot(error) | 1234 return _run_bot(error) |
1237 finally: | 1235 finally: |
1238 _call_hook_safe( | 1236 _call_hook_safe( |
1239 True, bot.Bot(None, None, None, None, base_dir, None), | 1237 True, bot.Bot(None, None, None, None, base_dir, None), |
1240 'on_bot_shutdown') | 1238 'on_bot_shutdown') |
1241 logging.info('main() returning') | 1239 logging.info('main() returning') |
OLD | NEW |