blob: e3904f51bdbb51563a0e6bef4c73278368be0cdc [file] [log] [blame]
#!/usr/bin/env python
# Copyright 2016 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.
"""Wrapper for adding logdog streaming support to swarming tasks."""
import argparse
import logging
import os
import signal
import subprocess
import sys
_SRC_PATH = os.path.abspath(os.path.join(
os.path.dirname(__file__), '..', '..', '..'))
sys.path.append(os.path.join(_SRC_PATH, 'third_party', 'catapult', 'devil'))
sys.path.append(os.path.join(_SRC_PATH, 'third_party', 'catapult', 'common',
'py_utils'))
from devil.utils import signal_handler
from py_utils import tempfile_ext
PROJECT = 'chromium'
OUTPUT = 'logdog'
COORDINATOR_HOST = 'luci-logdog.appspot.com'
SERVICE_ACCOUNT_JSON = ('/creds/service_accounts'
'/service-account-luci-logdog-publisher.json')
def CommandParser():
# Parses the command line arguments being passed in
parser = argparse.ArgumentParser()
parser.add_argument('--target', required=True,
help='The test target to be run.')
parser.add_argument('--logdog-bin-cmd', required=True,
help='The logdog bin cmd.')
parser.add_argument('--target-devices-file', required=False,
help='The target devices file.')
return parser
def CreateStopTestsMethod(proc):
def StopTests(signum, _frame):
logging.error('Forwarding signal %s to test process', str(signum))
proc.send_signal(signum)
return StopTests
def main():
parser = CommandParser()
args, extra_cmd_args = parser.parse_known_args(sys.argv[1:])
logging.basicConfig(level=logging.INFO)
with tempfile_ext.NamedTemporaryDirectory() as logcat_output_dir:
test_cmd = [
os.path.join('bin', 'run_%s' % args.target),
'--logcat-output-file', os.path.join(logcat_output_dir, 'logcats'),
'--upload-logcats-file',
'--target-devices-file', args.target_devices_file,
'-v'] + extra_cmd_args
with tempfile_ext.NamedTemporaryDirectory(
prefix='tmp_android_logdog_wrapper') as temp_directory:
if not os.path.exists(args.logdog_bin_cmd):
logging.error(
'Logdog binary %s unavailable. Unable to create logdog client',
args.logdog_bin_cmd)
else:
streamserver_uri = 'unix:%s' % os.path.join(temp_directory,
'butler.sock')
prefix = os.path.join('android', 'swarming', 'logcats',
os.environ.get('SWARMING_TASK_ID'))
# Call test_cmdline through logdog butler subcommand.
test_cmd = [
args.logdog_bin_cmd, '-project', PROJECT,
'-output', OUTPUT,
'-prefix', prefix,
'--service-account-json', SERVICE_ACCOUNT_JSON,
'-coordinator-host', COORDINATOR_HOST,
'run', '-streamserver-uri', streamserver_uri, '--'] + test_cmd
test_proc = subprocess.Popen(test_cmd)
with signal_handler.SignalHandler(signal.SIGTERM,
CreateStopTestsMethod(test_proc)):
result = test_proc.wait()
return result
if __name__ == '__main__':
sys.exit(main())