fixed issue where config messages were not being broadcasted out

This commit is contained in:
Blake J. Harnden 2017-07-13 09:36:09 -07:00
parent 3ba7e3b1a3
commit ad179438c6
3 changed files with 41 additions and 27 deletions

View file

@ -129,11 +129,7 @@ class CoreRequestHandler(SocketServer.BaseRequestHandler):
logger.info("connection closed: %s", self.client_address)
if self.session:
self.session.event_handlers.remove(self.handle_broadcast_event)
self.session.exception_handlers.remove(self.handle_broadcast_exception)
self.session.node_handlers.remove(self.handle_broadcast_node)
self.session.link_handlers.remove(self.handle_broadcast_link)
self.session.file_handlers.remove(self.handle_broadcast_file)
self.remove_session_handlers()
# remove client from session broker and shutdown if there are no clients
self.session.broker.session_clients.remove(self)
@ -517,11 +513,7 @@ class CoreRequestHandler(SocketServer.BaseRequestHandler):
# add handlers for various data
logger.info("adding session broadcast handlers")
self.session.event_handlers.append(self.handle_broadcast_event)
self.session.exception_handlers.append(self.handle_broadcast_exception)
self.session.node_handlers.append(self.handle_broadcast_node)
self.session.link_handlers.append(self.handle_broadcast_link)
self.session.file_handlers.append(self.handle_broadcast_file)
self.add_session_handlers()
# set initial session state
self.session.set_state(state=EventTypes.DEFINITION_STATE.value)
@ -551,6 +543,24 @@ class CoreRequestHandler(SocketServer.BaseRequestHandler):
logger.info("BROADCAST TO OTHER CLIENT: %s", client)
client.sendall(message.raw_message)
def add_session_handlers(self):
logger.info("adding session broadcast handlers")
self.session.event_handlers.append(self.handle_broadcast_event)
self.session.exception_handlers.append(self.handle_broadcast_exception)
self.session.node_handlers.append(self.handle_broadcast_node)
self.session.link_handlers.append(self.handle_broadcast_link)
self.session.file_handlers.append(self.handle_broadcast_file)
self.session.config_handlers.append(self.handle_broadcast_config)
def remove_session_handlers(self):
logger.info("removing session broadcast handlers")
self.session.event_handlers.remove(self.handle_broadcast_event)
self.session.exception_handlers.remove(self.handle_broadcast_exception)
self.session.node_handlers.remove(self.handle_broadcast_node)
self.session.link_handlers.remove(self.handle_broadcast_link)
self.session.file_handlers.remove(self.handle_broadcast_file)
self.session.config_handlers.remove(self.handle_broadcast_config)
def handle_node_message(self, message):
"""
Node Message handler
@ -1506,11 +1516,7 @@ class CoreRequestHandler(SocketServer.BaseRequestHandler):
# add broadcast handlers
logger.info("adding session broadcast handlers")
self.session.event_handlers.append(self.handle_broadcast_event)
self.session.exception_handlers.append(self.handle_broadcast_exception)
self.session.node_handlers.append(self.handle_broadcast_node)
self.session.link_handlers.append(self.handle_broadcast_link)
self.session.file_handlers.append(self.handle_broadcast_file)
self.add_session_handlers()
if user is not None:
self.session.set_user(user)
@ -1751,11 +1757,7 @@ class BaseAuxRequestHandler(CoreRequestHandler):
:return: nothing
"""
if self.session:
self.session.event_handlers.remove(self.handle_broadcast_event)
self.session.exception_handlers.remove(self.handle_broadcast_exception)
self.session.node_handlers.remove(self.handle_broadcast_node)
self.session.link_handlers.remove(self.handle_broadcast_link)
self.session.file_handlers.remove(self.handle_broadcast_file)
self.remove_session_handlers()
self.session.shutdown()
return SocketServer.BaseRequestHandler.finish(self)

View file

@ -5,6 +5,7 @@ that manages a CORE session.
import atexit
import os
import pprint
import random
import shlex
import shutil
@ -1270,24 +1271,29 @@ class Session(object):
links_data.append(link_data)
# send all nodes first, so that they will exist for any links
logger.info("nodes: %s", nodes_data)
logger.info("links: %s", links_data)
logger.info("sending nodes:")
for node_data in nodes_data:
logger.info(pprint.pformat(dict(node_data._asdict())))
self.broadcast_node(node_data)
logger.info("sending links:")
for link_data in links_data:
logger.info(pprint.pformat(dict(link_data._asdict())))
self.broadcast_link(link_data)
# send model info
configs = self.mobility.getallconfigs()
configs += self.emane.getallconfigs()
logger.info("sending model configs:")
for node_number, cls, values in configs:
logger.info("config: node(%s) class(%s) values(%s)", node_number, cls, values)
config_data = cls.config_data(
flags=0,
node_id=node_number,
type_flags=ConfigFlags.UPDATE.value,
values=values
)
logger.info(pprint.pformat(dict(config_data._asdict())))
self.broadcast_config(config_data)
# service customizations

View file

@ -24,12 +24,14 @@ class CoreDocumentParser1(object):
def __init__(self, session, filename, options):
"""
Creates an CoreDocumentParser1 object.
:param core.session.Session session:
:param filename:
:param options:
:param str filename: file name to open and parse
:param dict options: parsing options
:return:
"""
logger.info("creating xml parser: file (%s) options(%s)", filename, options)
self.session = session
self.filename = filename
if 'dom' in options:
@ -56,11 +58,10 @@ class CoreDocumentParser1(object):
def get_scenario(dom):
scenario = xmlutils.get_first_child_by_tag_name(dom, 'scenario')
if not scenario:
raise ValueError, 'no scenario element found'
raise ValueError('no scenario element found')
version = scenario.getAttribute('version')
if version and version != '1.0':
raise ValueError, \
'unsupported scenario version found: \'%s\'' % version
raise ValueError('unsupported scenario version found: \'%s\'' % version)
return scenario
def parse_scenario(self):
@ -210,6 +211,8 @@ class CoreDocumentParser1(object):
else:
# TODO: any other config managers?
raise NotImplementedError
logger.info("setting wireless link params: node(%s) model(%s) mobility_model(%s)",
nodenum, model_name, mobility_model_name)
mgr.setconfig_keyvalues(nodenum, model_name, link_params.items())
if mobility_model_name and mobility_params:
mgr.setconfig_keyvalues(nodenum, mobility_model_name, mobility_params.items())
@ -274,6 +277,7 @@ class CoreDocumentParser1(object):
else:
mobility_model_name = None
mobility_params = None
if channel_type == 'wireless':
self.set_wireless_link_parameters(channel, link_params, mobility_model_name, mobility_params)
elif channel_type == 'ethernet':
@ -282,10 +286,12 @@ class CoreDocumentParser1(object):
self.set_ethernet_link_parameters(channel, link_params, mobility_model_name, mobility_params)
else:
raise NotImplementedError
layer2_device = []
for dev, if_name in self.iter_network_member_devices(channel):
if self.device_type(dev) in self.layer2_device_types:
layer2_device.append((dev, if_name))
assert len(layer2_device) <= 2
if len(layer2_device) == 2:
self.link_layer2_devices(layer2_device[0][0], layer2_device[0][1],