示例#1
0
	def __init__(self, iterable, length=None, description=""):
		self.iterator = iter(iterable)
		self.len = length if length != None else len(iterable)
		self.description = (description if description == "" else (description+"... "))
		self.current_index = 0
		self.ratio = -1.0
		self.tty_width = tools.get_tty_size()[1]
示例#2
0
 def __init__(self, iterable, length=None, description=""):
     self.iterator = iter(iterable)
     self.len = length if length != None else len(iterable)
     self.description = (description if description == "" else
                         (description + "... "))
     self.current_index = 0
     self.ratio = -1.0
     self.tty_width = tools.get_tty_size()[1]
示例#3
0
def print_qstat_table(args, previous_users=[]):

	# call qstat
	qstat_command = "qstat -u '*' -s prs"
	qstat_output = subprocess.Popen(qstat_command, stdout=subprocess.PIPE, shell=True).communicate()[0].split("\n")[2:]
	qstat_output = [job for job in qstat_output if job != ""]

	# parse output
	parsed_qstat_output = {}
	for job in qstat_output:
		parsed_job = re.match("\s*(?P<jobid>\d+)\s+"+
		                      "(?P<prior>\d+.?\d*)\s+"+
		                      "(?P<name>\S+)\s+"+
		                      "(?P<user>\S+)\s+"+
		                      "(?P<state>\S+)\s+"+
		                      "(?P<start>\d\d/\d\d/\d\d\d\d\s\d\d:\d\d:\d\d)"+
		                      ".*", job).groupdict()
		parsed_qstat_output.setdefault(parsed_job["user"], {}).setdefault(parsed_job["state"], []).append(parsed_job["jobid"])
		parsed_qstat_output.setdefault(parsed_job["user"], {}).setdefault("all", []).append(parsed_job["jobid"])

	# check states
	states = list(set([state for states in [state_jobids.keys() for state_jobids in parsed_qstat_output.values()] for state in states if (not args.simple_mode or state in ['all', 'r'])]))
	sort_state = args.sort_state if args.sort_state in states else states[-1]
	#states.sort(cmp=lambda s1, s2: -1 if sort_state in (s1, s2) else (+1 if "all" in (s1, s2) else cmp(s1, s2)))
	states.sort()
	states.append(states.pop(states.index("all")))
	states.insert(0, states.pop(states.index(sort_state)))

	# check users
	users = sorted(parsed_qstat_output.keys(), reverse=True,
	               key=lambda user: len(parsed_qstat_output[user].get(sort_state, [])))
	max_len_users = max([len(user) for user in users])
	tty_width = tools.get_tty_size()[1]

	# get a list of up/down arrow symbols by comparing rank to previous rank
	symbols = []
	for rank, user in enumerate(users):
		# get previous rank
		if user in previous_users:
			previous_rank = previous_users.index(user)
		else:
			previous_rank = -1
		# get symbol according to rank - previous-rank comparison
		if previous_rank == -1:
			symbols += [" "]
		elif rank<previous_rank:
			symbols += ["\033[1;32m%s\033[0m" % u"\u2191".encode('utf8')]
		elif rank>previous_rank:
			symbols += ["\033[1;31m%s\033[0m" % u"\u2193".encode('utf8')]
		else:
			symbols += [" "]

	n_total_jobs = sum([len(state_jobids.get("all", [])) for state_jobids in parsed_qstat_output.values()])
	max_n_jobs = max([len(state_jobids.get("all", [])) for state_jobids in parsed_qstat_output.values()])
	max_n_jobs_len = max(len(str(max_n_jobs)), max([len(s) for s in states]))

	# get length of maximum number of jobs per state (to adjust column width)
	length_dict = {}
	for state in states:
		length_dict[state] = max([len(str(max([len(state_jobids.get(state, [])) for state_jobids in parsed_qstat_output.values()]))), len(state)])

	# format table header
	qstat_table = ((" \033[0;1m%" + ("%d" % (max_len_users + 1)) + "s\033[0m | ") % "User")
	second_line = ("-" * (max_len_users+3))
	for state in states:
		qstat_table += ("\033[0;1m%*s\033[0m | " % (length_dict[state] ,state))
		second_line += "|" + "-" * (length_dict[state] +2)
	second_line += "|"+ ("-" * (tty_width-len(second_line)-1))
	qstat_table += ("\n" + second_line)

	# format table body
	for user, symbol in zip(users, symbols):
		line = (("%" + ("%*d" % (max_n_jobs_len, max_len_users)) + "s | ") % user)
		for state in states:
			line += ("%*d | " % (length_dict[state], len(parsed_qstat_output[user].get(state, []))) )
		line += progress_bar(len(parsed_qstat_output[user].get("r", [])),
		                     len(parsed_qstat_output[user].get("all", [])),
		                     n_total_jobs if args.norm_total_jobs else max_n_jobs,
		                     tty_width-len(line)-2,
		                     this_user=(user == getpass.getuser()))
		qstat_table += ("\n" + symbol + " " + (("\033[0;31;47m"+line+"\033[0m") if user == getpass.getuser() else line))

	# output table
	if args.continuous_mode != 0:
		sys.stdout.write("\033[?1049h\033[2J") # switch to alternative buffer, like e.g. screen does
	sys.stdout.write(qstat_table)
	sys.stdout.flush()
	return users
示例#4
0
def print_stats_table(args, previous_users=[]):

    # call stats
    stats_command = "qstat -u '*' -s prs" if args.qstat else "condor_q -global -allusers -autoformat ClusterId Owner JobStatus"
    stats_output = subprocess.Popen(
        stats_command, stdout=subprocess.PIPE,
        shell=True).communicate()[0].split("\n")[2:]
    stats_output = [job for job in stats_output if job != ""]

    stats_regex = ""
    if args.qstat:
        stats_regex = ("\s*(?P<jobid>\d+)\s+" + "(?P<prior>\d+.?\d*)\s+" +
                       "(?P<name>\S+)\s+" + "(?P<user>\S+)\s+" +
                       "(?P<state>\S+)\s+" +
                       "(?P<start>\d\d/\d\d/\d\d\d\d\s\d\d:\d\d:\d\d)" + ".*")
    else:
        stats_regex = ("\s*(?P<jobid>\d+)\s+" + "(?P<user>\S+)\s+" +
                       "(?P<state>\d+)" + ".*")

    # parse output
    parsed_stats_output = {}
    for job in stats_output:
        parsed_job = re.match(stats_regex, job).groupdict()
        state = parsed_job["state"]
        if not args.qstat:
            state = condor_state_string(state)
        parsed_stats_output.setdefault(parsed_job["user"], {}).setdefault(
            state, []).append(parsed_job["jobid"])
        parsed_stats_output.setdefault(parsed_job["user"], {}).setdefault(
            "all", []).append(parsed_job["jobid"])

    # check states
    states = list(
        set([
            state for states in [
                state_jobids.keys()
                for state_jobids in parsed_stats_output.values()
            ] for state in states
            if (not args.simple_mode or state in ['all', 'r'])
        ]))
    sort_state = args.sort_state if args.sort_state in states else states[-1]
    #states.sort(cmp=lambda s1, s2: -1 if sort_state in (s1, s2) else (+1 if "all" in (s1, s2) else cmp(s1, s2)))
    states.sort()
    states.append(states.pop(states.index("all")))
    states.insert(0, states.pop(states.index(sort_state)))

    # check users
    users = sorted(
        parsed_stats_output.keys(),
        reverse=True,
        key=lambda user: len(parsed_stats_output[user].get(sort_state, [])))
    max_len_users = max([len(user) for user in users])
    tty_width = tools.get_tty_size()[1]

    # get a list of up/down arrow symbols by comparing rank to previous rank
    symbols = []
    for rank, user in enumerate(users):
        # get previous rank
        if user in previous_users:
            previous_rank = previous_users.index(user)
        else:
            previous_rank = -1
        # get symbol according to rank - previous-rank comparison
        if previous_rank == -1:
            symbols += [" "]
        elif rank < previous_rank:
            symbols += ["\033[1;32m%s\033[0m" % u"\u2191".encode('utf8')]
        elif rank > previous_rank:
            symbols += ["\033[1;31m%s\033[0m" % u"\u2193".encode('utf8')]
        else:
            symbols += [" "]

    n_total_jobs = sum([
        len(state_jobids.get("all", []))
        for state_jobids in parsed_stats_output.values()
    ])
    max_n_jobs = max([
        len(state_jobids.get("all", []))
        for state_jobids in parsed_stats_output.values()
    ])
    max_n_jobs_len = max(len(str(max_n_jobs)), max([len(s) for s in states]))

    # get length of maximum number of jobs per state (to adjust column width)
    length_dict = {}
    for state in states:
        length_dict[state] = max([
            len(
                str(
                    max([
                        len(state_jobids.get(state, []))
                        for state_jobids in parsed_stats_output.values()
                    ]))),
            len(state)
        ])

    # format table header
    stats_table = ((" \033[0;1m%" +
                    ("%d" % (max_len_users + 1)) + "s\033[0m | ") % "User")
    second_line = ("-" * (max_len_users + 3))
    for state in states:
        stats_table += ("\033[0;1m%*s\033[0m | " % (length_dict[state], state))
        second_line += "|" + "-" * (length_dict[state] + 2)
    second_line += "|" + ("-" * (tty_width - len(second_line) - 1))
    stats_table += ("\n" + second_line)

    # format table body
    for user, symbol in zip(users, symbols):
        line = (("%" + ("%*d" % (max_n_jobs_len, max_len_users)) + "s | ") %
                user)
        for state in states:
            line += ("%*d | " %
                     (length_dict[state],
                      len(parsed_stats_output[user].get(state, []))))
        line += progress_bar(
            len(parsed_stats_output[user].get(
                "r", parsed_stats_output[user].get("Running", []))),
            len(parsed_stats_output[user].get("all", [])),
            n_total_jobs if args.norm_total_jobs else max_n_jobs,
            tty_width - len(line) - 2,
            this_user=(user == getpass.getuser()))
        stats_table += ("\n" + symbol + " " +
                        (("\033[0;31;47m" + line +
                          "\033[0m") if user == getpass.getuser() else line))

    # output table
    if args.continuous_mode != 0:
        sys.stdout.write(
            "\033[?1049h\033[2J"
        )  # switch to alternative buffer, like e.g. screen does
    sys.stdout.write(stats_table)
    sys.stdout.flush()
    return users