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

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

Issue 2753993002: (Reland) Use logdog butler subcommand to run tests. (Closed)
Patch Set: address John's comments on logdog filter 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 signal 11 import signal
12 import subprocess 12 import subprocess
13 import sys 13 import sys
14 import urllib
15 14
15 _SRC_PATH = os.path.abspath(os.path.join(
16 os.path.dirname(__file__), '..', '..', '..'))
17 sys.path.append(os.path.join(_SRC_PATH, 'third_party', 'catapult', 'devil'))
18 sys.path.append(os.path.join(_SRC_PATH, 'third_party', 'catapult', 'common',
19 'py_utils'))
20
21 from devil.utils import signal_handler
22 from py_utils import tempfile_ext
23
24 PROJECT = 'chromium'
25 OUTPUT = 'logdog'
26 COORDINATOR_HOST = 'luci-logdog.appspot.com'
27 SERVICE_ACCOUNT_JSON = ('/creds/service_accounts'
28 '/service-account-luci-logdog-publisher.json')
16 29
17 def CommandParser(): 30 def CommandParser():
18 # Parses the command line arguments being passed in 31 # Parses the command line arguments being passed in
19 parser = argparse.ArgumentParser() 32 parser = argparse.ArgumentParser()
33 parser.add_argument('--target', required=True,
34 help='The test target to be run.')
20 parser.add_argument('--logdog-bin-cmd', required=True, 35 parser.add_argument('--logdog-bin-cmd', required=True,
21 help='Command for running logdog butler binary') 36 help='The logdog bin cmd.')
22 parser.add_argument('--project', required=True, 37 parser.add_argument('--target-devices-file', required=False,
23 help='Name of logdog project') 38 help='The target devices file.')
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 39 return parser
36 40
37 41 def CreateStopTestsMethod(proc):
38 def CreateUrl(server, project, prefix, name): 42 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)) 43 logging.error('Forwarding signal %s to test process', str(signum))
46 proc.send_signal(signum) 44 proc.send_signal(signum)
47 45 return StopTests
48 return handler
49
50 46
51 def main(): 47 def main():
52 parser = CommandParser() 48 parser = CommandParser()
53 args, test_cmd = parser.parse_known_args(sys.argv[1:]) 49 args, extra_cmd_args = parser.parse_known_args(sys.argv[1:])
50
54 logging.basicConfig(level=logging.INFO) 51 logging.basicConfig(level=logging.INFO)
55 if not test_cmd: 52 with tempfile_ext.NamedTemporaryDirectory() as logcat_output_dir:
56 parser.error('Must specify command to run after the logdog flags') 53 test_cmd = [
57 test_proc = subprocess.Popen(test_cmd) 54 os.path.join('bin', 'run_%s' % args.target),
58 original_sigterm_handler = signal.signal( 55 '--logcat-output-file', os.path.join(logcat_output_dir, 'logcats'),
59 signal.SIGTERM, CreateSignalForwarder(test_proc)) 56 '--upload-logcats-file',
60 try: 57 '--target-devices-file', args.target_devices_file,
61 result = test_proc.wait() 58 '-v'] + extra_cmd_args
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 59
76 if not os.path.exists(args.logdog_bin_cmd): 60 with tempfile_ext.NamedTemporaryDirectory(
77 logging.error( 61 prefix='tmp_android_logdog_wrapper') as temp_directory:
78 'Logdog binary %s unavailable. Unable to upload logcats.', 62 if not os.path.exists(args.logdog_bin_cmd):
79 args.logdog_bin_cmd) 63 logging.error(
80 elif not os.path.exists(args.source): 64 'Logdog binary %s unavailable. Unable to create logdog client',
81 logging.error( 65 args.logdog_bin_cmd)
82 'Logcat sources not found at %s. Unable to upload logcats.', 66 else:
83 args.source) 67 streamserver_uri = 'unix:%s' % os.path.join(temp_directory,
84 else: 68 'butler.sock')
85 subprocess.call(logdog_cmd) 69 prefix = os.path.join('android', 'swarming', 'logcats',
86 logging.info('Logcats are located at: %s', url) 70 os.environ.get('SWARMING_TASK_ID'))
87 return result
88 71
72 # Call test_cmdline through logdog butler subcommand.
73 test_cmd = [
74 args.logdog_bin_cmd, '-project', PROJECT,
75 '-output', OUTPUT,
76 '-prefix', prefix,
77 '--service-account-json', SERVICE_ACCOUNT_JSON,
78 '-coordinator-host', COORDINATOR_HOST,
79 'run', '-streamserver-uri', streamserver_uri, '--'] + test_cmd
80
81 test_proc = subprocess.Popen(test_cmd)
82 with signal_handler.SignalHandler(signal.SIGTERM,
83 CreateStopTestsMethod(test_proc)):
84 result = test_proc.wait()
85 return result
89 86
90 if __name__ == '__main__': 87 if __name__ == '__main__':
91 sys.exit(main()) 88 sys.exit(main())
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698