cleaned up how grpc creates node protobuf data for grpc interfaces, cleaned up route monitor script slighly

This commit is contained in:
Blake Harnden 2020-04-06 16:09:01 -07:00
parent 0742c08b59
commit 0aa7c6f1f2
3 changed files with 66 additions and 79 deletions

View file

@ -8,6 +8,7 @@ from core import utils
from core.api.grpc import common_pb2, core_pb2 from core.api.grpc import common_pb2, core_pb2
from core.api.grpc.services_pb2 import NodeServiceData, ServiceConfig from core.api.grpc.services_pb2 import NodeServiceData, ServiceConfig
from core.config import ConfigurableOptions from core.config import ConfigurableOptions
from core.emane.nodes import EmaneNet
from core.emulator.data import LinkData from core.emulator.data import LinkData
from core.emulator.emudata import InterfaceData, LinkOptions, NodeOptions from core.emulator.emudata import InterfaceData, LinkOptions, NodeOptions
from core.emulator.enumerations import LinkTypes, NodeTypes from core.emulator.enumerations import LinkTypes, NodeTypes
@ -221,6 +222,47 @@ def get_config_options(
return results return results
def get_node_proto(session: Session, node: NodeBase) -> core_pb2.Node:
"""
Convert CORE node to protobuf representation.
:param session: session containing node
:param node: node to convert
:return: node proto
"""
node_type = session.get_node_type(node.__class__)
position = core_pb2.Position(
x=node.position.x, y=node.position.y, z=node.position.z
)
services = getattr(node, "services", [])
if services is None:
services = []
services = [x.name for x in services]
config_services = getattr(node, "config_services", {})
config_services = [x for x in config_services]
emane_model = None
if isinstance(node, EmaneNet):
emane_model = node.model.name
model = getattr(node, "type", None)
node_dir = getattr(node, "nodedir", None)
channel = getattr(node, "ctrlchnlname", None)
image = getattr(node, "image", None)
return core_pb2.Node(
id=node.id,
name=node.name,
emane=emane_model,
model=model,
type=node_type.value,
position=position,
services=services,
icon=node.icon,
image=image,
config_services=config_services,
dir=node_dir,
channel=channel,
)
def get_links(session: Session, node: NodeBase): def get_links(session: Session, node: NodeBase):
""" """
Retrieve a list of links for grpc to use Retrieve a list of links for grpc to use

View file

@ -103,7 +103,6 @@ from core.api.grpc.wlan_pb2 import (
SetWlanConfigRequest, SetWlanConfigRequest,
SetWlanConfigResponse, SetWlanConfigResponse,
) )
from core.emane.nodes import EmaneNet
from core.emulator.coreemu import CoreEmu from core.emulator.coreemu import CoreEmu
from core.emulator.data import LinkData from core.emulator.data import LinkData
from core.emulator.emudata import LinkOptions, NodeOptions from core.emulator.emudata import LinkOptions, NodeOptions
@ -111,9 +110,7 @@ from core.emulator.enumerations import EventTypes, LinkTypes, MessageFlags
from core.emulator.session import Session from core.emulator.session import Session
from core.errors import CoreCommandError, CoreError from core.errors import CoreCommandError, CoreError
from core.location.mobility import BasicRangeModel, Ns2ScriptedMobility from core.location.mobility import BasicRangeModel, Ns2ScriptedMobility
from core.nodes.base import CoreNode, CoreNodeBase, NodeBase from core.nodes.base import CoreNodeBase, NodeBase
from core.nodes.docker import DockerNode
from core.nodes.lxd import LxcNode
from core.services.coreservices import ServiceManager from core.services.coreservices import ServiceManager
_ONE_DAY_IN_SECONDS = 60 * 60 * 24 _ONE_DAY_IN_SECONDS = 60 * 60 * 24
@ -544,42 +541,7 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
node = session.nodes[_id] node = session.nodes[_id]
if not isinstance(node.id, int): if not isinstance(node.id, int):
continue continue
node_type = session.get_node_type(node.__class__) node_proto = grpcutils.get_node_proto(session, node)
model = getattr(node, "type", None)
position = core_pb2.Position(
x=node.position.x, y=node.position.y, z=node.position.z
)
services = getattr(node, "services", [])
if services is None:
services = []
services = [x.name for x in services]
config_services = getattr(node, "config_services", {})
config_services = [x for x in config_services]
emane_model = None
if isinstance(node, EmaneNet):
emane_model = node.model.name
node_dir = None
channel = None
if isinstance(node, CoreNode):
node_dir = node.nodedir
channel = node.ctrlchnlname
image = getattr(node, "image", None)
node_proto = core_pb2.Node(
id=node.id,
name=node.name,
emane=emane_model,
model=model,
type=node_type.value,
position=position,
services=services,
icon=node.icon,
image=image,
config_services=config_services,
dir=node_dir,
channel=channel,
)
if isinstance(node, (DockerNode, LxcNode)):
node_proto.image = node.image
nodes.append(node_proto) nodes.append(node_proto)
node_links = get_links(session, node) node_links = get_links(session, node)
links.extend(node_links) links.extend(node_links)
@ -723,34 +685,7 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
interface = node._netif[interface_id] interface = node._netif[interface_id]
interface_proto = grpcutils.interface_to_proto(interface) interface_proto = grpcutils.interface_to_proto(interface)
interfaces.append(interface_proto) interfaces.append(interface_proto)
emane_model = None node_proto = grpcutils.get_node_proto(session, node)
if isinstance(node, EmaneNet):
emane_model = node.model.name
node_dir = None
channel = None
if isinstance(node, CoreNode):
node_dir = node.nodedir
channel = node.ctrlchnlname
services = []
if node.services:
services = [x.name for x in node.services]
position = core_pb2.Position(
x=node.position.x, y=node.position.y, z=node.position.z
)
node_type = session.get_node_type(node.__class__)
node_proto = core_pb2.Node(
id=node.id,
name=node.name,
type=node_type.value,
emane=emane_model,
model=node.type,
position=position,
services=services,
dir=node_dir,
channel=channel,
)
if isinstance(node, (DockerNode, LxcNode)):
node_proto.image = node.image
return core_pb2.GetNodeResponse(node=node_proto, interfaces=interfaces) return core_pb2.GetNodeResponse(node=node_proto, interfaces=interfaces)
def EditNode( def EditNode(

View file

@ -33,9 +33,11 @@ class SdtClient:
self.links = [] self.links = []
self.send(f'layer "{ROUTE_LAYER}"') self.send(f'layer "{ROUTE_LAYER}"')
def close(self) -> None:
self.sock.close()
def send(self, cmd: str) -> None: def send(self, cmd: str) -> None:
sdt_cmd = f"{cmd}\n".encode() sdt_cmd = f"{cmd}\n".encode()
print("sdt cmd: ", cmd)
self.sock.sendall(sdt_cmd) self.sock.sendall(sdt_cmd)
def add_link(self, node1, node2) -> None: def add_link(self, node1, node2) -> None:
@ -64,6 +66,7 @@ class RouterMonitor:
self.seen = {} self.seen = {}
self.running = False self.running = False
self.route_time = None self.route_time = None
self.listeners = []
self.sdt = SdtClient((sdt_host, sdt_port)) self.sdt = SdtClient((sdt_host, sdt_port))
self.nodes = self.get_nodes() self.nodes = self.get_nodes()
@ -77,7 +80,7 @@ class RouterMonitor:
session = sessions[0] session = sessions[0]
if not session: if not session:
raise Exception("no current core sessions") raise Exception("no current core sessions")
print(session.dir) print("session: ", session.dir)
response = self.core.get_session(session.id) response = self.core.get_session(session.id)
for node in response.session.nodes: for node in response.session.nodes:
if node.type != NodeType.DEFAULT: if node.type != NodeType.DEFAULT:
@ -88,8 +91,10 @@ class RouterMonitor:
def start(self) -> None: def start(self) -> None:
self.running = True self.running = True
for node_id, node in self.nodes.items(): for node_id, node in self.nodes.items():
print("listening on node: ", node)
thread = Thread(target=self.listen, args=(node_id, node), daemon=True) thread = Thread(target=self.listen, args=(node_id, node), daemon=True)
thread.start() thread.start()
self.listeners.append(thread)
self.manage() self.manage()
def manage(self) -> None: def manage(self) -> None:
@ -123,7 +128,6 @@ class RouterMonitor:
key=cmp_to_key(self.route_sort), key=cmp_to_key(self.route_sort),
reverse=True) reverse=True)
print("current route:") print("current route:")
print(values)
for index, node_data in enumerate(values): for index, node_data in enumerate(values):
next_index = index + 1 next_index = index + 1
if next_index == len(values): if next_index == len(values):
@ -133,8 +137,13 @@ class RouterMonitor:
print(f"{node_id} -> {next_node_id}") print(f"{node_id} -> {next_node_id}")
self.sdt.add_link(node_id, next_node_id) self.sdt.add_link(node_id, next_node_id)
def cleanup(self) -> None: def stop(self) -> None:
self.running = False
self.sdt.delete_links() self.sdt.delete_links()
self.sdt.close()
for thread in self.listeners:
thread.join()
self.listeners.clear()
def listen(self, node_id, node) -> None: def listen(self, node_id, node) -> None:
cmd = ( cmd = (
@ -149,6 +158,7 @@ class RouterMonitor:
ready, _, _ = select.select([p.stdout], [], [], 1) ready, _, _ = select.select([p.stdout], [], [], 1)
if ready: if ready:
line = p.stdout.readline().strip().decode() line = p.stdout.readline().strip().decode()
if line:
line = line.split("ttl", 1)[1] line = line.split("ttl", 1)[1]
ttl = int(line.split(",", 1)[0]) ttl = int(line.split(",", 1)[0])
p.stdout.readline() p.stdout.readline()
@ -158,7 +168,7 @@ class RouterMonitor:
if (time.monotonic() - current) >= DEAD_TIME: if (time.monotonic() - current) >= DEAD_TIME:
self.queue.put((RouteEnum.DEL, node_id, None)) self.queue.put((RouteEnum.DEL, node_id, None))
except Exception as e: except Exception as e:
print(f"listen error: {e}") print(f"listener error: {e}")
def main() -> None: def main() -> None:
@ -189,7 +199,7 @@ def main() -> None:
try: try:
monitor.start() monitor.start()
except KeyboardInterrupt: except KeyboardInterrupt:
monitor.cleanup() monitor.stop()
print("ending packet monitor") print("ending packet monitor")