def show_individual(): """Show individual job details""" all_jobs = get_jobs_dict() jobid_ok = [] # make valid job id list if go.options.jobs is not None: for jobdescr in go.options.jobs: reg = re.compile(r'' + jobdescr) for jobid in all_jobs.keys(): if reg.search(jobid) and jobid not in jobid_ok: jobid_ok.append(jobid) # filter out jobs for jobid in all_jobs.keys(): if jobid not in jobid_ok: all_jobs.pop(jobid) # do something if go.options.show: if 'nodes' in go.options.show: # show the unqiue nodes, comma separated nodes = set() for job in all_jobs.values(): if 'exec_hosts' in job['derived']: nodes.update(job['derived']['exec_hosts'].keys()) print "Nodes: %s" % ' '.join(nodes)
def show_individual(): """Show individual job details""" all_jobs = get_jobs_dict() jobid_ok = [] # make valid job id list if go.options.jobs is not None: for jobdescr in go.options.jobs: reg = re.compile(r'' + jobdescr) for jobid in all_jobs.keys(): if reg.search(jobid) and jobid not in jobid_ok: jobid_ok.append(jobid) # filter out jobs for jobid in all_jobs.keys(): if jobid not in jobid_ok: all_jobs.pop(jobid) # do something if go.options.show: if 'nodes' in go.options.show: # show the unqiue nodes, comma separated nodes = set() for job in all_jobs.values(): if 'exec_hosts' in job['derived']: nodes.update(job['derived']['exec_hosts'].keys()) print "Nodes: %s" % ' '.join(nodes)
def test_get_jobs_dict(self): """Test get_jobs_dict""" # output from # python -c 'import pprint;from vsc.jobs.pbs.jobs import get_jobs;a={};eval("a.update(%s)" % get_jobs());pprint.pprint(a)' # The jobdata however should be PBS Query instances, and get_jobs_dict uses get_nodes() method call testdata = os.path.join(os.path.dirname(__file__), 'testpbs', 'pbs_get_jobs_data_master21_t51') jobs = {} eval("jobs.update(%s)" % open(testdata).read().replace("\n",'')) with patch('vsc.jobs.pbs.jobs.get_jobs', return_value=wrap_jobdata(jobs)): res = get_jobs_dict() print res sids = sorted(res.keys()) self.assertEqual(len(res), 6, msg='6 jobs found') self.assertEqual([res[x]['job_state'][0] for x in sids], ['R', 'R', 'Q', 'Q', 'Q', 'Q'], msg='jobs in expected states') self.assertEqual(res[sids[0]]['derived'], { 'cores': 20, 'exec_hosts': {'node2617.swalot.gent.vsc': 1}, 'nodes': 1, 'state': 'R', 'totalwalltimesec': 14400, 'used_cput': 6751, 'used_mem': 24045981696, 'used_vmem': 25629622272, 'used_walltime': 344, 'user': '******', }, msg='first job has expected derived data')
def test_get_jobs_dict(self): """Test get_jobs_dict""" # output from # python -c 'import pprint;from vsc.jobs.pbs.jobs import get_jobs;a={};eval("a.update(%s)" % get_jobs());pprint.pprint(a)' # The jobdata however should be PBS Query instances, and get_jobs_dict uses get_nodes() method call testdata = os.path.join(os.path.dirname(__file__), 'testpbs', 'pbs_get_jobs_data_master21_t51') jobs = {} eval("jobs.update(%s)" % open(testdata).read().replace("\n", '')) with patch('vsc.jobs.pbs.jobs.get_jobs', return_value=wrap_jobdata(jobs)): res = get_jobs_dict() print res sids = sorted(res.keys()) self.assertEqual(len(res), 6, msg='6 jobs found') self.assertEqual([res[x]['job_state'][0] for x in sids], ['R', 'R', 'Q', 'Q', 'Q', 'Q'], msg='jobs in expected states') self.assertEqual(res[sids[0]]['derived'], { 'cores': 20, 'exec_hosts': { 'node2617.swalot.gent.vsc': 1 }, 'nodes': 1, 'state': 'R', 'totalwalltimesec': 14400, 'used_cput': 6751, 'used_mem': 24045981696, 'used_vmem': 25629622272, 'used_walltime': 344, 'user': '******', }, msg='first job has expected derived data')
def main(): """Main method""" ns = {} for node, details in get_nodes_dict().items(): derived = details['derived'] if not 'np' in derived: _log.warning('np not in derived from node %s' % node) continue np = derived['np'] if not 'physmem' in derived: _log.warning('physmem not in derived from node %s' % node) continue mem = derived['physmem'] ns[node] = { 'np': np, 'mem': mem, 'avg': int(mem / np), } toomuch = {} MB = 1024 ** 2 for name, details in get_jobs_dict().items(): derived = details['derived'] if not derived['state'] in ('R',): continue if not 'user' in derived: _log.warning("no user in derived job name %s" % name) continue user = derived['user'] if not 'used_mem' in derived: _log.warning("no used_mem in derived job name %s" % name) continue used_mem = derived['used_mem'] if not 'exec_hosts' in derived: _log.warning("no exec_hosts in derived job name %s" % name) continue exec_hosts = derived['exec_hosts'] cores = sum(exec_hosts.values()) used_avg_mem = int(used_mem / cores) for host in exec_hosts.keys(): # more then avg on node? if used_avg_mem > ns[host]['avg']: if not user in toomuch: toomuch[user] = {} if not host in toomuch[user]: toomuch[user][host] = [] toomuch[user][host].append([name, used_avg_mem / MB, ns[host]['avg'] / MB]) users = toomuch.keys() users.sort() txt = [] for user in users: txt.append("%s:" % user) for host, jobs in toomuch[user].items(): txt.append("\t%s:\t%s\n" % (host, ' '.join([str(x) for x in jobs]))) if len(txt) > 0: print "\n".join(txt) else: print "All ok"
if not 'physmem' in derived: _log.warning('physmem not in derived from node %s' % node) continue mem = derived['physmem'] ns[node] = { 'np': np, 'mem': mem, 'avg': int(mem / np), } toomuch = {} MB = 1024 ** 2 for name, details in get_jobs_dict().items(): derived = details['derived'] if not derived['state'] in ('R',): continue if not 'user' in derived: _log.warning("no user in derived job name %s" % name) continue user = derived['user'] if not 'used_mem' in derived: _log.warning("no used_mem in derived job name %s" % name) continue used_mem = derived['used_mem'] if not 'exec_hosts' in derived:
def main(): """Main method""" ns = {} for node, details in get_nodes_dict().items(): derived = details['derived'] if not 'np' in derived: _log.warning('np not in derived from node %s' % node) continue np = derived['np'] if not 'physmem' in derived: _log.warning('physmem not in derived from node %s' % node) continue mem = derived['physmem'] ns[node] = { 'np': np, 'mem': mem, 'avg': int(mem / np), } toomuch = {} MB = 1024**2 for name, details in get_jobs_dict().items(): derived = details['derived'] if not derived['state'] in ('R', ): continue if not 'user' in derived: _log.warning("no user in derived job name %s" % name) continue user = derived['user'] if not 'used_mem' in derived: _log.warning("no used_mem in derived job name %s" % name) continue used_mem = derived['used_mem'] if not 'exec_hosts' in derived: _log.warning("no exec_hosts in derived job name %s" % name) continue exec_hosts = derived['exec_hosts'] cores = sum(exec_hosts.values()) used_avg_mem = int(used_mem / cores) for host in exec_hosts.keys(): # more then avg on node? if used_avg_mem > ns[host]['avg']: if not user in toomuch: toomuch[user] = {} if not host in toomuch[user]: toomuch[user][host] = [] toomuch[user][host].append( [name, used_avg_mem / MB, ns[host]['avg'] / MB]) users = toomuch.keys() users.sort() txt = [] for user in users: txt.append("%s:" % user) for host, jobs in toomuch[user].items(): txt.append("\t%s:\t%s\n" % (host, ' '.join([str(x) for x in jobs]))) if len(txt) > 0: print "\n".join(txt) else: print "All ok"