Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(37)

Side by Side Diff: build/android/test_wrapper/logdog_wrapper.py

Issue 2695963003: Use logdog butler subcommand to run tests. (Closed)
Patch Set: fixes Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « build/android/test_runner.py ('k') | tools/mb/mb.py » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 #!/usr/bin/env python 1 #!/usr/bin/env python
2 # Copyright 2016 The Chromium Authors. All rights reserved. 2 # Copyright 2016 The Chromium Authors. All rights reserved.
3 # Use of this source code is governed by a BSD-style license that can be 3 # Use of this source code is governed by a BSD-style license that can be
4 # found in the LICENSE file. 4 # found in the LICENSE file.
5 5
6 """Wrapper for adding logdog streaming support to swarming tasks.""" 6 """Wrapper for adding logdog streaming support to swarming tasks."""
7 7
8 import argparse 8 import argparse
9 import logging 9 import logging
10 import os 10 import os
11 import signal 11 import signal
12 import subprocess 12 import subprocess
13 import sys 13 import sys
14 import urllib
15 14
15 from devil.utils import signal_handler
16 from py_utils import tempfile_ext
17
18 PROJECT = 'chromium'
19 OUTPUT = 'logdog,service="services"'
20 COORDINATOR_HOST = 'luci-logdog.appspot.com'
16 21
17 def CommandParser(): 22 def CommandParser():
18 # Parses the command line arguments being passed in 23 # Parses the command line arguments being passed in
19 parser = argparse.ArgumentParser() 24 parser = argparse.ArgumentParser()
25 parser.add_argument('--target', required=True,
26 help='The test target to be run.')
20 parser.add_argument('--logdog-bin-cmd', required=True, 27 parser.add_argument('--logdog-bin-cmd', required=True,
21 help='Command for running logdog butler binary') 28 help='The logdog bin cmd.')
22 parser.add_argument('--project', required=True,
23 help='Name of logdog project')
24 parser.add_argument('--logdog-server',
25 default='services-dot-luci-logdog.appspot.com',
26 help='URL of logdog server, https:// is assumed.')
27 parser.add_argument('--service-account-json', required=True,
28 help='Location of authentication json')
29 parser.add_argument('--prefix', required=True,
30 help='Prefix to be used for logdog stream')
31 parser.add_argument('--source', required=True,
32 help='Location of file for logdog to stream')
33 parser.add_argument('--name', required=True,
34 help='Name to be used for logdog stream')
35 return parser 29 return parser
36 30
37 31 def CreateStopTestsMethod(proc):
38 def CreateUrl(server, project, prefix, name): 32 def StopTests(signum, _frame):
39 stream_name = '%s/%s/+/%s' % (project, prefix, name)
40 return 'https://%s/v/?s=%s' % (server, urllib.quote_plus(stream_name))
41
42
43 def CreateSignalForwarder(proc):
44 def handler(signum, _frame):
45 logging.error('Forwarding signal %s to test process', str(signum)) 33 logging.error('Forwarding signal %s to test process', str(signum))
46 proc.send_signal(signum) 34 proc.send_signal(signum)
47 35 return StopTests
48 return handler
49
50 36
51 def main(): 37 def main():
52 parser = CommandParser() 38 parser = CommandParser()
53 args, test_cmd = parser.parse_known_args(sys.argv[1:]) 39 args = parser.parse_args(sys.argv[1:])
40
54 logging.basicConfig(level=logging.INFO) 41 logging.basicConfig(level=logging.INFO)
55 if not test_cmd:
56 parser.error('Must specify command to run after the logdog flags')
57 test_proc = subprocess.Popen(test_cmd)
58 original_sigterm_handler = signal.signal(
59 signal.SIGTERM, CreateSignalForwarder(test_proc))
60 try:
61 result = test_proc.wait()
62 finally:
63 signal.signal(signal.SIGTERM, original_sigterm_handler)
64 if '${SWARMING_TASK_ID}' in args.prefix:
65 args.prefix = args.prefix.replace('${SWARMING_TASK_ID}',
66 os.environ.get('SWARMING_TASK_ID'))
67 url = CreateUrl('luci-logdog.appspot.com', args.project, args.prefix,
68 args.name)
69 logdog_cmd = [args.logdog_bin_cmd, '-project', args.project,
70 '-output', 'logdog,host=%s' % args.logdog_server,
71 '-prefix', args.prefix,
72 '-service-account-json', args.service_account_json,
73 'stream', '-source', args.source,
74 '-stream', '-name=%s' % args.name]
75 42
76 if not os.path.exists(args.logdog_bin_cmd): 43 test_cmd = [
77 logging.error( 44 os.path.join('bin', 'run_%s' % args.target),
78 'Logdog binary %s unavailable. Unable to upload logcats.', 45 '--logcat-output-file', '${ISOLATED_OUTDIR}/logcats',
mikecase (-- gone --) 2017/03/01 18:15:32 Btw, martiniss@ said that swarming will automatica
BigBossZhiling 2017/03/02 23:17:14 Done.
79 args.logdog_bin_cmd) 46 '--target-devices-file', '${SWARMING_BOT_FILE}',
80 elif not os.path.exists(args.source): 47 '-v']
81 logging.error(
82 'Logcat sources not found at %s. Unable to upload logcats.',
83 args.source)
84 else:
85 subprocess.call(logdog_cmd)
86 logging.info('Logcats are located at: %s', url)
87 return result
88 48
49 with tempfile_ext.NamedTemporaryDirectory(
50 prefix='tmp_android_logdog_wrapper') as temp_directory:
51 if not os.path.exists(args.logdog_bin_cmd):
52 logging.error(
53 'Logdog binary %s unavailable. Unable to create logdog client',
54 args.logdog_bin_cmd)
55 else:
56 streamserver_uri = 'unix:%s' % os.path.join(temp_directory,
57 'butler.sock')
58 prefix = 'android/swarming/logcats/${SWARMING_TASK_ID}'
59
60 # Call test_cmdline through logdog butler subcommand.
61 test_cmd = [
62 args.logdog_bin_cmd, '-project', PROJECT,
63 '-output', OUTPUT,
64 '-prefix', prefix,
65 '-coordinator-host', COORDINATOR_HOST,
66 'run', '-streamserver-uri', streamserver_uri, '--'] + test_cmd
67
68 test_proc = subprocess.Popen(test_cmd)
69 with signal_handler.SignalHandler(signal.SIGTERM,
70 CreateStopTestsMethod(test_proc)):
71 result = test_proc.wait()
72 return result
89 73
90 if __name__ == '__main__': 74 if __name__ == '__main__':
91 sys.exit(main()) 75 sys.exit(main())
OLDNEW
« no previous file with comments | « build/android/test_runner.py ('k') | tools/mb/mb.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698