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

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

Issue 2695963003: Use logdog butler subcommand to run tests. (Closed)
Patch Set: recreate logdog wrapper 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
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 shutil
11 import signal 12 import signal
12 import subprocess 13 import subprocess
13 import sys 14 import sys
14 import urllib 15 import tempfile
15
16 16
17 def CommandParser(): 17 def CommandParser():
18 # Parses the command line arguments being passed in 18 # Parses the command line arguments being passed in
19 parser = argparse.ArgumentParser() 19 parser = argparse.ArgumentParser()
20 parser.add_argument('--logdog-bin-cmd', required=True, 20 parser.add_argument('--target', required=True,
21 help='Command for running logdog butler binary') 21 help='The test target to be run.')
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 22 return parser
36 23
37
38 def CreateUrl(server, project, prefix, name):
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): 24 def CreateSignalForwarder(proc):
44 def handler(signum, _frame): 25 def handler(signum, _frame):
45 logging.error('Forwarding signal %s to test process', str(signum)) 26 logging.error('Forwarding signal %s to test process', str(signum))
46 proc.send_signal(signum) 27 proc.send_signal(signum)
47 28
48 return handler 29 return handler
49 30
50
51 def main(): 31 def main():
52 parser = CommandParser() 32 parser = CommandParser()
53 args, test_cmd = parser.parse_known_args(sys.argv[1:]) 33 args = parser.parse_args(sys.argv[1:])
34
54 logging.basicConfig(level=logging.INFO) 35 logging.basicConfig(level=logging.INFO)
55 if not test_cmd: 36
56 parser.error('Must specify command to run after the logdog flags') 37 test_cmd = [
38 os.path.join('bin', 'run_%s' % args.target),
39 '--logcat-output-file', '${ISOLATED_OUTDIR}/logcats',
mikecase (-- gone --) 2017/02/27 20:25:48 We do not want to pass both... '--logcat-output-f
BigBossZhiling 2017/02/27 21:24:41 John, do you know that if we create the temp file
jbudorick 2017/02/27 22:49:15 Case's response is correct.
jbudorick 2017/02/27 22:50:27 (to clarify: this was w.r.t. mb.py running on a di
BigBossZhiling 2017/02/28 07:29:53 Done.
40 '--target-devices-file', '${SWARMING_BOT_FILE}',
41 '-v']
42
43 logdog_bin_cmd = '../../bin/logdog_butler'
44 if not os.path.exists(logdog_bin_cmd):
45 logging.error(
46 'Logdog binary %s unavailable. Unable to create logdog client',
47 logdog_bin_cmd)
48 temp_directory = None
jbudorick 2017/02/27 22:49:15 I think you could handle this more cleanly with a
BigBossZhiling 2017/02/28 07:29:53 Done.
49 else:
50 test_cmd.extend(['--upload-full-logcat', '${ISOLATED_OUTDIR}/logcats'])
51 project = 'chromium'
jbudorick 2017/02/27 22:49:15 project, output, and coordinator_host can and prob
BigBossZhiling 2017/02/28 07:29:53 Done.
52 output = 'logdog,service="services"'
53 coordinator_host = 'luci-logdog.appspot.com'
54 temp_directory = tempfile.mkdtemp(prefix='tmp_android_logdog_wrapper')
55 streamserver_uri = 'unix:%s/butler.sock' % temp_directory
56 prefix = 'android/swarming/logcats/${SWARMING_TASK_ID}'
57
58 # Call test_cmdline through logdog butler subcommand.
59 test_cmd = [
60 logdog_bin_cmd, '-project', project,
61 '-output', output,
62 '-prefix', prefix,
63 '-coordinator-host', coordinator_host,
64 'run', '-streamserver-uri', streamserver_uri, '--'] + test_cmd
65
57 test_proc = subprocess.Popen(test_cmd) 66 test_proc = subprocess.Popen(test_cmd)
58 original_sigterm_handler = signal.signal( 67 original_sigterm_handler = signal.signal(
59 signal.SIGTERM, CreateSignalForwarder(test_proc)) 68 signal.SIGTERM, CreateSignalForwarder(test_proc))
60 try: 69 try:
61 result = test_proc.wait() 70 result = test_proc.wait()
62 finally: 71 finally:
63 signal.signal(signal.SIGTERM, original_sigterm_handler) 72 signal.signal(signal.SIGTERM, original_sigterm_handler)
64 if '${SWARMING_TASK_ID}' in args.prefix: 73 if temp_directory:
65 args.prefix = args.prefix.replace('${SWARMING_TASK_ID}', 74 try:
66 os.environ.get('SWARMING_TASK_ID')) 75 shutil.rmtree(temp_directory)
67 url = CreateUrl('luci-logdog.appspot.com', args.project, args.prefix, 76 except (OSError, IOError):
68 args.name) 77 logging.exception('Failed to remove temp directory %s', temp_directory)
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
76 if not os.path.exists(args.logdog_bin_cmd):
77 logging.error(
78 'Logdog binary %s unavailable. Unable to upload logcats.',
79 args.logdog_bin_cmd)
80 elif not os.path.exists(args.source):
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 78 return result
88 79
89
90 if __name__ == '__main__': 80 if __name__ == '__main__':
91 sys.exit(main()) 81 sys.exit(main())
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698