From 94ccd7823741429509ad1843805fb69bb08749ba Mon Sep 17 00:00:00 2001 From: Kerri Wait <kerri.wait@monash.edu> Date: Mon, 20 Mar 2017 13:12:33 +1100 Subject: [PATCH] Update provision_slurm.py.j2 to fix logic in mk_slurmuser_batch. This previously did not add any users if one user in the list was a member of 'default' --- .../templates/provision_slurm.py.j2 | 30 +++++++++++++------ 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/roles/provision_slurm/templates/provision_slurm.py.j2 b/roles/provision_slurm/templates/provision_slurm.py.j2 index 0d30d93d..467e973c 100644 --- a/roles/provision_slurm/templates/provision_slurm.py.j2 +++ b/roles/provision_slurm/templates/provision_slurm.py.j2 @@ -5,6 +5,7 @@ import os import stat import subprocess + class ldapSearchConfig: def __init__(self): self.ldapserver="" @@ -14,12 +15,13 @@ class ldapSearchConfig: self.searchFilter="" self.cacertfile='' + class genericUser: def __init__(self): self.dn="" self.cn="" self.entry="" - self.uid="" + self.uid="" def get_users(server): @@ -52,14 +54,24 @@ def mk_slurmaccount(acct): else: subprocess.call(["{{ slurm_dir }}/bin/sacctmgr","-i","create","account",acct]) -def mk_slurmuser(user,acct): - p=subprocess.Popen(["{{ slurm_dir }}/bin/sacctmgr","--noheader","list","Association","user=%s"%user,"format=account"],stdout=subprocess.PIPE,stderr=subprocess.PIPE) +def mk_slurmuser_batch(userbatch,acct): + """ + Fetch a list of all accounts associated with users in userbatch, then add + those that aren't a member of acct to acct using sacctmgr. + """ + p=subprocess.Popen(["/opt/slurm-16.05.4/bin/sacctmgr","--noheader","list","Association","user=%s"%userbatch,"format=user,account"],stdout=subprocess.PIPE,stderr=subprocess.PIPE) + (output,error)=p.communicate() - if acct in output.splitlines(): - return - else: - subprocess.call(["{{ slurm_dir }}/bin/sacctmgr","-i","create","user",user,"account=%s"%acct,"DefaultAccount=%s"%acct]) + + userdict = defaultdict(list) + for line in output.splitlines(): + (u,a) = line.split() + userdict[u].append(a) + + newuserbatch = ",".join([ x[0] for x in userdict.items() if acct not in x[1] ]) + if newuserbatch is not None: + subprocess.call(["/opt/slurm-16.05.4/bin/sacctmgr","-i","create","user",newuserbatch,"account=%s"%acct,"DefaultAccount=%s"%acct]) s=ldapSearchConfig() @@ -81,11 +93,11 @@ for user in users: userlist=[] i=i+1 userlist.append(users[user].entry['uid'][0]) + usergrouplist.append(",".join(userlist)) for usergroup in usergrouplist: - try: - mk_slurmuser(usergroup,"default") + mk_slurmuser_batch(usergroup,"default") except: print traceback.format_exc() pass -- GitLab