#!/usr/bin/python """ Selects all rows and columns that satisfy the condition specified and prints the matrix. """ import optparse import common from autotest_lib.cli import rpc from autotest_lib.database import database_connection # First do all the options parsing parser = optparse.OptionParser() parser.add_option( '-C', '--columns', action='store', dest='columns', default='test_name,reason,test_started_time,test_finished_time,job_tag,' 'job_name,hostname,platform,kernel,status', help='Comma-separated list of column names to display') parser.add_option('-w', '--where', action='store', dest='condition', help=("The WHERE condition for the query witten in the 'new style' " "condition syntax for new tko (see " "http://autotest.kernel.org/wiki/TkoHowTo for more info)")) parser.add_option( '--test-attribute-field', action='append', default=[], help='Specifies a test attribute to include as a field. The attribute ' 'value will be available as a field named attribute_<attribute ' 'name>. This option may be specified multiple times. Filtering ' 'must be done slightly differently -- see ' 'http://autotest.kernel.org/wiki/TkoHowTo#attribute_filtering ' 'for more details.') parser.add_option('--test-label-field', action='append', default=[], help='Specifies a test label to include as a field. See ' '--attribute-field for more details') parser.add_option('--iteration-result-field', action='append', default=[], help='Specifies an iteration result to include as a field. ' 'See --attribute-field for more details. Note that ' 'this causes the rows returned to represent iterations ' 'rather than plain test results.') parser.add_option('--machine-label-field', action='append', default=[], help='Specifies a machine label to include as a field. See ' '--attribute-field for more details') parser.add_option('--job-keyval-field', action='append', default=[], help='Specifies a job keyval to include as a field. See ' '--attribute-field for more details') parser.add_option('--iteration-attribute-field', action='append', default=[], help='Specifies an iteration attribute to include as a ' 'field. See --attribute-field for more details. Note ' 'that this causes the rows returned to represent ' 'iterations rather than plain test results.') parser.add_option('-s', '--separator', action='store', default = ' | ', dest='separator', help = 'output separator') parser.add_option('-n', '--nocount', action='store_true', default=False, help='Do not display line counts before each line') parser.add_option('-l', '--logpath', action='store_true', default=False, help='Reformats the the tag column into a URL \ like http://autotest/results/[tag]. \ This will append the tag column if it isn\'t provided.') parser.add_option('--host-label', action='store', dest='host_label', help=('Return results only for machines currently ' 'in the specified label')) (options, args) = parser.parse_args() if not options.condition: parser.error('You must specify a condition.') where = options.condition.replace('%', '%%') tag = 'job_tag' columns = options.columns.split(',') url_prefix = rpc.get_autotest_server() + '/results/' if options.logpath: if tag not in columns: columns.append(tag) tag_index=columns.index(tag) if options.host_label: database = database_connection.DatabaseConnection("AUTOTEST_WEB") database.connect() sql = ("SELECT hostname FROM afe_labels JOIN afe_hosts_labels " "ON afe_labels.id=afe_hosts_labels.label_id JOIN afe_hosts " "ON afe_hosts_labels.host_id=afe_hosts.id WHERE name=%s") results = database.execute(sql, options.host_label) hosts = [row[0] for row in results] where += " AND hostname IN ('" + "','".join(hosts) + "')" # Grab the data tko = rpc.tko_comm() count = 0 test_views = tko.run( 'get_test_views', extra_where=where, test_attribute_fields=options.test_attribute_field, test_label_fields=options.test_label_field, iteration_result_fields=options.iteration_result_field, machine_label_fields=options.machine_label_field, job_keyval_fields=options.job_keyval_field, iteration_attribute_fields=options.iteration_attribute_field) for test_view in test_views: values = [str(test_view[column]) for column in columns] if options.logpath: values[tag_index] = url_prefix + values[tag_index] if not options.nocount: print '[%d] ' % count, count += 1 print options.separator.join(values)