|
| 1 | +import datetime |
| 2 | +import pwd |
| 3 | +import subprocess |
| 4 | + |
| 5 | +from nose.tools import assert_equals |
| 6 | + |
| 7 | +import pyslurm |
| 8 | + |
| 9 | + |
| 10 | +def njobs_sacct_jobs(start, end, username=None): |
| 11 | + """ |
| 12 | + Count the number of jobs reported by sacct |
| 13 | + For comparison with the reults of slurmdb_jobs.get |
| 14 | + """ |
| 15 | + sacctcmd = ['sacct', '-S', start, '-E', end, '-n', '-X'] |
| 16 | + if username is not None: |
| 17 | + sacctcmd.extend(['-u', username]) |
| 18 | + else: |
| 19 | + sacctcmd.append('-a') |
| 20 | + sacct = subprocess.Popen(sacctcmd, |
| 21 | + stdout=subprocess.PIPE, |
| 22 | + stderr=None).communicate() |
| 23 | + return len(sacct[0].splitlines()) |
| 24 | + |
| 25 | + |
| 26 | +def njobs_slurmdb_jobs_get(start, end, uid=None): |
| 27 | + """ |
| 28 | + Count the number of jobs reported by slurmdb |
| 29 | + """ |
| 30 | + if uid is None: |
| 31 | + jobs = pyslurm.slurmdb_jobs().get(starttime=start.encode('utf-8'), |
| 32 | + endtime=end.encode('utf-8')) |
| 33 | + else: |
| 34 | + jobs = pyslurm.slurmdb_jobs().get(starttime=start.encode('utf-8'), |
| 35 | + endtime=end.encode('utf-8'), |
| 36 | + userids=[uid]) |
| 37 | + return len(jobs) |
| 38 | + |
| 39 | + |
| 40 | +def get_user(): |
| 41 | + """ |
| 42 | + Return a list of usernames and their uid numbers |
| 43 | + """ |
| 44 | + users = subprocess.Popen(['squeue', '-O', 'username', '-h'], |
| 45 | + stdout=subprocess.PIPE, |
| 46 | + stderr=None).communicate() |
| 47 | + for username in users[0].splitlines(): |
| 48 | + print(username.decode()) |
| 49 | + uid = pwd.getpwnam("{}".format(username.strip().decode())) |
| 50 | + yield username.strip().decode(), uid.pw_uid |
| 51 | + |
| 52 | + |
| 53 | +def test_slurmdb_jobs_get(): |
| 54 | + """ |
| 55 | + Slurmdb: Compare sacct and slurmdb_jobs.get() for all users |
| 56 | + """ |
| 57 | + starttime = (datetime.datetime.now() - |
| 58 | + datetime.timedelta(days=2)).strftime("%Y-%m-%dT00:00:00") |
| 59 | + endtime = (datetime.datetime.now() - |
| 60 | + datetime.timedelta(days=1)).strftime("%Y-%m-%dT00:00:00") |
| 61 | + njobs_pyslurm = njobs_slurmdb_jobs_get(starttime, endtime) |
| 62 | + njobs_sacct = njobs_sacct_jobs(starttime, endtime) |
| 63 | + assert_equals(njobs_pyslurm, njobs_sacct) |
| 64 | + |
| 65 | + |
| 66 | +def test_slurmdb_jobs_get_byuser(): |
| 67 | + """ |
| 68 | + Slurmdb: Compare sacct and slurmdb_jobs.get() for individual users |
| 69 | + """ |
| 70 | + |
| 71 | + userlist = list(get_user()) |
| 72 | + for user in userlist[:10]: |
| 73 | + starttime = (datetime.datetime.now() - |
| 74 | + datetime.timedelta(days=2)).strftime("%Y-%m-%dT00:00:00") |
| 75 | + endtime = (datetime.datetime.now() - |
| 76 | + datetime.timedelta(days=1)).strftime("%Y-%m-%dT00:00:00") |
| 77 | + njobs_pyslurm = njobs_slurmdb_jobs_get(starttime, |
| 78 | + endtime, |
| 79 | + int(user[1])) |
| 80 | + njobs_sacct = njobs_sacct_jobs(starttime, endtime, username=user[0]) |
| 81 | + assert_equals(njobs_pyslurm, njobs_sacct) |
0 commit comments