175 lines
3.7 KiB
Python
175 lines
3.7 KiB
Python
import subprocess as sp
|
|
import time
|
|
import select
|
|
import os
|
|
import pwd
|
|
import sys
|
|
import datetime
|
|
import random
|
|
import re
|
|
from threading import Thread
|
|
|
|
tc_logfile = None
|
|
|
|
def log_print(info):
|
|
print(info)
|
|
if tc_logfile != None:
|
|
tc_logfile.write(info + "\n")
|
|
tc_logfile.flush()
|
|
|
|
tc_output_dir=""
|
|
tc_cur_test = ""
|
|
tc_test_id = 0
|
|
|
|
def init(odir = "./results.d/"):
|
|
global tc_output_dir
|
|
tc_output_dir = odir + "_" + datetime.datetime.now().strftime('%Y-%m-%d_%H-%M-%S')
|
|
tc_output_dir = os.path.expanduser(tc_output_dir)
|
|
os.system("mkdir -p " + tc_output_dir)
|
|
global tc_logfile
|
|
tc_logfile = open(tc_output_dir + "/log.txt", "w+")
|
|
|
|
def begin(name):
|
|
global tc_test_id
|
|
global tc_cur_test
|
|
tc_cur_test = name
|
|
tc_test_id += 1
|
|
os.system("mkdir -p " + get_odir())
|
|
log_print("\n===== Test #" + str(tc_test_id) + " - " + tc_cur_test + " started =====")
|
|
|
|
def end():
|
|
global tc_cur_test
|
|
log_print("\n===== Test #" + str(tc_test_id) + " - " + tc_cur_test + " completed =====")
|
|
tc_cur_test = None
|
|
|
|
def get_odir():
|
|
return tc_output_dir + "/" + tc_cur_test
|
|
|
|
SCHED_QUEUE = 1
|
|
SCHED_CPU = 2
|
|
SCHED_BEST = 4
|
|
SCHED_FEAT_WS = 1
|
|
def make_sched_flag(sched, args, feat = 0, fargs = 0):
|
|
return (sched & 0xFF) | (args & 0xFF) << 8 | (feat & 0xFF) << 16 | (fargs & 0xFF) << 24
|
|
|
|
TUNE_RTSHARE = 2
|
|
TUNE_TFREQ = 1
|
|
def make_tune_flag(obj, val):
|
|
return (obj & 0xFFFF) | (val & 0xFFFF) << 16
|
|
|
|
def get_username():
|
|
return pwd.getpwuid( os.getuid() )[0]
|
|
|
|
ssh_param = ""
|
|
def set_ssh_param(para):
|
|
global ssh_param
|
|
ssh_param = para
|
|
|
|
ssh_user = None
|
|
def set_ssh_user(user):
|
|
global ssh_user
|
|
ssh_user = user
|
|
|
|
def remote_exec(srv, cmd, blocking=True, check=True):
|
|
sub = []
|
|
for s in srv:
|
|
p = sp.Popen(["ssh " + ssh_param + " " + ((ssh_user + "@") if ssh_user != None else "") + s + " \"" + cmd +"\""], shell=True, stdout=sp.PIPE, stderr=sp.PIPE)
|
|
sub.append(p)
|
|
|
|
if blocking:
|
|
for p in sub:
|
|
p.wait()
|
|
if check and p.returncode != 0:
|
|
raise Exception("Command failed " + cmd)
|
|
|
|
return sub
|
|
|
|
|
|
def scan_stderr(p, exclude = None):
|
|
for err in p.stderr:
|
|
fail = True
|
|
err = err.decode()
|
|
err = err.strip()
|
|
|
|
# print(err)
|
|
|
|
if len(err) == 0:
|
|
continue
|
|
|
|
if exclude != None:
|
|
for exc in exclude:
|
|
if (exc != None) and (re.match(exc, err) != None):
|
|
fail = False
|
|
break
|
|
|
|
if fail:
|
|
log_print("Error detected: " + err)
|
|
return False
|
|
|
|
return True
|
|
|
|
# stderr threads
|
|
errthr_objs = []
|
|
errthr_sigstop = False
|
|
errthr_failed = False
|
|
|
|
def errthr_get_failed():
|
|
return errthr_failed
|
|
|
|
def thr_check_stderr(p : sp.Popen, exclude):
|
|
# print("thread start!")
|
|
global errthr_failed
|
|
while(not errthr_sigstop):
|
|
if not scan_stderr(p, exclude=exclude):
|
|
errthr_failed = True
|
|
# print("running!")
|
|
time.sleep(0.5 + random.uniform(-0.1, 0.1))
|
|
# print("thread exit!")
|
|
|
|
def errthr_start():
|
|
global errthr_sigstop
|
|
global errthr_failed
|
|
errthr_sigstop = False
|
|
errthr_failed = False
|
|
for thr in errthr_objs:
|
|
thr.start()
|
|
|
|
def errthr_create(cp, exclude = None):
|
|
global errthr_objs
|
|
for p in cp:
|
|
errthr_objs.append(Thread(target = thr_check_stderr, args=(p, exclude)))
|
|
|
|
def errthr_stop():
|
|
global errthr_objs
|
|
global errthr_sigstop
|
|
errthr_sigstop = True
|
|
# print("waiting!")
|
|
for thr in errthr_objs:
|
|
thr.join()
|
|
errthr_objs.clear()
|
|
|
|
def parse_hostfile(fp):
|
|
ret = {}
|
|
fh = open(fp, "r")
|
|
content = fh.readlines()
|
|
fh.close()
|
|
content = [x.strip() for x in content]
|
|
for line in content:
|
|
spl = line.split(" ")
|
|
if len(spl) >= 2:
|
|
ret[spl[0]] = spl[1]
|
|
log_print("Parsed: hostname \"" + spl[0] + "\" -> \"" + spl[1] + "\"")
|
|
return ret
|
|
|
|
def process_hostnames(names, hosts):
|
|
ret = []
|
|
for line in names:
|
|
if line in hosts:
|
|
ret.append(hosts[line])
|
|
else:
|
|
ret.append(line)
|
|
return ret
|
|
|
|
def get_cpuset_core(threads):
|
|
ret = "cpuset -l 0-" + str(threads * 2 - 1) + " "
|
|
return ret |