def setUp(self): tko_patches = [] tko_patches.append(models.patch('New spec!', 'Reference?', 123456)) tko_kernel = models.kernel('My Computer', tko_patches, '1234567') tko_time = datetime.now() tko_job = models.job('/tmp/', 'autotest', 'test', 'My Computer', tko_time, tko_time, tko_time, 'root', 'www', 'No one', tko_time, {'1+1': 2}) tko_iteration = models.iteration(0, {'2+2': 4, '3+3': 6}, {'4+4': 8, '5+5': 10, '6+6': 12}) tko_labels = ['unittest', 'dummy test', 'autotest'] tko_test = models.test('/tmp/', 'mocktest', 'Completed', 'N/A', tko_kernel, 'My Computer', tko_time, tko_time, [tko_iteration, tko_iteration, tko_iteration], {'abc': 'def'}, tko_labels) self.tko_job = tko_job self.tko_job.tests = [tko_test, tko_test, tko_test] self.pb_job = tko_pb2.Job() self.tag = '1-abc./.' self.expected_afe_job_id = '1' js = job_serializer.JobSerializer() js.set_pb_job(self.tko_job, self.pb_job, self.tag)
def setUp(self): super(ReadBackGetterTest, self).setUp() temp_binary = NamedTemporaryFile(mode='wb') try: temp_binary.write(self.pb_job.SerializeToString()) temp_binary.flush() js = job_serializer.JobSerializer() self.from_pb_job = js.deserialize_from_binary(temp_binary.name) finally: temp_binary.close()
def parse_one(db, jobname, path, reparse, mail_on_failure): """ Parse a single job. Optionally send email on failure. """ tko_utils.dprint("\nScanning %s (%s)" % (jobname, path)) old_job_idx = db.find_job(jobname) # old tests is a dict from tuple (test_name, subdir) to test_idx old_tests = {} if old_job_idx is not None: if not reparse: tko_utils.dprint("! Job is already parsed, done") return raw_old_tests = db.select("test_idx,subdir,test", "tko_tests", {"job_idx": old_job_idx}) if raw_old_tests: old_tests = dict(((test, subdir), test_idx) for test_idx, subdir, test in raw_old_tests) # look up the status version job_keyval = models.job.read_keyval(path) status_version = job_keyval.get("status_version", 0) # parse out the job parser = status_lib.parser(status_version) job = parser.make_job(path) status_log = os.path.join(path, "status.log") if not os.path.exists(status_log): status_log = os.path.join(path, "status") if not os.path.exists(status_log): tko_utils.dprint("! Unable to parse job, no status file") return # parse the status logs tko_utils.dprint("+ Parsing dir=%s, jobname=%s" % (path, jobname)) status_lines = open(status_log).readlines() parser.start(job) tests = parser.end(status_lines) # parser.end can return the same object multiple times, so filter out dups job.tests = [] already_added = set() for test in tests: if test not in already_added: already_added.add(test) job.tests.append(test) # try and port test_idx over from the old tests, but if old tests stop # matching up with new ones just give up if reparse and old_job_idx is not None: job.index = old_job_idx for test in job.tests: test_idx = old_tests.pop((test.testname, test.subdir), None) if test_idx is not None: test.test_idx = test_idx else: tko_utils.dprint("! Reparse returned new test " "testname=%r subdir=%r" % (test.testname, test.subdir)) for test_idx in old_tests.itervalues(): where = {'test_idx': test_idx} db.delete('tko_iteration_result', where) db.delete('tko_iteration_attributes', where) db.delete('tko_test_attributes', where) db.delete('tko_test_labels_tests', {'test_id': test_idx}) db.delete('tko_tests', where) # check for failures message_lines = [""] for test in job.tests: if not test.subdir: continue tko_utils.dprint("* testname, status, reason: %s %s %s" % (test.subdir, test.status, test.reason)) if test.status in ("FAIL", "WARN"): message_lines.append( format_failure_message(jobname, test.kernel.base, test.subdir, test.status, test.reason)) message = "\n".join(message_lines) # send out a email report of failure if len(message) > 2 and mail_on_failure: tko_utils.dprint("Sending email report of failure on %s to %s" % (jobname, job.user)) mailfailure(jobname, job, message) # write the job into the database db.insert_job(jobname, job) # Serializing job into a binary file try: from autotest.tko import tko_pb2 from autotest.tko import job_serializer serializer = job_serializer.JobSerializer() binary_file_name = os.path.join(path, "job.serialize") serializer.serialize_to_binary(job, jobname, binary_file_name) if reparse: site_export_file = "autotest.tko.site_export" site_export = utils.import_site_function(__file__, site_export_file, "site_export", _site_export_dummy) site_export(binary_file_name) except ImportError: tko_utils.dprint("DEBUG: tko_pb2.py doesn't exist. Create by " "compiling tko/tko.proto.") db.commit()