Support job keyvals and iteration attributes in the query_results CLI
Signed-off-by: James Ren <[email protected]>
--- autotest/cli/query_results 2010-03-26 13:03:30.000000000 -0700
+++ autotest/cli/query_results 2010-03-26 13:03:30.000000000 -0700
@@ -21,17 +21,17 @@
"condition syntax for new tko (see "
"http://autotest.kernel.org/wiki/TkoHowTo for more info)"))
parser.add_option(
- '--attribute-field', action='append', default=[],
+ '--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('--label-field', action='append', default=[],
+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-field', action='append', default=[],
+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 '
@@ -39,6 +39,14 @@
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,
@@ -80,11 +88,14 @@
# Grab the data
tko = rpc.tko_comm()
count = 0
-test_views = tko.run('get_test_views', extra_where=where,
- test_attribute_fields=options.attribute_field,
- test_label_fields=options.label_field,
- iteration_fields=options.iteration_field,
- machine_label_fields=options.machine_label_field)
+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:
--- autotest/frontend/client/src/autotest/tko/CommonPanel.java 2010-03-26
13:03:30.000000000 -0700
+++ autotest/frontend/client/src/autotest/tko/CommonPanel.java 2010-03-26
13:03:30.000000000 -0700
@@ -158,7 +158,7 @@
if (!savedShowInvalid) {
parameterizedFieldPresenter.addFieldIfNotPresent(TestLabelField.TYPE_NAME,
"invalidated");
- condition = "(" + condition + ") AND label_invalidated.id IS NULL";
+ condition = "(" + condition + ") AND test_label_invalidated.id IS
NULL";
}
JSONObject conditionArgs = new JSONObject();
--- /dev/null 2009-12-17 12:29:38.000000000 -0800
+++ autotest/frontend/client/src/autotest/tko/IterationAttributeField.java
2010-03-26 13:03:30.000000000 -0700
@@ -0,0 +1,26 @@
+package autotest.tko;
+
+
+public class IterationAttributeField extends AttributeField {
+ public static final String TYPE_NAME = "Iteration result";
+
+ @Override
+ protected ParameterizedField freshInstance() {
+ return new IterationAttributeField();
+ }
+
+ @Override
+ public String getTypeName() {
+ return TYPE_NAME;
+ }
+
+ @Override
+ protected String getFieldParameterName() {
+ return "iteration_attribute_fields";
+ }
+
+ @Override
+ public String getBaseSqlName() {
+ return "iteration_attribute_";
+ }
+}
--- autotest/frontend/client/src/autotest/tko/IterationResultField.java
2010-03-26 13:03:30.000000000 -0700
+++ autotest/frontend/client/src/autotest/tko/IterationResultField.java
2010-03-26 13:03:30.000000000 -0700
@@ -16,11 +16,11 @@
@Override
protected String getFieldParameterName() {
- return "iteration_fields";
+ return "iteration_result_fields";
}
@Override
public String getBaseSqlName() {
- return "iteration_";
+ return "iteration_result_";
}
}
--- /dev/null 2009-12-17 12:29:38.000000000 -0800
+++ autotest/frontend/client/src/autotest/tko/JobKeyvalField.java
2010-03-26 13:03:30.000000000 -0700
@@ -0,0 +1,26 @@
+package autotest.tko;
+
+
+public class JobKeyvalField extends AttributeField {
+ public static final String TYPE_NAME = "Job Keyval";
+
+ @Override
+ protected ParameterizedField freshInstance() {
+ return new JobKeyvalField();
+ }
+
+ @Override
+ public String getTypeName() {
+ return TYPE_NAME;
+ }
+
+ @Override
+ protected String getFieldParameterName() {
+ return "job_keyval_fields";
+ }
+
+ @Override
+ public String getBaseSqlName() {
+ return "job_keyval_";
+ }
+}
--- autotest/frontend/client/src/autotest/tko/ParameterizedField.java
2010-03-26 13:03:30.000000000 -0700
+++ autotest/frontend/client/src/autotest/tko/ParameterizedField.java
2010-03-26 13:03:30.000000000 -0700
@@ -43,6 +43,8 @@
new IterationResultField(),
new TestAttributeField(),
new TestLabelField(),
+ new JobKeyvalField(),
+ new IterationAttributeField(),
};
private static final List<String> prototypeNames = new ArrayList<String>();
--- autotest/frontend/client/src/autotest/tko/TestAttributeField.java
2010-03-26 13:03:30.000000000 -0700
+++ autotest/frontend/client/src/autotest/tko/TestAttributeField.java
2010-03-26 13:03:30.000000000 -0700
@@ -21,6 +21,6 @@
@Override
public String getBaseSqlName() {
- return "attribute_";
+ return "test_attribute_";
}
}
--- autotest/frontend/client/src/autotest/tko/TestLabelField.java
2010-03-26 13:03:30.000000000 -0700
+++ autotest/frontend/client/src/autotest/tko/TestLabelField.java
2010-03-26 13:03:30.000000000 -0700
@@ -10,7 +10,7 @@
@Override
protected String getBaseSqlName() {
- return "label_";
+ return "test_label_";
}
@Override
--- autotest/frontend/tko/models.py 2010-03-26 13:03:30.000000000 -0700
+++ autotest/frontend/tko/models.py 2010-03-26 13:03:30.000000000 -0700
@@ -140,7 +140,7 @@
db_table = 'tko_status'
-class Job(dbmodels.Model):
+class Job(dbmodels.Model, model_logic.ModelExtensions):
job_idx = dbmodels.AutoField(primary_key=True)
tag = dbmodels.CharField(unique=True, max_length=100)
label = dbmodels.CharField(max_length=300)
@@ -151,6 +151,8 @@
finished_time = dbmodels.DateTimeField(null=True, blank=True)
afe_job_id = dbmodels.IntegerField(null=True, default=None)
+ objects = model_logic.ExtendedManager()
+
class Meta:
db_table = 'tko_jobs'
@@ -371,8 +373,8 @@
return self._add_custom_select(query_set, alias, select_sql)
- def _join_label_column(self, query_set, label_name, label_id):
- alias = 'label_' + label_name
+ def _join_test_label_column(self, query_set, label_name, label_id):
+ alias = 'test_label_' + label_name
label_query = TestLabel.objects.filter(name=label_name)
query_set = Test.objects.join_custom_field(query_set, label_query,
alias)
@@ -381,23 +383,23 @@
return query_set
- def _join_label_columns(self, query_set, label_names):
+ def _join_test_label_columns(self, query_set, label_names):
label_id_map = self._get_label_ids_from_names(label_names)
for label_name in label_names:
- query_set = self._join_label_column(query_set, label_name,
- label_id_map[label_name])
+ query_set = self._join_test_label_column(query_set, label_name,
+ label_id_map[label_name])
return query_set
- def _join_attribute(self, query_set, attribute, alias=None,
- extra_join_condition=None):
+ def _join_test_attribute(self, query_set, attribute, alias=None,
+ extra_join_condition=None):
"""
Join the given TestView QuerySet to TestAttribute. The resulting query
has an additional column for the given attribute named
"attribute_<attribute name>".
"""
if not alias:
- alias = 'attribute_' + attribute
+ alias = 'test_attribute_' + attribute
attribute_query = TestAttribute.objects.filter(attribute=attribute)
if extra_join_condition:
attribute_query = attribute_query.extra(
@@ -414,15 +416,15 @@
alias = 'machine_label_' + label_name
condition = "FIND_IN_SET('%s', %s)" % (
label_name, _quote_name(alias) + '.value')
- query_set = self._join_attribute(query_set, 'host-labels',
- alias=alias,
- extra_join_condition=condition)
+ query_set = self._join_test_attribute(
+ query_set, 'host-labels',
+ alias=alias, extra_join_condition=condition)
query_set = self._add_select_ifnull(query_set, alias, label_name)
return query_set
def _join_one_iteration_key(self, query_set, result_key, first_alias=None):
- alias = 'iteration_' + result_key
+ alias = 'iteration_result_' + result_key
iteration_query = IterationResult.objects.filter(attribute=result_key)
if first_alias:
# after the first join, we need to match up iteration indices,
@@ -445,7 +447,7 @@
return query_set, alias
- def _join_iterations(self, test_view_query_set, result_keys):
+ def _join_iteration_results(self, test_view_query_set, result_keys):
"""Join the given TestView QuerySet to IterationResult for one result.
The resulting query looks like a TestView query but has one row per
@@ -473,6 +475,27 @@
return query_set
+ def _join_job_keyvals(self, query_set, job_keyvals):
+ for job_keyval in job_keyvals:
+ alias = 'job_keyval_' + job_keyval
+ keyval_query = JobKeyval.objects.filter(key=job_keyval)
+ query_set = Job.objects.join_custom_field(query_set, keyval_query,
+ alias)
+ query_set = self._add_select_value(query_set, alias)
+ return query_set
+
+
+ def _join_iteration_attributes(self, query_set, iteration_attributes):
+ for attribute in iteration_attributes:
+ alias = 'iteration_attribute_' + attribute
+ attribute_query = IterationAttribute.objects.filter(
+ attribute=attribute)
+ query_set = Test.objects.join_custom_field(query_set,
+ attribute_query, alias)
+ query_set = self._add_select_value(query_set, alias)
+ return query_set
+
+
def get_query_set_with_joins(self, filter_data):
"""
Add joins for querying over test-related items.
@@ -482,7 +505,7 @@
be available as a column attribute_<name>.value.
* test_label_fields: list of label names. Each label will be available
as a column label_<name>.id, non-null iff the label is present.
- * iteration_fields: list of iteration result names. Each
+ * iteration_result_fields: list of iteration result names. Each
result will be available as a column iteration_<name>.value.
Note that this changes the semantics to return iterations
instead of tests -- if a test has multiple iterations, a row
@@ -491,6 +514,13 @@
* machine_label_fields: list of machine label names. Each will be
available as a column machine_label_<name>.id, non-null iff the
label is present on the machine used in the test.
+ * job_keyval_fields: list of job keyval names. Each value will be
+ available as a column job_keyval_<name>.id, non-null iff the
+ keyval is present in the AFE job.
+ * iteration_attribute_fields: list of iteration attribute names. Each
+ attribute will be available as a column
+ iteration_attribute<name>.id, non-null iff the attribute is
+ present.
These parameters are deprecated:
* include_labels
@@ -507,16 +537,23 @@
test_attributes = filter_data.pop('test_attribute_fields', [])
for attribute in test_attributes:
- query_set = self._join_attribute(query_set, attribute)
+ query_set = self._join_test_attribute(query_set, attribute)
test_labels = filter_data.pop('test_label_fields', [])
- query_set = self._join_label_columns(query_set, test_labels)
+ query_set = self._join_test_label_columns(query_set, test_labels)
machine_labels = filter_data.pop('machine_label_fields', [])
query_set = self._join_machine_label_columns(query_set, machine_labels)
- iteration_keys = filter_data.pop('iteration_fields', [])
- query_set = self._join_iterations(query_set, iteration_keys)
+ iteration_keys = filter_data.pop('iteration_result_fields', [])
+ query_set = self._join_iteration_results(query_set, iteration_keys)
+
+ job_keyvals = filter_data.pop('job_keyval_fields', [])
+ query_set = self._join_job_keyvals(query_set, job_keyvals)
+
+ iteration_attributes = filter_data.pop('iteration_attribute_fields',
[])
+ query_set = self._join_iteration_attributes(query_set,
+ iteration_attributes)
# everything that follows is deprecated behavior
--- autotest/frontend/tko/rpc_interface_unittest.py 2010-03-26
13:03:30.000000000 -0700
+++ autotest/frontend/tko/rpc_interface_unittest.py 2010-03-26
13:03:30.000000000 -0700
@@ -421,39 +421,39 @@
test_attribute_fields=['myattr', 'myattr2'])
self.assertEquals(len(tests), 3)
- self.assertEquals(tests[0]['attribute_myattr'], 'myval')
- self.assertEquals(tests[0]['attribute_myattr2'], 'myval2')
+ self.assertEquals(tests[0]['test_attribute_myattr'], 'myval')
+ self.assertEquals(tests[0]['test_attribute_myattr2'], 'myval2')
for index in (1, 2):
- self.assertEquals(tests[index]['attribute_myattr'], None)
- self.assertEquals(tests[index]['attribute_myattr2'], None)
+ self.assertEquals(tests[index]['test_attribute_myattr'], None)
+ self.assertEquals(tests[index]['test_attribute_myattr2'], None)
def test_filtering_on_test_attribute_fields(self):
tests = rpc_interface.get_test_views(
- extra_where='attribute_myattr.value = "myval"',
+ extra_where='test_attribute_myattr.value = "myval"',
test_attribute_fields=['myattr'])
self.assertEquals(len(tests), 1)
def test_grouping_with_test_attribute_fields(self):
num_groups = rpc_interface.get_num_groups(
- ['attribute_myattr'], test_attribute_fields=['myattr'])
+ ['test_attribute_myattr'], test_attribute_fields=['myattr'])
self.assertEquals(num_groups, 2)
counts = rpc_interface.get_group_counts(
- ['attribute_myattr'], test_attribute_fields=['myattr'])
+ ['test_attribute_myattr'], test_attribute_fields=['myattr'])
groups = counts['groups']
self.assertEquals(len(groups), num_groups)
- self.assertEquals(groups[0]['attribute_myattr'], None)
+ self.assertEquals(groups[0]['test_attribute_myattr'], None)
self.assertEquals(groups[0]['group_count'], 2)
- self.assertEquals(groups[1]['attribute_myattr'], 'myval')
+ self.assertEquals(groups[1]['test_attribute_myattr'], 'myval')
self.assertEquals(groups[1]['group_count'], 1)
def test_extra_info_test_attributes(self):
counts = rpc_interface.get_latest_tests(
- group_by=['test_idx'], extra_info=['attribute_myattr'],
+ group_by=['test_idx'], extra_info=['test_attribute_myattr'],
test_attribute_fields=['myattr'])
group1 = counts['groups'][0]
self.assertEquals(group1['extra_info'], ['myval'])
@@ -464,76 +464,78 @@
test_label_fields=['testlabel1', 'testlabel2'])
self.assertEquals(len(tests), 3)
- self.assertEquals(tests[0]['label_testlabel1'], 'testlabel1')
- self.assertEquals(tests[0]['label_testlabel2'], 'testlabel2')
+ self.assertEquals(tests[0]['test_label_testlabel1'], 'testlabel1')
+ self.assertEquals(tests[0]['test_label_testlabel2'], 'testlabel2')
for index in (1, 2):
- self.assertEquals(tests[index]['label_testlabel1'], None)
- self.assertEquals(tests[index]['label_testlabel2'], None)
+ self.assertEquals(tests[index]['test_label_testlabel1'], None)
+ self.assertEquals(tests[index]['test_label_testlabel2'], None)
def test_filtering_on_test_label_fields(self):
tests = rpc_interface.get_test_views(
- extra_where='label_testlabel1 = "testlabel1"',
+ extra_where='test_label_testlabel1 = "testlabel1"',
test_label_fields=['testlabel1'])
self.assertEquals(len(tests), 1)
def test_grouping_on_test_label_fields(self):
num_groups = rpc_interface.get_num_groups(
- ['label_testlabel1'], test_label_fields=['testlabel1'])
+ ['test_label_testlabel1'], test_label_fields=['testlabel1'])
self.assertEquals(num_groups, 2)
counts = rpc_interface.get_group_counts(
- ['label_testlabel1'], test_label_fields=['testlabel1'])
+ ['test_label_testlabel1'], test_label_fields=['testlabel1'])
groups = counts['groups']
self.assertEquals(len(groups), 2)
- self.assertEquals(groups[0]['label_testlabel1'], None)
+ self.assertEquals(groups[0]['test_label_testlabel1'], None)
self.assertEquals(groups[0]['group_count'], 2)
- self.assertEquals(groups[1]['label_testlabel1'], 'testlabel1')
+ self.assertEquals(groups[1]['test_label_testlabel1'], 'testlabel1')
self.assertEquals(groups[1]['group_count'], 1)
- def test_get_iteration_fields(self):
+ def test_get_iteration_result_fields(self):
num_iterations = rpc_interface.get_num_test_views(
- iteration_fields=['iresult', 'iresult2'])
+ iteration_result_fields=['iresult', 'iresult2'])
self.assertEquals(num_iterations, 2)
iterations = rpc_interface.get_test_views(
- iteration_fields=['iresult', 'iresult2'])
+ iteration_result_fields=['iresult', 'iresult2'])
self.assertEquals(len(iterations), 2)
for index in (0, 1):
self.assertEquals(iterations[index]['test_idx'], 1)
self.assertEquals(iterations[0]['iteration_index'], 1)
- self.assertEquals(iterations[0]['iteration_iresult'], 1)
- self.assertEquals(iterations[0]['iteration_iresult2'], 2)
+ self.assertEquals(iterations[0]['iteration_result_iresult'], 1)
+ self.assertEquals(iterations[0]['iteration_result_iresult2'], 2)
self.assertEquals(iterations[1]['iteration_index'], 2)
- self.assertEquals(iterations[1]['iteration_iresult'], 3)
- self.assertEquals(iterations[1]['iteration_iresult2'], 4)
+ self.assertEquals(iterations[1]['iteration_result_iresult'], 3)
+ self.assertEquals(iterations[1]['iteration_result_iresult2'], 4)
- def test_filtering_on_iteration_fields(self):
+ def test_filtering_on_iteration_result_fields(self):
iterations = rpc_interface.get_test_views(
- extra_where='iteration_iresult.value = 1',
- iteration_fields=['iresult'])
+ extra_where='iteration_result_iresult.value = 1',
+ iteration_result_fields=['iresult'])
self.assertEquals(len(iterations), 1)
- def test_grouping_with_iteration_fields(self):
- num_groups = rpc_interface.get_num_groups(['iteration_iresult'],
- iteration_fields=['iresult'])
+ def test_grouping_with_iteration_result_fields(self):
+ num_groups = rpc_interface.get_num_groups(
+ ['iteration_result_iresult'],
+ iteration_result_fields=['iresult'])
self.assertEquals(num_groups, 2)
- counts = rpc_interface.get_group_counts(['iteration_iresult'],
- iteration_fields=['iresult'])
+ counts = rpc_interface.get_group_counts(
+ ['iteration_result_iresult'],
+ iteration_result_fields=['iresult'])
groups = counts['groups']
self.assertEquals(len(groups), 2)
- self.assertEquals(groups[0]['iteration_iresult'], 1)
+ self.assertEquals(groups[0]['iteration_result_iresult'], 1)
self.assertEquals(groups[0]['group_count'], 1)
- self.assertEquals(groups[1]['iteration_iresult'], 3)
+ self.assertEquals(groups[1]['iteration_result_iresult'], 3)
self.assertEquals(groups[1]['group_count'], 1)
@@ -584,12 +586,13 @@
# ensure fields with special characters are properly quoted throughout
rpc_interface.add_test_label('hyphen-label')
rpc_interface.get_group_counts(
- ['attribute_hyphen-attr', 'label_hyphen-label',
- 'machine_label_hyphen-label', 'iteration_hyphen-result'],
+ ['test_attribute_hyphen-attr', 'test_label_hyphen-label',
+ 'machine_label_hyphen-label',
+ 'iteration_result_hyphen-result'],
test_attribute_fields=['hyphen-attr'],
test_label_fields=['hyphen-label'],
machine_label_fields=['hyphen-label'],
- iteration_fields=['hyphen-result'])
+ iteration_result_fields=['hyphen-result'])
if __name__ == '__main__':
_______________________________________________
Autotest mailing list
[email protected]
http://test.kernel.org/cgi-bin/mailman/listinfo/autotest