from cis_interface.drivers.Driver import Driver
from cis_interface.drivers.CommDriver import CommDriver
[docs]class RPCDriver(Driver):
r"""Base class for any driver that requires to access to input & output
queues for RPC type functionality.
Args:
name (str): The name of the message queue set that the driver should
connect to. (name + "_IN" and name + "_OUT")
**kwargs: Additional keyword arguments are passed to parent class.
Attributes:
icomm (:class:`cis_interface.drivers.CommDriver`): Driver for the input
message queue.
ocomm (:class:`cis_interface.drivers.CommDriver`): Driver for the output
message ueue.
"""
def __init__(self, name, args=None, **kwargs):
super(RPCDriver, self).__init__(name, **kwargs)
self.debug('')
self.icomm = CommDriver(name, direction='recv', **kwargs)
self.ocomm = CommDriver(name, direction='send', **kwargs)
out = {}
out.update(self.icomm.env)
out.update(self.ocomm.env)
self.env = out
@property
def comms_open(self):
r"""bool: True if both input and output comms open."""
with self.lock:
return (self.icomm.is_comm_open and self.ocomm.is_comm_open)
@property
def is_valid(self):
r"""bool: True if both comms are open and parent class is valid."""
with self.lock:
return (super(RPCDriver, self).is_valid and
self.icomm.is_valid and
self.ocomm.is_valid)
@property
def n_msg_in(self):
r"""int: The number of messages in the input comm."""
return self.icomm.n_msg
@property
def n_msg_out(self):
r"""int: The number of messages in the output comm."""
return self.ocomm.n_msg
[docs] def start(self):
r"""Run the input/output comm drivers."""
self.debug('')
self.icomm.start()
self.ocomm.start()
super(RPCDriver, self).run()
self.debug('done')
[docs] def graceful_stop(self):
r"""Allow the IPC comms to terminate gracefully."""
self.debug('')
self.icomm.graceful_stop()
self.ocomm.graceful_stop()
super(RPCDriver, self).graceful_stop()
[docs] def close_comms(self):
r"""Close the IPC comms."""
self.debug('')
self.icomm.close_comm()
self.ocomm.close_comm()
[docs] def do_terminate(self):
r"""Terminate input/output comm drivers."""
self.debug('')
self.icomm.terminate()
self.ocomm.terminate()
super(RPCDriver, self).do_terminate()
[docs] def on_model_exit(self):
r"""Actions to perform when the associated model driver is finished."""
self.debug('')
self.ocomm.on_model_exit()
self.icomm.on_model_exit()
super(RPCDriver, self).on_model_exit()
[docs] def cleanup(self):
r"""Perform cleanup for IPC drivers."""
self.debug('')
self.icomm.cleanup()
self.ocomm.cleanup()
super(RPCDriver, self).cleanup()
[docs] def printStatus(self):
r"""Print information on the status of the driver."""
super(RPCDriver, self).printStatus()
self.icomm.printStatus(beg_msg='RPC Input Driver:')
self.ocomm.printStatus(beg_msg='RPC Ouput Driver:')
[docs] def send(self, data, *args, **kwargs):
r"""Send message smaller than maxMsgSize to the output comm.
Args:
data (str): Message to be sent.
*args: Arguments are passed to output comm send method.
**kwargs: Keyword arguments are passed to output comm send method.
Returns:
bool: Succes or failure of send.
"""
return self.ocomm.send(data, *args, **kwargs)
[docs] def recv(self, *args, **kwargs):
r"""Receive message smaller than maxMsgSize from the input comm.
Args:
*args: Arguments are passed to input comm recv method.
**kwargs: Keyword arguments are passed to input comm recv method.
Returns:
tuple (bool, str): Success or failure of recv and the received
message.
"""
return self.icomm.recv(*args, **kwargs)
[docs] def send_nolimit(self, data, *args, **kwargs):
r"""Send message larger than maxMsgSize to the input comm.
Args:
data (str): Message to be sent.
*args: Arguments are passed to output comm send_nolimit method.
**kwargs: Keyword arguments are passed to output comm send_nolimit
method.
Returns:
bool: Succes or failure of send.
"""
return self.ocomm.send_nolimit(data, *args, **kwargs)
[docs] def recv_nolimit(self, *args, **kwargs):
r"""Receive message larger than maxMsgSize from the output comm.
Args:
*args: Arguments are passed to input comm recv_nolimit method.
**kwargs: Keyword arguments are passed to input comm recv_nolimit
method.
Returns:
tuple (bool, str): Success or failure of recv and the received
message.
"""
return self.icomm.recv_nolimit(*args, **kwargs)