On Fri, Jun 14, 2024 at 4:48 PM Nicholas Pratte <npra...@iol.unh.edu> wrote: > > Just a small nitpick. Otherwise: > > Reviewed-by: Nicholas Pratte <npra...@iol.unh.edu> > > <snip> > > class QuittableXMLRPCServer(SimpleXMLRPCServer): > > - """Basic XML-RPC server. > > + r"""Basic XML-RPC server. > > > > The server may be augmented by functions serializable by the > > :mod:`marshal` module. > > + > > + Example: > > + :: > > + > > + def hello_world(): > > + # to be sent to the XML-RPC server > > + print("Hello World!") > > + > > + # start the XML-RPC server on the remote node > > + # the example assumes you're already connect to a tg_node > > This just a very small nitpick, but you wrote 'connect' when it should > be 'connected.'
Good catch, I'll fix this. > > > + # this is done by starting a Python shell on the remote node > > + from framework.remote_session import PythonShell > > This comment is related to the one I made above, but maybe you could > move the above comment 'assumes you're already connected to a tg_node' > on this line instead of where it is right now. I had to rescan this a > couple times when reading. Again, this is just an extremely minuscule > nitpick, but I figured I'd bring it up, in any case. I agree when looking at this more in-depth that the order should be swapped, this comment looks like a continuation of the first line, but then there is another just kind of thrown in-between. good catch. > > > + session = tg_node.create_interactive_shell(PythonShell, > > timeout=5, privileged=True) > > + > > + # then importing the modules needed to run the server > > + # and the modules for any functions later added to the server > > + session.send_command("import xmlrpc") > > + session.send_command("from xmlrpc.server import > > SimpleXMLRPCServer") > > + > > + # sending the source code of this class to the Python shell > > + from xmlrpc.server import SimpleXMLRPCServer > > + src = inspect.getsource(QuittableXMLRPCServer) > > + src = "\n".join([l for l in src.splitlines() if not > > l.isspace() and l != ""]) > > + spacing = "\n" * 4 > > + session.send_command(spacing + src + spacing) > > + > > + # then starting the server with: > > + command = "s = QuittableXMLRPCServer(('0.0.0.0', > > {listen_port}));s.serve_forever()" > > + session.send_command(command, "XMLRPC OK") > > + > > + # now the server is running on the remote node and we can add > > functions to it > > + # first connect to the server from the execution node > > + import xmlrpc.client > > + server_url = f"http://{tg_node.config.hostname}:8000" > > + rpc_server_proxy = xmlrpc.client.ServerProxy(server_url) > > + > > + # get the function bytes to send > > + import marshal > > + function_bytes = marshal.dumps(hello_world.__code__) > > + rpc_server_proxy.add_rpc_function(hello_world.__name__, > > function_bytes) > > + > > + # now we can execute the function on the server > > + xmlrpc_binary_recv: xmlrpc.client.Binary = > > rpc_server_proxy.hello_world() > > + print(str(xmlrpc_binary_recv)) > > """ > > > > def __init__(self, *args, **kwargs): > > -- > > 2.45.1 > >