moved send_objects from session to corehandlers, since it was used for tlv messaging specifically
This commit is contained in:
parent
7199044809
commit
bb8c3fe275
2 changed files with 112 additions and 127 deletions
|
@ -5,6 +5,7 @@ socket server request handlers leveraged by core servers.
|
||||||
import Queue
|
import Queue
|
||||||
import SocketServer
|
import SocketServer
|
||||||
import os
|
import os
|
||||||
|
import pprint
|
||||||
import shlex
|
import shlex
|
||||||
import shutil
|
import shutil
|
||||||
import sys
|
import sys
|
||||||
|
@ -18,6 +19,7 @@ from core.api import dataconversion
|
||||||
from core.conf import ConfigShim
|
from core.conf import ConfigShim
|
||||||
from core.data import ConfigData
|
from core.data import ConfigData
|
||||||
from core.data import EventData
|
from core.data import EventData
|
||||||
|
from core.data import FileData
|
||||||
from core.emulator.emudata import InterfaceData
|
from core.emulator.emudata import InterfaceData
|
||||||
from core.emulator.emudata import LinkOptions
|
from core.emulator.emudata import LinkOptions
|
||||||
from core.emulator.emudata import NodeOptions
|
from core.emulator.emudata import NodeOptions
|
||||||
|
@ -42,6 +44,7 @@ from core.misc import structutils
|
||||||
from core.misc import utils
|
from core.misc import utils
|
||||||
from core.mobility import BasicRangeModel
|
from core.mobility import BasicRangeModel
|
||||||
from core.mobility import Ns2ScriptedMobility
|
from core.mobility import Ns2ScriptedMobility
|
||||||
|
from core.service import CoreService
|
||||||
from core.service import ServiceManager
|
from core.service import ServiceManager
|
||||||
|
|
||||||
|
|
||||||
|
@ -1428,7 +1431,7 @@ class CoreHandler(SocketServer.BaseRequestHandler):
|
||||||
elif event_type == EventTypes.FILE_OPEN:
|
elif event_type == EventTypes.FILE_OPEN:
|
||||||
filename = event_data.name
|
filename = event_data.name
|
||||||
self.session.open_xml(filename, start=False)
|
self.session.open_xml(filename, start=False)
|
||||||
self.session.send_objects()
|
self.send_objects()
|
||||||
return ()
|
return ()
|
||||||
elif event_type == EventTypes.FILE_SAVE:
|
elif event_type == EventTypes.FILE_SAVE:
|
||||||
filename = event_data.name
|
filename = event_data.name
|
||||||
|
@ -1530,7 +1533,7 @@ class CoreHandler(SocketServer.BaseRequestHandler):
|
||||||
self.session.set_user(user)
|
self.session.set_user(user)
|
||||||
|
|
||||||
if message.flags & MessageFlags.STRING.value:
|
if message.flags & MessageFlags.STRING.value:
|
||||||
self.session.send_objects()
|
self.send_objects()
|
||||||
elif message.flags & MessageFlags.DELETE.value:
|
elif message.flags & MessageFlags.DELETE.value:
|
||||||
# shut down the specified session(s)
|
# shut down the specified session(s)
|
||||||
logger.info("request to terminate session %s" % session_id)
|
logger.info("request to terminate session %s" % session_id)
|
||||||
|
@ -1559,3 +1562,109 @@ class CoreHandler(SocketServer.BaseRequestHandler):
|
||||||
logger.exception("error sending node emulation id message: %s", node_id)
|
logger.exception("error sending node emulation id message: %s", node_id)
|
||||||
|
|
||||||
del self.node_status_request[node_id]
|
del self.node_status_request[node_id]
|
||||||
|
|
||||||
|
def send_objects(self):
|
||||||
|
"""
|
||||||
|
Return API messages that describe the current session.
|
||||||
|
"""
|
||||||
|
# find all nodes and links
|
||||||
|
nodes_data = []
|
||||||
|
links_data = []
|
||||||
|
with self.session._objects_lock:
|
||||||
|
for obj in self.session.objects.itervalues():
|
||||||
|
node_data = obj.data(message_type=MessageFlags.ADD.value)
|
||||||
|
if node_data:
|
||||||
|
nodes_data.append(node_data)
|
||||||
|
|
||||||
|
node_links = obj.all_link_data(flags=MessageFlags.ADD.value)
|
||||||
|
for link_data in node_links:
|
||||||
|
links_data.append(link_data)
|
||||||
|
|
||||||
|
# send all nodes first, so that they will exist for any links
|
||||||
|
logger.info("sending nodes:")
|
||||||
|
for node_data in nodes_data:
|
||||||
|
logger.info(pprint.pformat(dict(node_data._asdict())))
|
||||||
|
self.session.broadcast_node(node_data)
|
||||||
|
|
||||||
|
logger.info("sending links:")
|
||||||
|
for link_data in links_data:
|
||||||
|
logger.info(pprint.pformat(dict(link_data._asdict())))
|
||||||
|
self.session.broadcast_link(link_data)
|
||||||
|
|
||||||
|
# send mobility model info
|
||||||
|
for node_id in self.session.mobility.nodes():
|
||||||
|
node = self.session.get_object(node_id)
|
||||||
|
for model_class, config in self.session.mobility.getmodels(node):
|
||||||
|
logger.info("mobility config: node(%s) class(%s) values(%s)", node_id, model_class, config)
|
||||||
|
config_data = ConfigShim.config_data(0, node_id, ConfigFlags.UPDATE.value, model_class, config)
|
||||||
|
self.session.broadcast_config(config_data)
|
||||||
|
|
||||||
|
# send emane model info
|
||||||
|
for model_name in self.session.emane.emane_models():
|
||||||
|
model_class = self.session.emane.get_model_class(model_name)
|
||||||
|
for node_id in model_class.nodes():
|
||||||
|
config = model_class.get_configs(node_id)
|
||||||
|
logger.info("emane config: node(%s) class(%s) values(%s)", node_id, model_class, config)
|
||||||
|
config_data = ConfigShim.config_data(0, node_id, ConfigFlags.UPDATE.value, model_class, config)
|
||||||
|
self.session.broadcast_config(config_data)
|
||||||
|
|
||||||
|
# service customizations
|
||||||
|
service_configs = self.session.services.getallconfigs()
|
||||||
|
for node_id, service in service_configs:
|
||||||
|
opaque = "service:%s" % service._name
|
||||||
|
data_types = tuple(repeat(ConfigDataTypes.STRING.value, len(CoreService.keys)))
|
||||||
|
node = self.session.get_object(node_id)
|
||||||
|
values = CoreService.tovaluelist(node, node.services)
|
||||||
|
config_data = ConfigData(
|
||||||
|
message_type=0,
|
||||||
|
node=node_id,
|
||||||
|
object=self.session.services.name,
|
||||||
|
type=ConfigFlags.UPDATE.value,
|
||||||
|
data_types=data_types,
|
||||||
|
data_values=values,
|
||||||
|
session=self.session.session_id,
|
||||||
|
opaque=opaque
|
||||||
|
)
|
||||||
|
self.session.broadcast_config(config_data)
|
||||||
|
|
||||||
|
for file_name, config_data in self.session.services.getallfiles(service):
|
||||||
|
file_data = FileData(
|
||||||
|
message_type=MessageFlags.ADD.value,
|
||||||
|
node=node_id,
|
||||||
|
name=str(file_name),
|
||||||
|
type=opaque,
|
||||||
|
data=str(config_data)
|
||||||
|
)
|
||||||
|
self.session.broadcast_file(file_data)
|
||||||
|
|
||||||
|
# TODO: send location info
|
||||||
|
|
||||||
|
# send hook scripts
|
||||||
|
for state in sorted(self.session._hooks.keys()):
|
||||||
|
for file_name, config_data in self.session._hooks[state]:
|
||||||
|
file_data = FileData(
|
||||||
|
message_type=MessageFlags.ADD.value,
|
||||||
|
name=str(file_name),
|
||||||
|
type="hook:%s" % state,
|
||||||
|
data=str(config_data)
|
||||||
|
)
|
||||||
|
self.session.broadcast_file(file_data)
|
||||||
|
|
||||||
|
# send session configuration
|
||||||
|
session_config = self.session.options.get_configs()
|
||||||
|
config_data = ConfigShim.config_data(0, None, ConfigFlags.UPDATE.value, self.session.options, session_config)
|
||||||
|
self.session.broadcast_config(config_data)
|
||||||
|
|
||||||
|
# send session metadata
|
||||||
|
data_values = "|".join(["%s=%s" % item for item in self.session.metadata.get_configs().iteritems()])
|
||||||
|
data_types = tuple(ConfigDataTypes.STRING.value for _ in self.session.metadata.get_configs())
|
||||||
|
config_data = ConfigData(
|
||||||
|
message_type=0,
|
||||||
|
object=self.session.metadata.name,
|
||||||
|
type=ConfigFlags.NONE.value,
|
||||||
|
data_types=data_types,
|
||||||
|
data_values=data_values
|
||||||
|
)
|
||||||
|
self.session.broadcast_config(config_data)
|
||||||
|
|
||||||
|
logger.info("informed GUI about %d nodes and %d links", len(nodes_data), len(links_data))
|
||||||
|
|
|
@ -4,14 +4,12 @@ that manages a CORE session.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import pprint
|
|
||||||
import random
|
import random
|
||||||
import shutil
|
import shutil
|
||||||
import subprocess
|
import subprocess
|
||||||
import tempfile
|
import tempfile
|
||||||
import threading
|
import threading
|
||||||
import time
|
import time
|
||||||
from itertools import repeat
|
|
||||||
|
|
||||||
import pwd
|
import pwd
|
||||||
|
|
||||||
|
@ -19,18 +17,14 @@ from core import constants
|
||||||
from core import logger
|
from core import logger
|
||||||
from core.api import coreapi
|
from core.api import coreapi
|
||||||
from core.broker import CoreBroker
|
from core.broker import CoreBroker
|
||||||
from core.conf import ConfigShim, ConfigurableOptions
|
from core.conf import ConfigurableOptions
|
||||||
from core.conf import Configuration
|
from core.conf import Configuration
|
||||||
from core.data import ConfigData
|
|
||||||
from core.data import EventData
|
from core.data import EventData
|
||||||
from core.data import ExceptionData
|
from core.data import ExceptionData
|
||||||
from core.data import FileData
|
|
||||||
from core.emane.emanemanager import EmaneManager
|
from core.emane.emanemanager import EmaneManager
|
||||||
from core.enumerations import ConfigDataTypes
|
from core.enumerations import ConfigDataTypes
|
||||||
from core.enumerations import ConfigFlags
|
|
||||||
from core.enumerations import EventTypes
|
from core.enumerations import EventTypes
|
||||||
from core.enumerations import ExceptionLevels
|
from core.enumerations import ExceptionLevels
|
||||||
from core.enumerations import MessageFlags
|
|
||||||
from core.enumerations import NodeTypes
|
from core.enumerations import NodeTypes
|
||||||
from core.enumerations import RegisterTlvs
|
from core.enumerations import RegisterTlvs
|
||||||
from core.location import CoreLocation
|
from core.location import CoreLocation
|
||||||
|
@ -41,7 +35,6 @@ from core.misc.ipaddress import MacAddress
|
||||||
from core.mobility import MobilityManager
|
from core.mobility import MobilityManager
|
||||||
from core.netns import nodes
|
from core.netns import nodes
|
||||||
from core.sdt import Sdt
|
from core.sdt import Sdt
|
||||||
from core.service import CoreService
|
|
||||||
from core.service import CoreServices
|
from core.service import CoreServices
|
||||||
from core.xml.xmlsession import save_session_xml
|
from core.xml.xmlsession import save_session_xml
|
||||||
|
|
||||||
|
@ -1109,123 +1102,6 @@ class Session(object):
|
||||||
node = self.get_object(node_id)
|
node = self.get_object(node_id)
|
||||||
node.cmd(data, wait=False)
|
node.cmd(data, wait=False)
|
||||||
|
|
||||||
# TODO: move to core handlers
|
|
||||||
def send_objects(self):
|
|
||||||
"""
|
|
||||||
Return API messages that describe the current session.
|
|
||||||
"""
|
|
||||||
# find all nodes and links
|
|
||||||
nodes_data = []
|
|
||||||
links_data = []
|
|
||||||
with self._objects_lock:
|
|
||||||
for obj in self.objects.itervalues():
|
|
||||||
node_data = obj.data(message_type=MessageFlags.ADD.value)
|
|
||||||
if node_data:
|
|
||||||
nodes_data.append(node_data)
|
|
||||||
|
|
||||||
node_links = obj.all_link_data(flags=MessageFlags.ADD.value)
|
|
||||||
for link_data in node_links:
|
|
||||||
links_data.append(link_data)
|
|
||||||
|
|
||||||
# send all nodes first, so that they will exist for any links
|
|
||||||
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 mobility model info
|
|
||||||
for node_id in self.mobility.nodes():
|
|
||||||
node = self.get_object(node_id)
|
|
||||||
for model_class, config in self.mobility.getmodels(node):
|
|
||||||
logger.info("mobility config: node(%s) class(%s) values(%s)", node_id, model_class, config)
|
|
||||||
config_data = ConfigShim.config_data(0, node_id, ConfigFlags.UPDATE.value, model_class, config)
|
|
||||||
self.broadcast_config(config_data)
|
|
||||||
|
|
||||||
# send emane model info
|
|
||||||
for model_name in self.emane.emane_models():
|
|
||||||
model_class = self.emane.get_model_class(model_name)
|
|
||||||
for node_id in model_class.nodes():
|
|
||||||
config = model_class.get_configs(node_id)
|
|
||||||
logger.info("emane config: node(%s) class(%s) values(%s)", node_id, model_class, config)
|
|
||||||
config_data = ConfigShim.config_data(0, node_id, ConfigFlags.UPDATE.value, model_class, config)
|
|
||||||
self.broadcast_config(config_data)
|
|
||||||
|
|
||||||
# for node_id in self.emane.nodes():
|
|
||||||
# if node_id not in self.objects:
|
|
||||||
# continue
|
|
||||||
#
|
|
||||||
# node = self.get_object(node_id)
|
|
||||||
# for model_class, config in self.emane.getmodels(node):
|
|
||||||
# logger.info("emane config: node(%s) class(%s) values(%s)", node_id, model_class, config)
|
|
||||||
# config_data = ConfigShim.config_data(0, node_id, ConfigFlags.UPDATE.value, model_class, config)
|
|
||||||
# self.broadcast_config(config_data)
|
|
||||||
|
|
||||||
# service customizations
|
|
||||||
service_configs = self.services.getallconfigs()
|
|
||||||
for node_id, service in service_configs:
|
|
||||||
opaque = "service:%s" % service._name
|
|
||||||
data_types = tuple(repeat(ConfigDataTypes.STRING.value, len(CoreService.keys)))
|
|
||||||
node = self.get_object(node_id)
|
|
||||||
values = CoreService.tovaluelist(node, node.services)
|
|
||||||
config_data = ConfigData(
|
|
||||||
message_type=0,
|
|
||||||
node=node_id,
|
|
||||||
object=self.services.name,
|
|
||||||
type=ConfigFlags.UPDATE.value,
|
|
||||||
data_types=data_types,
|
|
||||||
data_values=values,
|
|
||||||
session=self.session_id,
|
|
||||||
opaque=opaque
|
|
||||||
)
|
|
||||||
self.broadcast_config(config_data)
|
|
||||||
|
|
||||||
for file_name, config_data in self.services.getallfiles(service):
|
|
||||||
file_data = FileData(
|
|
||||||
message_type=MessageFlags.ADD.value,
|
|
||||||
node=node_id,
|
|
||||||
name=str(file_name),
|
|
||||||
type=opaque,
|
|
||||||
data=str(config_data)
|
|
||||||
)
|
|
||||||
self.broadcast_file(file_data)
|
|
||||||
|
|
||||||
# TODO: send location info
|
|
||||||
|
|
||||||
# send hook scripts
|
|
||||||
for state in sorted(self._hooks.keys()):
|
|
||||||
for file_name, config_data in self._hooks[state]:
|
|
||||||
file_data = FileData(
|
|
||||||
message_type=MessageFlags.ADD.value,
|
|
||||||
name=str(file_name),
|
|
||||||
type="hook:%s" % state,
|
|
||||||
data=str(config_data)
|
|
||||||
)
|
|
||||||
self.broadcast_file(file_data)
|
|
||||||
|
|
||||||
# send session configuration
|
|
||||||
session_config = self.options.get_configs()
|
|
||||||
config_data = ConfigShim.config_data(0, None, ConfigFlags.UPDATE.value, self.options, session_config)
|
|
||||||
self.broadcast_config(config_data)
|
|
||||||
|
|
||||||
# send session metadata
|
|
||||||
data_values = "|".join(["%s=%s" % item for item in self.metadata.get_configs().iteritems()])
|
|
||||||
data_types = tuple(ConfigDataTypes.STRING.value for _ in self.metadata.get_configs())
|
|
||||||
config_data = ConfigData(
|
|
||||||
message_type=0,
|
|
||||||
object=self.metadata.name,
|
|
||||||
type=ConfigFlags.NONE.value,
|
|
||||||
data_types=data_types,
|
|
||||||
data_values=data_values
|
|
||||||
)
|
|
||||||
self.broadcast_config(config_data)
|
|
||||||
|
|
||||||
logger.info("informed GUI about %d nodes and %d links", len(nodes_data), len(links_data))
|
|
||||||
|
|
||||||
|
|
||||||
class SessionConfig(ConfigurableOptions):
|
class SessionConfig(ConfigurableOptions):
|
||||||
"""
|
"""
|
||||||
|
|
Loading…
Add table
Reference in a new issue