from pmix import *
import signal, time
import os
import select
import subprocess
global killer
class GracefulKiller:
kill_now = False
def __init__(self):
signal.signal(signal.SIGINT, self.exit_gracefully)
signal.signal(signal.SIGTERM, self.exit_gracefully)
def exit_gracefully(self,signum, frame):
self.kill_now = True
def clientconnected(proc:dict is not None):
print("CLIENT CONNECTED", proc)
return PMIX_SUCCESS
def clientfinalized(proc:dict is not None):
print("CLIENT FINALIZED", proc)
return PMIX_SUCCESS
def clientfence(args:dict is not None):
try:
if args['directives'] is not None:
for d in args['directives']:
if "pmix" not in d['key']:
try:
if d['flags'] & PMIX_INFO_REQD:
return PMIX_ERR_NOT_SUPPORTED
except:
pass
except:
pass
return PMIX_SUCCESS, None
def main():
try:
foo = PMIxServer()
except:
print("FAILED TO CREATE SERVER")
exit(1)
print("Testing server version ", foo.get_version())
args = [{'key':'FOOBAR', 'value':'VAR', 'val_type':PMIX_STRING},
{'key':'BLAST', 'value':7, 'val_type':PMIX_INT32}]
map = {'clientconnected': clientconnected,
'clientfinalized': clientfinalized,
'fencenb': clientfence}
my_result = foo.init(args, map)
print("Testing PMIx_Initialized")
rc = foo.initialized()
print("Initialized: ", rc)
vers = foo.get_version()
print("Version: ", vers)
env = os.environ.copy()
(rc, regex) = foo.generate_regex(["test000","test001","test002"])
(rc, ppn) = foo.generate_ppn(["0,1,2", "3,4,5", "6,7"])
kvals = [{'key':PMIX_NODE_MAP, 'value':regex, 'val_type':PMIX_STRING},
{'key':PMIX_PROC_MAP, 'value':ppn, 'val_type':PMIX_STRING},
{'key':PMIX_UNIV_SIZE, 'value':1, 'val_type':PMIX_UINT32},
{'key':PMIX_JOB_SIZE, 'value':1, 'val_type':PMIX_UINT32}]
print("REGISTERING NSPACE")
rc = foo.register_nspace("testnspace", 1, kvals)
print("RegNspace ", foo.error_string(rc))
uid = os.getuid()
gid = os.getgid()
rc = foo.register_client({'nspace':"testnspace", 'rank':0}, uid, gid)
print("RegClient ", foo.error_string(rc))
rc = foo.setup_fork({'nspace':"testnspace", 'rank':0}, env)
print("SetupFrk", foo.error_string(rc))
args = ["./client.py"]
p = subprocess.Popen(args, env=env,
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout = []
stderr = []
while True:
reads = [p.stdout.fileno(), p.stderr.fileno()]
ret = select.select(reads, [], [])
stdout_done = True
stderr_done = True
for fd in ret[0]:
if fd == p.stdout.fileno():
read = p.stdout.readline()
if read:
read = read.decode('utf-8').rstrip()
print('stdout: ' + read)
stdout_done = False
elif fd == p.stderr.fileno():
read = p.stderr.readline()
if read:
read = read.decode('utf-8').rstrip()
print('stderr: ' + read)
stderr_done = False
if stdout_done and stderr_done:
break
print("FINALIZING")
foo.finalize()
if __name__ == '__main__':
global killer
killer = GracefulKiller()
main()