1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
|
#!/usr/bin/env python3
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):
# check directives
try:
if args['directives'] is not None:
for d in args['directives']:
# these are each an info dict
if "pmix" not in d['key']:
# we do not support such directives - see if
# it is required
try:
if d['flags'] & PMIX_INFO_REQD:
# return an error
return PMIX_ERR_NOT_SUPPORTED
except:
#it can be ignored
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)
# get our environment as a base
env = os.environ.copy()
# register an nspace for the client app
(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))
# register a client
uid = os.getuid()
gid = os.getgid()
rc = foo.register_client({'nspace':"testnspace", 'rank':0}, uid, gid)
print("RegClient ", foo.error_string(rc))
# setup the fork
rc = foo.setup_fork({'nspace':"testnspace", 'rank':0}, env)
print("SetupFrk", foo.error_string(rc))
# setup the client argv
args = ["./client.py"]
# open a subprocess with stdout and stderr
# as distinct pipes so we can capture their
# output as the process runs
p = subprocess.Popen(args, env=env,
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
# define storage to catch the output
stdout = []
stderr = []
# loop until the pipes close
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 the data
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()
|