quick base to try and help flesh out documentation under core.*

This commit is contained in:
Blake J. Harnden 2017-05-03 09:30:49 -07:00
parent 8f45e5c4da
commit 4ae7958a63
15 changed files with 1956 additions and 292 deletions

View file

@ -57,6 +57,14 @@ class CoreRequestHandler(SocketServer.BaseRequestHandler):
"""
def __init__(self, request, client_address, server):
"""
Create a CoreRequestHandler instance.
:param request: request object
:param str client_address: client address
:param CoreServer server: core server instance
:return:
"""
self.done = False
self.message_handlers = {
MessageTypes.NODE.value: self.handle_node_message,
@ -93,6 +101,8 @@ class CoreRequestHandler(SocketServer.BaseRequestHandler):
def setup(self):
"""
Client has connected, set up a new connection.
:return: nothing
"""
logger.info("new TCP connection: %s", self.client_address)
# self.register()
@ -101,6 +111,8 @@ class CoreRequestHandler(SocketServer.BaseRequestHandler):
"""
Client has disconnected, end this request handler and disconnect
from the session. Shutdown sessions that are not running.
:return: nothing
"""
logger.info("finishing request handler")
self.done = True
@ -322,6 +334,8 @@ class CoreRequestHandler(SocketServer.BaseRequestHandler):
def register(self):
"""
Return a Register Message
:return: register message data
"""
logger.info("GUI has connected to session %d at %s", self.session.session_id, time.ctime())
@ -341,14 +355,19 @@ class CoreRequestHandler(SocketServer.BaseRequestHandler):
"""
Send raw data to the other end of this TCP connection
using socket"s sendall().
:param data: data to send over request socket
:return: data sent
"""
return self.request.sendall(data)
def receive_message(self):
"""
Receive data and return a CORE API message object.
"""
:return: received message
:rtype: coreapi.CoreMessage
"""
try:
header = self.request.recv(coreapi.CoreMessage.header_len)
if len(header) > 0:
@ -389,6 +408,9 @@ class CoreRequestHandler(SocketServer.BaseRequestHandler):
def queue_message(self, message):
"""
Queue an API message for later processing.
:param message: message to queue
:return: nothing
"""
logger.info("queueing msg (queuedtimes = %s): type %s",
message.queuedtimes, MessageTypes(message.message_type))
@ -399,6 +421,8 @@ class CoreRequestHandler(SocketServer.BaseRequestHandler):
CORE API message handling loop that is spawned for each server
thread; get CORE API messages from the incoming message queue,
and call handlemsg() for processing.
:return: nothing
"""
while not self.done:
try:
@ -411,6 +435,8 @@ class CoreRequestHandler(SocketServer.BaseRequestHandler):
"""
Handle an incoming message; dispatch based on message type,
optionally sending replies.
:return: nothing
"""
if self.session and self.session.broker.handle_message(message):
logger.info("%s forwarding message:\n%s", threading.currentThread().getName(), message)
@ -436,6 +462,10 @@ class CoreRequestHandler(SocketServer.BaseRequestHandler):
def dispatch_replies(self, replies, message):
"""
Dispatch replies by CORE to message msg previously received from the client.
:param replies: reply messages to dispatch
:param message: message for replies
:return: nothing
"""
for reply in replies:
message_type, message_flags, message_length = coreapi.CoreMessage.unpack_header(reply)
@ -462,6 +492,8 @@ class CoreRequestHandler(SocketServer.BaseRequestHandler):
Handle a new connection request from a client. Dispatch to the
recvmsg() method for receiving data into CORE API messages, and
add them to an incoming message queue.
:return: nothing
"""
# use port as session id
port = self.request.getpeername()[1]
@ -505,6 +537,9 @@ class CoreRequestHandler(SocketServer.BaseRequestHandler):
def handle_node_message(self, message):
"""
Node Message handler
:param coreapi.CoreNodeMessage message: node message
:return: replies to node message
"""
replies = []
if message.flags & MessageFlags.ADD.value and message.flags & MessageFlags.DELETE.value:
@ -634,6 +669,9 @@ class CoreRequestHandler(SocketServer.BaseRequestHandler):
def handle_link_message(self, message):
"""
Link Message handler
:param coreapi.CoreLinkMessage message: link message to handle
:return: link message replies
"""
# get node classes
ptp_class = nodeutils.get_node_class(NodeTypes.PEER_TO_PEER)
@ -988,6 +1026,9 @@ class CoreRequestHandler(SocketServer.BaseRequestHandler):
def handle_execute_message(self, message):
"""
Execute Message handler
:param coreapi.CoreExecMessage message: execute message to handle
:return: reply messages
"""
node_num = message.get_tlv(ExecuteTlvs.NODE.value)
execute_num = message.get_tlv(ExecuteTlvs.NUMBER.value)
@ -1060,6 +1101,9 @@ class CoreRequestHandler(SocketServer.BaseRequestHandler):
def handle_register_message(self, message):
"""
Register Message Handler
:param coreapi.CoreRegMessage message: register message to handle
:return: reply messages
"""
replies = []
@ -1093,7 +1137,8 @@ class CoreRequestHandler(SocketServer.BaseRequestHandler):
)
thread.daemon = True
thread.start()
time.sleep(0.25) # allow time for session creation
# allow time for session creation
time.sleep(0.25)
if message.flags & MessageFlags.STRING.value:
new_session_ids = set(server.get_session_ids())
new_sid = new_session_ids.difference(old_session_ids)
@ -1145,8 +1190,10 @@ class CoreRequestHandler(SocketServer.BaseRequestHandler):
def handle_config_message(self, message):
"""
Configuration Message handler
"""
:param coreapi.CoreConfMessage message: configuration message to handle
:return: reply messages
"""
# convert config message to standard config data object
config_data = ConfigData(
node=message.get_tlv(ConfigTlvs.NODE.value),
@ -1174,6 +1221,9 @@ class CoreRequestHandler(SocketServer.BaseRequestHandler):
def handle_file_message(self, message):
"""
File Message handler
:param coreapi.CoreFileMessage message: file message to handle
:return: reply messages
"""
if message.flags & MessageFlags.ADD.value:
node_num = message.get_tlv(NodeTlvs.NUMBER.value)
@ -1231,6 +1281,9 @@ class CoreRequestHandler(SocketServer.BaseRequestHandler):
def handle_interface_message(self, message):
"""
Interface Message handler
:param message: interface message to handle
:return: reply messages
"""
logger.info("ignoring Interface message")
return ()
@ -1238,6 +1291,9 @@ class CoreRequestHandler(SocketServer.BaseRequestHandler):
def handle_event_message(self, message):
"""
Event Message handler
:param coreapi.CoreEventMessage message: event message to handle
:return: reply messages
"""
event_data = EventData(
node=message.get_tlv(EventTlvs.NODE.value),
@ -1350,6 +1406,9 @@ class CoreRequestHandler(SocketServer.BaseRequestHandler):
def handle_session_message(self, message):
"""
Session Message handler
:param coreapi.CoreSessionMessage message: session message to handle
:return: reply messages
"""
session_id_str = message.get_tlv(SessionTlvs.NUMBER.value)
name_str = message.get_tlv(SessionTlvs.NAME.value)
@ -1436,10 +1495,11 @@ class CoreRequestHandler(SocketServer.BaseRequestHandler):
def send_node_emulation_id(self, node_id):
"""
Send back node messages to the GUI for node messages that had
the status request flag.
"""
Node emulation id to send.
:param int node_id: node id to send
:return: nothing
"""
if node_id in self.node_status_request:
tlv_data = ""
tlv_data += coreapi.CoreNodeTlv.pack(NodeTlvs.NUMBER.value, node_id)
@ -1462,6 +1522,13 @@ class CoreDatagramRequestHandler(CoreRequestHandler):
"""
def __init__(self, request, client_address, server):
"""
Create a CoreDatagramRequestHandler instance.
:param request: request object
:param str client_address: client address
:param CoreServer server: core server instance
"""
# TODO: decide which messages cannot be handled with connectionless UDP
self.message_handlers = {
MessageTypes.NODE.value: self.handle_node_message,
@ -1482,19 +1549,33 @@ class CoreDatagramRequestHandler(CoreRequestHandler):
def setup(self):
"""
Client has connected, set up a new connection.
:return: nothing
"""
logger.info("new UDP connection: %s:%s" % self.client_address)
def handle(self):
"""
Receive a message.
:return: nothing
"""
self.receive_message()
def finish(self):
"""
Handle the finish state of a client.
:return: nothing
"""
return SocketServer.BaseRequestHandler.finish(self)
def receive_message(self):
"""
Receive data, parse a CoreMessage and queue it onto an existing
session handler"s queue, if available.
:return: nothing
"""
data = self.request[0]
sock = self.request[1]
@ -1550,12 +1631,16 @@ class CoreDatagramRequestHandler(CoreRequestHandler):
def queue_message(self, message):
"""
UDP handlers are short-lived and do not have message queues.
:return: nothing
"""
raise Exception("Unable to queue %s message for later processing using UDP!" % message.type_str())
def sendall(self, data):
"""
Use sendto() on the connectionless UDP socket.
:return: nothing
"""
self.request[1].sendto(data, self.client_address)
@ -1568,6 +1653,13 @@ class BaseAuxRequestHandler(CoreRequestHandler):
"""
def __init__(self, request, client_address, server):
"""
Create a BaseAuxRequestHandler instance.
:param request: request client
:param str client_address: client address
:param CoreServer server: core server instance
"""
self.message_handlers = {
MessageTypes.NODE.value: self.handle_node_message,
MessageTypes.LINK.value: self.handle_link_message,
@ -1588,12 +1680,16 @@ class BaseAuxRequestHandler(CoreRequestHandler):
def setup(self):
"""
New client has connected to the auxiliary server.
:return: nothing
"""
logger.info("new auxiliary server client: %s:%s" % self.client_address)
def handle(self):
"""
The handler main loop
:return: nothing
"""
port = self.request.getpeername()[1]
self.session = self.server.mainserver.create_session(session_id=port)
@ -1616,6 +1712,8 @@ class BaseAuxRequestHandler(CoreRequestHandler):
def finish(self):
"""
Disconnect the client
:return: nothing
"""
if self.session:
self.session.event_handlers.remove(self.handle_broadcast_event)
@ -1639,6 +1737,7 @@ class BaseAuxRequestHandler(CoreRequestHandler):
EXAMPLE:
return self.handler.request.recv(siz)
:return: nothing
"""
raise NotImplemented
@ -1662,6 +1761,7 @@ class BaseAuxRequestHandler(CoreRequestHandler):
logger.info("-"*60)
raise e
:return: nothing
"""
raise NotImplemented
@ -1683,5 +1783,7 @@ class BaseAuxRequestHandler(CoreRequestHandler):
traceback.print_exc(file=sys.stdout)
logger.info("-"*60)
raise e
:return: nothing
"""
raise NotImplemented