mbligh | 2e4e5df | 2007-11-05 17:22:46 +0000 | [diff] [blame] | 1 | #!/usr/bin/python |
| 2 | |
| 3 | """ |
| 4 | Selects all rows and columns that satisfy the condition specified |
| 5 | and draws the matrix. There is a seperate SQL query made for every (x,y) |
| 6 | in the matrix. |
| 7 | """ |
| 8 | |
| 9 | |
| 10 | print "Content-type: text/html\n" |
| 11 | import cgi, cgitb, re |
mbligh | a426693 | 2007-11-05 18:12:16 +0000 | [diff] [blame] | 12 | import sys, os |
mbligh | b180f6c | 2008-01-04 20:24:41 +0000 | [diff] [blame] | 13 | import urllib |
mbligh | 2e4e5df | 2007-11-05 17:22:46 +0000 | [diff] [blame] | 14 | |
| 15 | tko = os.path.dirname(os.path.realpath(os.path.abspath(sys.argv[0]))) |
| 16 | sys.path.insert(0, tko) |
| 17 | |
mbligh | 2b67253 | 2007-11-05 19:24:51 +0000 | [diff] [blame] | 18 | import display, frontend, db, query_lib |
mbligh | 12eebfa | 2008-01-03 02:01:53 +0000 | [diff] [blame] | 19 | client_bin = os.path.abspath(os.path.join(tko, '../client/bin')) |
| 20 | sys.path.insert(0, client_bin) |
| 21 | import kernel_versions |
| 22 | |
mbligh | 2e4e5df | 2007-11-05 17:22:46 +0000 | [diff] [blame] | 23 | |
mbligh | 190a81d | 2007-11-05 20:40:38 +0000 | [diff] [blame] | 24 | html_header = """\ |
| 25 | <form action="compose_query.cgi" method="get"> |
| 26 | <table border="0"> |
| 27 | <tr> |
| 28 | <td>Column: </td> |
| 29 | <td>Row: </td> |
| 30 | <td>Condition: </td> |
| 31 | <td align="center"><a href="index.html">Help</a></td> |
| 32 | </tr> |
| 33 | <tr> |
| 34 | <td> |
| 35 | <SELECT NAME="columns"> |
| 36 | %s |
| 37 | </SELECT> |
| 38 | </td> |
| 39 | <td> |
| 40 | <SELECT NAME="rows"> |
| 41 | %s |
| 42 | </SELECT> |
| 43 | </td> |
| 44 | <td> |
mbligh | 12eebfa | 2008-01-03 02:01:53 +0000 | [diff] [blame] | 45 | <input type="text" name="condition" size="30" maxlength="200" value="%s"> |
mbligh | 190a81d | 2007-11-05 20:40:38 +0000 | [diff] [blame] | 46 | <input type="hidden" name="title" value="Report"> |
| 47 | </td> |
| 48 | <td align="center"><input type="submit" value="Submit"> |
| 49 | </td> |
| 50 | </tr> |
| 51 | </table> |
| 52 | </form> |
| 53 | """ |
| 54 | |
mbligh | 12eebfa | 2008-01-03 02:01:53 +0000 | [diff] [blame] | 55 | |
mbligh | 5dd503b | 2008-01-03 16:35:27 +0000 | [diff] [blame] | 56 | next_field = { |
| 57 | 'machine_group': 'hostname', |
| 58 | 'hostname': 'tag', |
| 59 | 'tag': 'tag', |
| 60 | |
| 61 | 'kernel': 'test', |
mbligh | 439661b | 2008-02-19 15:57:53 +0000 | [diff] [blame^] | 62 | 'test': 'test', |
mbligh | 5dd503b | 2008-01-03 16:35:27 +0000 | [diff] [blame] | 63 | 'label': 'label', |
| 64 | |
| 65 | 'reason': 'reason', |
| 66 | 'user': 'user', |
| 67 | 'status': 'status', |
| 68 | } |
| 69 | |
| 70 | |
mbligh | 12eebfa | 2008-01-03 02:01:53 +0000 | [diff] [blame] | 71 | |
| 72 | def parse_field(form, form_field, field_default): |
| 73 | if not form_field in form: |
| 74 | return field_default |
| 75 | field_input = form[form_field].value.lower() |
mbligh | 2ba3e73 | 2008-01-16 01:30:19 +0000 | [diff] [blame] | 76 | if field_input and field_input in frontend.test_view_field_dict: |
mbligh | 12eebfa | 2008-01-03 02:01:53 +0000 | [diff] [blame] | 77 | return field_input |
| 78 | return field_default |
| 79 | |
| 80 | |
| 81 | def parse_condition(form, form_field, field_default): |
| 82 | if not form_field in form: |
| 83 | return field_default |
| 84 | return form[form_field].value |
| 85 | |
| 86 | |
| 87 | form = cgi.FieldStorage() |
mbligh | 2ba3e73 | 2008-01-16 01:30:19 +0000 | [diff] [blame] | 88 | row = parse_field(form, 'rows', 'kernel') |
| 89 | column = parse_field(form, 'columns', 'machine_group') |
mbligh | 12eebfa | 2008-01-03 02:01:53 +0000 | [diff] [blame] | 90 | condition_field = parse_condition(form, 'condition', '') |
mbligh | 439661b | 2008-02-19 15:57:53 +0000 | [diff] [blame^] | 91 | ## caller can specify rows and columns that shall be included into the report |
| 92 | ## regardless of whether actual test data is available yet |
| 93 | force_row_field = parse_condition(form,'force_row','') |
| 94 | force_column_field = parse_condition(form,'force_column','') |
mbligh | 190a81d | 2007-11-05 20:40:38 +0000 | [diff] [blame] | 95 | |
mbligh | 439661b | 2008-02-19 15:57:53 +0000 | [diff] [blame^] | 96 | def split_forced_fields(force_field): |
| 97 | if force_field: |
| 98 | return force_field.split() |
| 99 | else: |
| 100 | return [] |
| 101 | |
| 102 | force_row = split_forced_fields(force_row_field) |
| 103 | force_column = split_forced_fields(force_column_field) |
| 104 | |
mbligh | 2e4e5df | 2007-11-05 17:22:46 +0000 | [diff] [blame] | 105 | cgitb.enable() |
| 106 | db = db.db() |
| 107 | |
mbligh | 12eebfa | 2008-01-03 02:01:53 +0000 | [diff] [blame] | 108 | |
mbligh | 2ba3e73 | 2008-01-16 01:30:19 +0000 | [diff] [blame] | 109 | def construct_link(x, y): |
| 110 | next_row = row |
| 111 | next_column = column |
mbligh | 5dd503b | 2008-01-03 16:35:27 +0000 | [diff] [blame] | 112 | condition_list = [] |
| 113 | if condition_field != '': |
| 114 | condition_list.append(condition_field) |
mbligh | 2ba3e73 | 2008-01-16 01:30:19 +0000 | [diff] [blame] | 115 | if y: |
| 116 | next_row = next_field[row] |
| 117 | condition_list.append("%s='%s'" % (row, y)) |
| 118 | if x: |
| 119 | next_column = next_field[column] |
| 120 | condition_list.append("%s='%s'" % (column, x)) |
mbligh | b180f6c | 2008-01-04 20:24:41 +0000 | [diff] [blame] | 121 | next_condition = '&'.join(condition_list) |
| 122 | return 'compose_query.cgi?' + urllib.urlencode({'columns': next_column, |
| 123 | 'rows': next_row, 'condition': next_condition}) |
mbligh | 5dd503b | 2008-01-03 16:35:27 +0000 | [diff] [blame] | 124 | |
| 125 | |
mbligh | 12eebfa | 2008-01-03 02:01:53 +0000 | [diff] [blame] | 126 | def create_select_options(selected_val): |
mbligh | 190a81d | 2007-11-05 20:40:38 +0000 | [diff] [blame] | 127 | ret = "" |
mbligh | 190a81d | 2007-11-05 20:40:38 +0000 | [diff] [blame] | 128 | |
mbligh | 2ba3e73 | 2008-01-16 01:30:19 +0000 | [diff] [blame] | 129 | for option in sorted(frontend.test_view_field_dict.keys()): |
mbligh | 190a81d | 2007-11-05 20:40:38 +0000 | [diff] [blame] | 130 | if selected_val == option: |
| 131 | selected = " SELECTED" |
| 132 | else: |
| 133 | selected = "" |
| 134 | |
mbligh | 2ba3e73 | 2008-01-16 01:30:19 +0000 | [diff] [blame] | 135 | ret += '<OPTION VALUE="%s"%s>%s</OPTION>\n' % \ |
| 136 | (option, selected, option) |
mbligh | 190a81d | 2007-11-05 20:40:38 +0000 | [diff] [blame] | 137 | |
| 138 | return ret |
| 139 | |
| 140 | |
mbligh | 439661b | 2008-02-19 15:57:53 +0000 | [diff] [blame^] | 141 | def insert_break_into_kernel_name(kernel_name): |
| 142 | ## insert <br> after each / in kernel name |
| 143 | ## but spare consequtive // |
| 144 | |
| 145 | ## temporary stubed |
| 146 | #kernel_name = kernel_name.replace('//',';;') |
| 147 | #kernel_name = kernel_name.replace('/','/<br>') |
| 148 | #kernel_name = kernel_name.replace(';;','//') |
| 149 | return kernel_name |
| 150 | |
| 151 | |
mbligh | 12eebfa | 2008-01-03 02:01:53 +0000 | [diff] [blame] | 152 | def gen_matrix(): |
mbligh | 12eebfa | 2008-01-03 02:01:53 +0000 | [diff] [blame] | 153 | where = None |
| 154 | if condition_field.strip() != '': |
| 155 | where = query_lib.parse_scrub_and_gen_condition( |
mbligh | 2ba3e73 | 2008-01-16 01:30:19 +0000 | [diff] [blame] | 156 | condition_field, frontend.test_view_field_dict) |
mbligh | 12eebfa | 2008-01-03 02:01:53 +0000 | [diff] [blame] | 157 | print "<!-- where clause: %s -->" % (where,) |
mbligh | 2e4e5df | 2007-11-05 17:22:46 +0000 | [diff] [blame] | 158 | |
mbligh | 2ba3e73 | 2008-01-16 01:30:19 +0000 | [diff] [blame] | 159 | test_data = frontend.get_matrix_data(db, column, row, where) |
mbligh | 439661b | 2008-02-19 15:57:53 +0000 | [diff] [blame^] | 160 | |
| 161 | for f_row in force_row: |
| 162 | if not f_row in test_data.y_values: |
| 163 | test_data.y_values.append(f_row) |
| 164 | for f_column in force_column: |
| 165 | if not f_column in test_data.x_values: |
| 166 | test_data.x_values.append(f_column) |
mbligh | 2e4e5df | 2007-11-05 17:22:46 +0000 | [diff] [blame] | 167 | |
mbligh | 2ba3e73 | 2008-01-16 01:30:19 +0000 | [diff] [blame] | 168 | if not test_data.y_values: |
mbligh | 12eebfa | 2008-01-03 02:01:53 +0000 | [diff] [blame] | 169 | msg = "There are no results for this query (yet?)." |
| 170 | return [[display.box(msg)]] |
mbligh | 2e4e5df | 2007-11-05 17:22:46 +0000 | [diff] [blame] | 171 | |
mbligh | 5dd503b | 2008-01-03 16:35:27 +0000 | [diff] [blame] | 172 | link = 'compose_query.cgi?columns=%s&rows=%s&condition=%s' % ( |
mbligh | 2ba3e73 | 2008-01-16 01:30:19 +0000 | [diff] [blame] | 173 | row, column, condition_field) |
mbligh | 5dd503b | 2008-01-03 16:35:27 +0000 | [diff] [blame] | 174 | header_row = [display.box("<center>(Flip Axis)</center>", link=link)] |
| 175 | |
mbligh | 2ba3e73 | 2008-01-16 01:30:19 +0000 | [diff] [blame] | 176 | for x in test_data.x_values: |
mbligh | 439661b | 2008-02-19 15:57:53 +0000 | [diff] [blame^] | 177 | if column == 'kernel': |
| 178 | x_br = insert_break_into_kernel_name(x) |
| 179 | else: |
| 180 | x_br = x |
mbligh | 2ba3e73 | 2008-01-16 01:30:19 +0000 | [diff] [blame] | 181 | link = construct_link(x, None) |
mbligh | 439661b | 2008-02-19 15:57:53 +0000 | [diff] [blame^] | 182 | header_row.append(display.box(x_br, header=True, link=link)) |
mbligh | 2e4e5df | 2007-11-05 17:22:46 +0000 | [diff] [blame] | 183 | |
| 184 | matrix = [header_row] |
mbligh | 2ba3e73 | 2008-01-16 01:30:19 +0000 | [diff] [blame] | 185 | for y in test_data.y_values: |
mbligh | 439661b | 2008-02-19 15:57:53 +0000 | [diff] [blame^] | 186 | if row == 'kernel': |
| 187 | y_br = insert_break_into_kernel_name(y) |
| 188 | else: |
| 189 | y_br = y |
mbligh | 2ba3e73 | 2008-01-16 01:30:19 +0000 | [diff] [blame] | 190 | link = construct_link(None, y) |
mbligh | 439661b | 2008-02-19 15:57:53 +0000 | [diff] [blame^] | 191 | cur_row = [display.box(y_br, header=True, link=link)] |
mbligh | 2ba3e73 | 2008-01-16 01:30:19 +0000 | [diff] [blame] | 192 | for x in test_data.x_values: |
mbligh | 12eebfa | 2008-01-03 02:01:53 +0000 | [diff] [blame] | 193 | try: |
mbligh | 2ba3e73 | 2008-01-16 01:30:19 +0000 | [diff] [blame] | 194 | box_data = test_data.data[x][y].status_count |
mbligh | 12eebfa | 2008-01-03 02:01:53 +0000 | [diff] [blame] | 195 | except: |
| 196 | cur_row.append(display.box(None, None)) |
| 197 | continue |
mbligh | 2ba3e73 | 2008-01-16 01:30:19 +0000 | [diff] [blame] | 198 | job_tag = test_data.data[x][y].job_tag |
mbligh | 5dd503b | 2008-01-03 16:35:27 +0000 | [diff] [blame] | 199 | if job_tag: |
| 200 | link = '/results/%s/' % job_tag |
mbligh | 439661b | 2008-02-19 15:57:53 +0000 | [diff] [blame^] | 201 | if (row == 'test' and |
| 202 | not 'boot' in y and |
| 203 | not 'build' in y and |
| 204 | not 'install' in y ): |
| 205 | link += y + '/' |
| 206 | if (column == 'test' and |
| 207 | not 'boot' in x and |
| 208 | not 'build' in x and |
| 209 | not 'install' in x): |
| 210 | link += x + '/' |
mbligh | 5dd503b | 2008-01-03 16:35:27 +0000 | [diff] [blame] | 211 | else: |
mbligh | 2ba3e73 | 2008-01-16 01:30:19 +0000 | [diff] [blame] | 212 | link = construct_link(x, y) |
mbligh | 12eebfa | 2008-01-03 02:01:53 +0000 | [diff] [blame] | 213 | cur_row.append(display.status_precounted_box(db, |
mbligh | 5dd503b | 2008-01-03 16:35:27 +0000 | [diff] [blame] | 214 | box_data, |
| 215 | link)) |
mbligh | 12eebfa | 2008-01-03 02:01:53 +0000 | [diff] [blame] | 216 | matrix.append(cur_row) |
mbligh | 2e4e5df | 2007-11-05 17:22:46 +0000 | [diff] [blame] | 217 | |
mbligh | 12eebfa | 2008-01-03 02:01:53 +0000 | [diff] [blame] | 218 | return matrix |
mbligh | 2b67253 | 2007-11-05 19:24:51 +0000 | [diff] [blame] | 219 | |
mbligh | 2b67253 | 2007-11-05 19:24:51 +0000 | [diff] [blame] | 220 | |
mbligh | 12eebfa | 2008-01-03 02:01:53 +0000 | [diff] [blame] | 221 | def main(): |
mbligh | 190a81d | 2007-11-05 20:40:38 +0000 | [diff] [blame] | 222 | # create the actual page |
mbligh | 190a81d | 2007-11-05 20:40:38 +0000 | [diff] [blame] | 223 | print '<html><head><title>' |
| 224 | print 'Filtered Autotest Results' |
| 225 | print '</title></head><body>' |
mbligh | 1467162 | 2008-01-11 16:49:54 +0000 | [diff] [blame] | 226 | display.print_main_header() |
mbligh | 2ba3e73 | 2008-01-16 01:30:19 +0000 | [diff] [blame] | 227 | print html_header % (create_select_options(column), |
| 228 | create_select_options(row), |
mbligh | 12eebfa | 2008-01-03 02:01:53 +0000 | [diff] [blame] | 229 | condition_field) |
mbligh | 439661b | 2008-02-19 15:57:53 +0000 | [diff] [blame^] | 230 | print display.color_keys_row() |
mbligh | 12eebfa | 2008-01-03 02:01:53 +0000 | [diff] [blame] | 231 | display.print_table(gen_matrix()) |
mbligh | 439661b | 2008-02-19 15:57:53 +0000 | [diff] [blame^] | 232 | print display.color_keys_row() |
mbligh | 190a81d | 2007-11-05 20:40:38 +0000 | [diff] [blame] | 233 | print '</body></html>' |
mbligh | 2e4e5df | 2007-11-05 17:22:46 +0000 | [diff] [blame] | 234 | |
| 235 | |
| 236 | main() |