Home | History | Annotate | Download | only in cli
      1 #!/usr/bin/python
      2 """
      3 Selects all rows and columns that satisfy the condition specified
      4 and prints the matrix.
      5 """
      6 import optparse
      7 import common
      8 from autotest_lib.cli import rpc
      9 from autotest_lib.database import database_connection
     10 
     11 
     12 # First do all the options parsing
     13 parser = optparse.OptionParser()
     14 parser.add_option(
     15         '-C', '--columns', action='store', dest='columns',
     16         default='test_name,reason,test_started_time,test_finished_time,job_tag,'
     17                 'job_name,hostname,platform,kernel,status',
     18         help='Comma-separated list of column names to display')
     19 parser.add_option('-w', '--where', action='store', dest='condition',
     20             help=("The WHERE condition for the query witten in the 'new style' "
     21                   "condition syntax for new tko (see "
     22                   "http://autotest.kernel.org/wiki/TkoHowTo for more info)"))
     23 parser.add_option(
     24         '--test-attribute-field', action='append', default=[],
     25         help='Specifies a test attribute to include as a field.  The attribute '
     26              'value will be available as a field named attribute_<attribute '
     27              'name>.  This option may be specified multiple times.  Filtering '
     28              'must be done slightly differently -- see '
     29              'http://autotest.kernel.org/wiki/TkoHowTo#attribute_filtering '
     30              'for more details.')
     31 parser.add_option('--test-label-field', action='append', default=[],
     32                   help='Specifies a test label to include as a field.  See '
     33                        '--attribute-field for more details')
     34 parser.add_option('--iteration-result-field', action='append', default=[],
     35                   help='Specifies an iteration result to include as a field.  '
     36                        'See --attribute-field for more details.  Note that '
     37                        'this causes the rows returned to represent iterations '
     38                        'rather than plain test results.')
     39 parser.add_option('--machine-label-field', action='append', default=[],
     40                   help='Specifies a machine label to include as a field.  See '
     41                        '--attribute-field for more details')
     42 parser.add_option('--job-keyval-field', action='append', default=[],
     43                   help='Specifies a job keyval to include as a field. See '
     44                        '--attribute-field for more details')
     45 parser.add_option('--iteration-attribute-field', action='append', default=[],
     46                   help='Specifies an iteration attribute to include as a '
     47                        'field. See --attribute-field for more details.  Note '
     48                        'that this causes the rows returned to represent '
     49                        'iterations rather than plain test results.')
     50 parser.add_option('-s', '--separator', action='store', default = ' | ',
     51             dest='separator', help = 'output separator')
     52 parser.add_option('-n', '--nocount', action='store_true', default=False,
     53                   help='Do not display line counts before each line')
     54 parser.add_option('-l', '--logpath', action='store_true', default=False,
     55                   help='Reformats the the tag column into a URL \
     56                         like http://autotest/results/[tag]. \
     57                         This will append the tag column if it isn\'t provided.')
     58 parser.add_option('--host-label', action='store', dest='host_label',
     59                   help=('Return results only for machines currently '
     60                         'in the specified label'))
     61 
     62 (options, args) = parser.parse_args()
     63 
     64 if not options.condition:
     65     parser.error('You must specify a condition.')
     66 
     67 where = options.condition.replace('%', '%%')
     68 tag = 'job_tag'
     69 
     70 columns = options.columns.split(',')
     71 
     72 url_prefix = rpc.get_autotest_server() + '/results/'
     73 if options.logpath:
     74     if tag not in columns:
     75         columns.append(tag)
     76     tag_index=columns.index(tag)
     77 
     78 if options.host_label:
     79     database = database_connection.DatabaseConnection("AUTOTEST_WEB")
     80     database.connect()
     81     sql = ("SELECT hostname FROM afe_labels JOIN afe_hosts_labels "
     82            "ON afe_labels.id=afe_hosts_labels.label_id JOIN afe_hosts "
     83            "ON afe_hosts_labels.host_id=afe_hosts.id WHERE name=%s")
     84     results = database.execute(sql, options.host_label)
     85     hosts = [row[0] for row in results]
     86     where += " AND hostname IN ('" + "','".join(hosts) + "')"
     87 
     88 # Grab the data
     89 tko = rpc.tko_comm()
     90 count = 0
     91 test_views = tko.run(
     92         'get_test_views', extra_where=where,
     93         test_attribute_fields=options.test_attribute_field,
     94         test_label_fields=options.test_label_field,
     95         iteration_result_fields=options.iteration_result_field,
     96         machine_label_fields=options.machine_label_field,
     97         job_keyval_fields=options.job_keyval_field,
     98         iteration_attribute_fields=options.iteration_attribute_field)
     99 for test_view in test_views:
    100     values = [str(test_view[column]) for column in columns]
    101     if options.logpath:
    102         values[tag_index] = url_prefix + values[tag_index]
    103     if not options.nocount:
    104         print '[%d] ' % count,
    105         count += 1
    106     print options.separator.join(values)
    107