skipped += [ l for l in lines if l.startswith('SKIP ') ]
return (started, passed, failed, skipped)
+def vm_ready_str(s):
+ return s.startswith("READY") or s.startswith("PASS") or \
+ s.startswith("FAIL") or s.startswith("SKIP")
+
+def vm_read_stdout(vm, i):
+ ready = False
+ try:
+ out = vm['proc'].stdout.read()
+ except:
+ return False
+ logger.debug("VM[%d] stdout.read[%s]" % (i, out))
+ pending = vm['pending'] + out
+ lines = []
+ while True:
+ pos = pending.find('\n')
+ if pos < 0:
+ break
+ line = pending[0:pos].rstrip()
+ pending = pending[(pos + 1):]
+ logger.debug("VM[%d] stdout full line[%s]" % (i, line))
+ if vm_ready_str(line):
+ ready = True
+ vm['out'] += line + '\n'
+ lines.append(line)
+ vm['pending'] = pending
+ return ready
+
def show_progress(scr):
global num_servers
global vm
except:
pass
- try:
- out = vm[i]['proc'].stdout.read()
- vm[i]['out'] += out
- logger.debug("VM[%d] stdout.read[%s]" % (i, out))
- if "READY" in out or "PASS" in out or "FAIL" in out or "SKIP" in out:
- scr.move(i + 1, 10)
- scr.clrtoeol()
- updated = True
- if not tests:
- vm[i]['first_run_done'] = True
- scr.addstr("completed first round")
- logger.info("VM[%d] completed first round" % i)
- continue
- else:
- name = tests.pop(0)
- vm[i]['proc'].stdin.write(name + '\n')
- scr.addstr(name)
- logger.debug("VM[%d] start test %s" % (i, name))
- except:
- pass
+ if vm_read_stdout(vm[i], i):
+ scr.move(i + 1, 10)
+ scr.clrtoeol()
+ updated = True
+ if not tests:
+ vm[i]['first_run_done'] = True
+ scr.addstr("completed first round")
+ logger.info("VM[%d] completed first round" % i)
+ continue
+ else:
+ name = tests.pop(0)
+ vm[i]['proc'].stdin.write(name + '\n')
+ scr.addstr(name)
+ logger.debug("VM[%d] start test %s" % (i, name))
if not first_running and not completed_first_pass:
logger.info("First round of testing completed")
except:
pass
- try:
- ready = False
- if vm[i]['first_run_done']:
- vm[i]['first_run_done'] = False
- ready = True
+ ready = False
+ if vm[i]['first_run_done']:
+ vm[i]['first_run_done'] = False
+ ready = True
+ else:
+ ready = vm_read_stdout(vm[i], i)
+ if ready:
+ scr.move(i + 1, 10)
+ scr.clrtoeol()
+ updated = True
+ if not rerun_tests:
+ vm[i]['proc'].stdin.write('\n')
+ scr.addstr("shutting down")
+ logger.info("VM[%d] shutting down" % i)
else:
- out = vm[i]['proc'].stdout.read()
- vm[i]['out'] += out
- logger.debug("VM[%d] stdout.read[%s]" % (i, out))
- if "READY" in out or "PASS" in out or "FAIL" in out or "SKIP" in out:
- ready = True
- if ready:
- scr.move(i + 1, 10)
- scr.clrtoeol()
- updated = True
- if not rerun_tests:
- vm[i]['proc'].stdin.write('\n')
- scr.addstr("shutting down")
- logger.info("VM[%d] shutting down" % i)
- else:
- name = rerun_tests.pop(0)
- vm[i]['proc'].stdin.write(name + '\n')
- scr.addstr(name + "(*)")
- logger.debug("VM[%d] start test %s (*)" % (i, name))
- except:
- pass
+ name = rerun_tests.pop(0)
+ vm[i]['proc'].stdin.write(name + '\n')
+ scr.addstr(name + "(*)")
+ logger.debug("VM[%d] start test %s (*)" % (i, name))
if not running:
break
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
vm[i]['out'] = ""
+ vm[i]['pending'] = ""
vm[i]['err'] = ""
for stream in [ vm[i]['proc'].stdout, vm[i]['proc'].stderr ]:
fd = stream.fileno()
logger.info("Logs: " + dir + '/' + str(timestamp))
for i in range(0, num_servers):
+ if len(vm[i]['pending']) > 0:
+ logger.info("Unprocessed stdout from VM[%d]: '%s'" %
+ (i, vm[i]['pending']))
log = '{}/{}.srv.{}/console'.format(dir, timestamp, i + 1)
with open(log, 'r') as f:
if "Kernel panic" in f.read():