xref: /aosp_15_r20/external/autotest/cli/atest.py (revision 9c5db1993ded3edbeafc8092d69fe5de2ee02df7)
1*9c5db199SXin Li#
2*9c5db199SXin Li# Copyright 2008 Google Inc. All Rights Reserved.
3*9c5db199SXin Li#
4*9c5db199SXin Li"""Command line interface for autotest
5*9c5db199SXin Li
6*9c5db199SXin LiThis module contains the generic CLI processing
7*9c5db199SXin Li
8*9c5db199SXin LiSee topic_common.py for a High Level Design and Algorithm.
9*9c5db199SXin Li
10*9c5db199SXin LiThis file figures out the topic and action from the 2 first arguments
11*9c5db199SXin Lion the command line and imports the <topic> module.
12*9c5db199SXin Li
13*9c5db199SXin LiIt then creates a <topic>_<action> object, and calls it parses),
14*9c5db199SXin Liexecute() and output() methods.
15*9c5db199SXin Li"""
16*9c5db199SXin Li
17*9c5db199SXin Lifrom __future__ import print_function
18*9c5db199SXin Li
19*9c5db199SXin Li__author__ = '[email protected] (Jean-Marc Eurin)'
20*9c5db199SXin Li
21*9c5db199SXin Liimport os, sys, re, traceback
22*9c5db199SXin Li
23*9c5db199SXin Liimport common
24*9c5db199SXin Lifrom autotest_lib.cli import topic_common
25*9c5db199SXin Lifrom autotest_lib.client.common_lib import lsbrelease_utils
26*9c5db199SXin Lifrom autotest_lib.server import utils
27*9c5db199SXin Li
28*9c5db199SXin Li
29*9c5db199SXin Lidef main():
30*9c5db199SXin Li    """
31*9c5db199SXin Li    The generic syntax is:
32*9c5db199SXin Li    atest <topic> <action> <options>
33*9c5db199SXin Li    atest-<topic> <action> <options>
34*9c5db199SXin Li    atest --help
35*9c5db199SXin Li    """
36*9c5db199SXin Li    _disallow_root_user_on_moblab()
37*9c5db199SXin Li    cli = os.path.basename(sys.argv[0])
38*9c5db199SXin Li    syntax_obj = topic_common.atest()
39*9c5db199SXin Li
40*9c5db199SXin Li    # Normalize the various --help, -h and help to -h
41*9c5db199SXin Li    sys.argv = [re.sub('--help|help', '-h', arg) for arg in sys.argv]
42*9c5db199SXin Li
43*9c5db199SXin Li    match = re.search('^atest-(\w+)$', cli)
44*9c5db199SXin Li    if match:
45*9c5db199SXin Li        topic = match.group(1)
46*9c5db199SXin Li    else:
47*9c5db199SXin Li        if len(sys.argv) > 1:
48*9c5db199SXin Li            topic = sys.argv.pop(1)
49*9c5db199SXin Li        else:
50*9c5db199SXin Li            syntax_obj.invalid_syntax('No topic argument')
51*9c5db199SXin Li
52*9c5db199SXin Li
53*9c5db199SXin Li    if topic == '-h':
54*9c5db199SXin Li        sys.argv.insert(1, '-h')
55*9c5db199SXin Li        syntax_obj.parse()
56*9c5db199SXin Li
57*9c5db199SXin Li    # Import the topic specific file
58*9c5db199SXin Li    cli_dir = os.path.abspath(os.path.dirname(__file__))
59*9c5db199SXin Li    if not os.path.exists(os.path.join(cli_dir, '%s.py' % topic)):
60*9c5db199SXin Li        syntax_obj.invalid_syntax('Invalid topic %s' % topic)
61*9c5db199SXin Li    topic_module = common.setup_modules.import_module(topic,
62*9c5db199SXin Li                                                      'autotest_lib.cli')
63*9c5db199SXin Li
64*9c5db199SXin Li    # If we have a syntax error now, it should
65*9c5db199SXin Li    # refer to the topic class.
66*9c5db199SXin Li    topic_class = getattr(topic_module, topic)
67*9c5db199SXin Li    topic_obj = topic_class()
68*9c5db199SXin Li
69*9c5db199SXin Li    if len(sys.argv) > 1:
70*9c5db199SXin Li        action = sys.argv.pop(1)
71*9c5db199SXin Li
72*9c5db199SXin Li        if action == '-h':
73*9c5db199SXin Li            action = 'help'
74*9c5db199SXin Li            sys.argv.insert(1, '-h')
75*9c5db199SXin Li    else:
76*9c5db199SXin Li        topic_obj.invalid_syntax('No action argument')
77*9c5db199SXin Li
78*9c5db199SXin Li    # Any backward compatibility changes?
79*9c5db199SXin Li    action = topic_obj.backward_compatibility(action, sys.argv)
80*9c5db199SXin Li
81*9c5db199SXin Li    # Instantiate a topic object
82*9c5db199SXin Li    try:
83*9c5db199SXin Li        action_class = getattr(topic_module, topic + '_' + action)
84*9c5db199SXin Li    except AttributeError:
85*9c5db199SXin Li        topic_obj.invalid_syntax('Invalid action %s' % action)
86*9c5db199SXin Li
87*9c5db199SXin Li    action_obj = action_class()
88*9c5db199SXin Li
89*9c5db199SXin Li    action_obj.parse()
90*9c5db199SXin Li    try:
91*9c5db199SXin Li        try:
92*9c5db199SXin Li            results = action_obj.execute()
93*9c5db199SXin Li        except topic_common.CliError:
94*9c5db199SXin Li            pass
95*9c5db199SXin Li        except Exception as err:
96*9c5db199SXin Li            traceback.print_exc()
97*9c5db199SXin Li            action_obj.generic_error("Unexpected exception: %s" % err)
98*9c5db199SXin Li        else:
99*9c5db199SXin Li            try:
100*9c5db199SXin Li                action_obj.output(results)
101*9c5db199SXin Li            except Exception:
102*9c5db199SXin Li                traceback.print_exc()
103*9c5db199SXin Li    finally:
104*9c5db199SXin Li        return action_obj.show_all_failures()
105*9c5db199SXin Li
106*9c5db199SXin Li
107*9c5db199SXin Lidef _disallow_root_user_on_moblab():
108*9c5db199SXin Li    """Running these tools as root interferes with moblab services"""
109*9c5db199SXin Li    if lsbrelease_utils.is_moblab():
110*9c5db199SXin Li        utils.verify_not_root_user()
111