grpc added link events
This commit is contained in:
parent
8ee1db5dc8
commit
e282b3b8f8
3 changed files with 186 additions and 2 deletions
|
@ -1,4 +1,5 @@
|
||||||
from __future__ import print_function
|
from __future__ import print_function
|
||||||
|
|
||||||
import logging
|
import logging
|
||||||
import os
|
import os
|
||||||
import threading
|
import threading
|
||||||
|
@ -83,6 +84,18 @@ class CoreApiClient(object):
|
||||||
thread.daemon = True
|
thread.daemon = True
|
||||||
thread.start()
|
thread.start()
|
||||||
|
|
||||||
|
def link_events(self, _id, handler):
|
||||||
|
request = core_pb2.LinkEventsRequest()
|
||||||
|
request.id = _id
|
||||||
|
|
||||||
|
def listen():
|
||||||
|
for event in self.stub.LinkEvents(request):
|
||||||
|
handler(event)
|
||||||
|
|
||||||
|
thread = threading.Thread(target=listen)
|
||||||
|
thread.daemon = True
|
||||||
|
thread.start()
|
||||||
|
|
||||||
def session_events(self, _id, handler):
|
def session_events(self, _id, handler):
|
||||||
request = core_pb2.SessionEventsRequest()
|
request = core_pb2.SessionEventsRequest()
|
||||||
request.id = _id
|
request.id = _id
|
||||||
|
|
|
@ -3,17 +3,20 @@ import os
|
||||||
import tempfile
|
import tempfile
|
||||||
import time
|
import time
|
||||||
from Queue import Queue
|
from Queue import Queue
|
||||||
|
from itertools import repeat
|
||||||
|
|
||||||
import grpc
|
import grpc
|
||||||
from concurrent import futures
|
from concurrent import futures
|
||||||
|
|
||||||
import core_pb2
|
import core_pb2
|
||||||
import core_pb2_grpc
|
import core_pb2_grpc
|
||||||
|
from core.conf import ConfigShim
|
||||||
|
from core.data import ConfigData, FileData
|
||||||
from core.emulator.emudata import NodeOptions, InterfaceData, LinkOptions
|
from core.emulator.emudata import NodeOptions, InterfaceData, LinkOptions
|
||||||
from core.enumerations import NodeTypes, EventTypes, LinkTypes
|
from core.enumerations import NodeTypes, EventTypes, LinkTypes, MessageFlags, ConfigFlags, ConfigDataTypes
|
||||||
from core.misc import nodeutils
|
from core.misc import nodeutils
|
||||||
from core.mobility import BasicRangeModel, Ns2ScriptedMobility
|
from core.mobility import BasicRangeModel, Ns2ScriptedMobility
|
||||||
from core.service import ServiceManager
|
from core.service import ServiceManager, ServiceShim
|
||||||
|
|
||||||
_ONE_DAY_IN_SECONDS = 60 * 60 * 24
|
_ONE_DAY_IN_SECONDS = 60 * 60 * 24
|
||||||
|
|
||||||
|
@ -105,6 +108,106 @@ def convert_link(session, link_data, link):
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def send_objects(session):
|
||||||
|
time.sleep(1)
|
||||||
|
# find all nodes and links
|
||||||
|
nodes_data = []
|
||||||
|
links_data = []
|
||||||
|
with session._objects_lock:
|
||||||
|
for obj in 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
|
||||||
|
for node_data in nodes_data:
|
||||||
|
session.broadcast_node(node_data)
|
||||||
|
|
||||||
|
for link_data in links_data:
|
||||||
|
session.broadcast_link(link_data)
|
||||||
|
|
||||||
|
# send mobility model info
|
||||||
|
for node_id in session.mobility.nodes():
|
||||||
|
for model_name, config in session.mobility.get_all_configs(node_id).iteritems():
|
||||||
|
model_class = session.mobility.models[model_name]
|
||||||
|
logging.debug("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)
|
||||||
|
session.broadcast_config(config_data)
|
||||||
|
|
||||||
|
# send emane model info
|
||||||
|
for node_id in session.emane.nodes():
|
||||||
|
for model_name, config in session.emane.get_all_configs(node_id).iteritems():
|
||||||
|
model_class = session.emane.models[model_name]
|
||||||
|
logging.debug("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)
|
||||||
|
session.broadcast_config(config_data)
|
||||||
|
|
||||||
|
# service customizations
|
||||||
|
service_configs = session.services.all_configs()
|
||||||
|
for node_id, service in service_configs:
|
||||||
|
opaque = "service:%s" % service.name
|
||||||
|
data_types = tuple(repeat(ConfigDataTypes.STRING.value, len(ServiceShim.keys)))
|
||||||
|
node = session.get_object(node_id)
|
||||||
|
values = ServiceShim.tovaluelist(node, service)
|
||||||
|
config_data = ConfigData(
|
||||||
|
message_type=0,
|
||||||
|
node=node_id,
|
||||||
|
object=session.services.name,
|
||||||
|
type=ConfigFlags.UPDATE.value,
|
||||||
|
data_types=data_types,
|
||||||
|
data_values=values,
|
||||||
|
session=str(session.session_id),
|
||||||
|
opaque=opaque
|
||||||
|
)
|
||||||
|
session.broadcast_config(config_data)
|
||||||
|
|
||||||
|
for file_name, config_data in session.services.all_files(service):
|
||||||
|
file_data = FileData(
|
||||||
|
message_type=MessageFlags.ADD.value,
|
||||||
|
node=node_id,
|
||||||
|
name=str(file_name),
|
||||||
|
type=opaque,
|
||||||
|
data=str(config_data)
|
||||||
|
)
|
||||||
|
session.broadcast_file(file_data)
|
||||||
|
|
||||||
|
# TODO: send location info
|
||||||
|
|
||||||
|
# send hook scripts
|
||||||
|
for state in sorted(session._hooks.keys()):
|
||||||
|
for file_name, config_data in session._hooks[state]:
|
||||||
|
file_data = FileData(
|
||||||
|
message_type=MessageFlags.ADD.value,
|
||||||
|
name=str(file_name),
|
||||||
|
type="hook:%s" % state,
|
||||||
|
data=str(config_data)
|
||||||
|
)
|
||||||
|
session.broadcast_file(file_data)
|
||||||
|
|
||||||
|
# send session configuration
|
||||||
|
session_config = session.options.get_configs()
|
||||||
|
config_data = ConfigShim.config_data(0, None, ConfigFlags.UPDATE.value, session.options, session_config)
|
||||||
|
session.broadcast_config(config_data)
|
||||||
|
|
||||||
|
# send session metadata
|
||||||
|
data_values = "|".join(["%s=%s" % item for item in session.metadata.get_configs().iteritems()])
|
||||||
|
data_types = tuple(ConfigDataTypes.STRING.value for _ in session.metadata.get_configs())
|
||||||
|
config_data = ConfigData(
|
||||||
|
message_type=0,
|
||||||
|
object=session.metadata.name,
|
||||||
|
type=ConfigFlags.NONE.value,
|
||||||
|
data_types=data_types,
|
||||||
|
data_values=data_values
|
||||||
|
)
|
||||||
|
session.broadcast_config(config_data)
|
||||||
|
|
||||||
|
logging.info("informed GUI about %d nodes and %d links", len(nodes_data), len(links_data))
|
||||||
|
|
||||||
|
|
||||||
class CoreApiServer(core_pb2_grpc.CoreApiServicer):
|
class CoreApiServer(core_pb2_grpc.CoreApiServicer):
|
||||||
def __init__(self, coreemu):
|
def __init__(self, coreemu):
|
||||||
super(CoreApiServer, self).__init__()
|
super(CoreApiServer, self).__init__()
|
||||||
|
@ -292,6 +395,63 @@ class CoreApiServer(core_pb2_grpc.CoreApiServicer):
|
||||||
node_event.node.services.extend(services.split("|"))
|
node_event.node.services.extend(services.split("|"))
|
||||||
yield node_event
|
yield node_event
|
||||||
|
|
||||||
|
def LinkEvents(self, request, context):
|
||||||
|
session = self.get_session(request.id, context)
|
||||||
|
queue = Queue()
|
||||||
|
session.link_handlers.append(lambda x: queue.put(x))
|
||||||
|
|
||||||
|
while True:
|
||||||
|
event = queue.get()
|
||||||
|
link_event = core_pb2.LinkEvent()
|
||||||
|
if event.interface1_id is not None:
|
||||||
|
interface_one = link_event.link.interface_one
|
||||||
|
update_proto(
|
||||||
|
interface_one,
|
||||||
|
id=event.interface1_id,
|
||||||
|
name=event.interface1_name,
|
||||||
|
mac=convert_value(event.interface1_mac),
|
||||||
|
ip4=convert_value(event.interface1_ip4),
|
||||||
|
ip4mask=event.interface1_ip4_mask,
|
||||||
|
ip6=convert_value(event.interface1_ip6),
|
||||||
|
ip6mask=event.interface1_ip6_mask,
|
||||||
|
)
|
||||||
|
|
||||||
|
if event.interface2_id is not None:
|
||||||
|
interface_two = link_event.link.interface_two
|
||||||
|
update_proto(
|
||||||
|
interface_two,
|
||||||
|
id=event.interface2_id,
|
||||||
|
name=event.interface2_name,
|
||||||
|
mac=convert_value(event.interface2_mac),
|
||||||
|
ip4=convert_value(event.interface2_ip4),
|
||||||
|
ip4mask=event.interface2_ip4_mask,
|
||||||
|
ip6=convert_value(event.interface2_ip6),
|
||||||
|
ip6mask=event.interface2_ip6_mask,
|
||||||
|
)
|
||||||
|
|
||||||
|
link_event.message_type = event.message_type
|
||||||
|
update_proto(
|
||||||
|
link_event.link,
|
||||||
|
type=event.link_type,
|
||||||
|
node_one=event.node1_id,
|
||||||
|
node_two=event.node2_id
|
||||||
|
)
|
||||||
|
update_proto(
|
||||||
|
link_event.link.options,
|
||||||
|
opaque=event.opaque,
|
||||||
|
jitter=event.jitter,
|
||||||
|
key=event.key,
|
||||||
|
mburst=event.mburst,
|
||||||
|
mer=event.mer,
|
||||||
|
per=event.per,
|
||||||
|
bandwidth=event.bandwidth,
|
||||||
|
burst=event.burst,
|
||||||
|
delay=event.delay,
|
||||||
|
dup=event.dup,
|
||||||
|
unidirectional=event.unidirectional
|
||||||
|
)
|
||||||
|
yield link_event
|
||||||
|
|
||||||
def SessionEvents(self, request, context):
|
def SessionEvents(self, request, context):
|
||||||
session = self.get_session(request.id, context)
|
session = self.get_session(request.id, context)
|
||||||
queue = Queue()
|
queue = Queue()
|
||||||
|
|
|
@ -26,6 +26,8 @@ service CoreApi {
|
||||||
// event streams
|
// event streams
|
||||||
rpc NodeEvents (NodeEventsRequest) returns (stream NodeEvent) {
|
rpc NodeEvents (NodeEventsRequest) returns (stream NodeEvent) {
|
||||||
}
|
}
|
||||||
|
rpc LinkEvents (LinkEventsRequest) returns (stream LinkEvent) {
|
||||||
|
}
|
||||||
rpc SessionEvents (SessionEventsRequest) returns (stream SessionEvent) {
|
rpc SessionEvents (SessionEventsRequest) returns (stream SessionEvent) {
|
||||||
}
|
}
|
||||||
rpc ConfigEvents (ConfigEventsRequest) returns (stream ConfigEvent) {
|
rpc ConfigEvents (ConfigEventsRequest) returns (stream ConfigEvent) {
|
||||||
|
@ -205,6 +207,15 @@ message NodeEvent {
|
||||||
Node node = 1;
|
Node node = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
message LinkEventsRequest {
|
||||||
|
int32 id = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
message LinkEvent {
|
||||||
|
MessageType message_type = 1;
|
||||||
|
Link link = 2;
|
||||||
|
}
|
||||||
|
|
||||||
message SessionEventsRequest {
|
message SessionEventsRequest {
|
||||||
int32 id = 1;
|
int32 id = 1;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue