| OLD | NEW |
| 1 import re, os | 1 import re, os |
| 2 | 2 |
| 3 from autotest_lib.client.common_lib import utils as common_utils | 3 from autotest_lib.client.common_lib import utils as common_utils |
| 4 from autotest_lib.tko import utils as tko_utils, models, status_lib | 4 from autotest_lib.tko import utils as tko_utils, models, status_lib |
| 5 from autotest_lib.tko.parsers import base | 5 from autotest_lib.tko.parsers import base |
| 6 | 6 |
| 7 | 7 |
| 8 class NoHostnameError(Exception): | 8 class NoHostnameError(Exception): |
| 9 pass | 9 pass |
| 10 | 10 |
| (...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 246 def is_status_line(line): | 246 def is_status_line(line): |
| 247 return re.search(r"^\t*(\S[^\t]*\t){3}", line) is not None | 247 return re.search(r"^\t*(\S[^\t]*\t){3}", line) is not None |
| 248 | 248 |
| 249 | 249 |
| 250 @classmethod | 250 @classmethod |
| 251 def parse_line(cls, line): | 251 def parse_line(cls, line): |
| 252 if not status_line.is_status_line(line): | 252 if not status_line.is_status_line(line): |
| 253 return None | 253 return None |
| 254 indent, line = re.search(r"^(\t*)(.*)$", line, flags=re.DOTALL).groups() | 254 indent, line = re.search(r"^(\t*)(.*)$", line, flags=re.DOTALL).groups() |
| 255 indent = len(indent) | 255 indent = len(indent) |
| 256 line = line.strip() | |
| 257 | 256 |
| 258 # split the line into the fixed and optional fields | 257 # split the line into the fixed and optional fields |
| 259 parts = line.split("\t") | 258 parts = line.rstrip("\n").split("\t") |
| 260 status, subdir, testname = parts[0:3] | |
| 261 reason = parts[-1] | |
| 262 optional_parts = parts[3:-1] | |
| 263 | 259 |
| 264 # all the optional parts should be of the form "key=value" | 260 part_index = 3 |
| 265 assert sum('=' not in part for part in optional_parts) == 0 | 261 status, subdir, testname = parts[0:part_index] |
| 266 optional_fields = dict(part.split("=", 1) | 262 |
| 267 for part in optional_parts) | 263 # all optional parts should be of the form "key=value". once we've found |
| 264 # a non-matching part, treat it and the rest of the parts as the reason. |
| 265 optional_fields = {} |
| 266 while part_index < len(parts): |
| 267 kv = re.search(r"^(\w+)=(.+)", parts[part_index]) |
| 268 if not kv: |
| 269 break |
| 270 |
| 271 optional_fields[kv.group(1)] = kv.group(2) |
| 272 part_index += 1 |
| 273 |
| 274 reason = "\t".join(parts[part_index:]) |
| 268 | 275 |
| 269 # build up a new status_line and return it | 276 # build up a new status_line and return it |
| 270 return cls(indent, status, subdir, testname, reason, | 277 return cls(indent, status, subdir, testname, reason, |
| 271 optional_fields) | 278 optional_fields) |
| 272 | 279 |
| 273 | 280 |
| 274 class parser(base.parser): | 281 class parser(base.parser): |
| 275 @staticmethod | 282 @staticmethod |
| 276 def make_job(dir): | 283 def make_job(dir): |
| 277 return job(dir) | 284 return job(dir) |
| (...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 438 testname = "boot.%d" % boot_count | 445 testname = "boot.%d" % boot_count |
| 439 reason = "machine did not return from reboot" | 446 reason = "machine did not return from reboot" |
| 440 tko_utils.dprint(("Adding: ABORT\nSubdir:----\n" | 447 tko_utils.dprint(("Adding: ABORT\nSubdir:----\n" |
| 441 "Testname:%s\n%s") | 448 "Testname:%s\n%s") |
| 442 % (testname, reason)) | 449 % (testname, reason)) |
| 443 new_test = test.parse_test(self.job, None, testname, | 450 new_test = test.parse_test(self.job, None, testname, |
| 444 "ABORT", reason, | 451 "ABORT", reason, |
| 445 current_kernel, None, None) | 452 current_kernel, None, None) |
| 446 new_tests.append(new_test) | 453 new_tests.append(new_test) |
| 447 yield new_tests | 454 yield new_tests |
| OLD | NEW |