2019-03-21 05:11:09 +00:00
|
|
|
import atexit
|
2019-03-16 20:48:25 +00:00
|
|
|
import logging
|
2019-02-24 16:15:33 +00:00
|
|
|
import os
|
2019-05-31 22:19:23 +01:00
|
|
|
import re
|
2019-03-02 21:44:27 +00:00
|
|
|
import tempfile
|
2019-02-18 07:41:30 +00:00
|
|
|
import time
|
2019-03-16 20:48:25 +00:00
|
|
|
from concurrent import futures
|
2019-09-10 22:20:51 +01:00
|
|
|
from queue import Empty, Queue
|
2019-02-18 07:41:30 +00:00
|
|
|
|
2019-09-10 22:20:51 +01:00
|
|
|
import grpc
|
2019-02-18 07:41:30 +00:00
|
|
|
|
2019-10-28 22:18:57 +00:00
|
|
|
from core.api.grpc import core_pb2, core_pb2_grpc, grpcutils
|
2019-10-29 06:11:15 +00:00
|
|
|
from core.api.grpc.grpcutils import (
|
|
|
|
convert_value,
|
|
|
|
get_config_options,
|
|
|
|
get_emane_model_id,
|
|
|
|
get_links,
|
|
|
|
get_net_stats,
|
|
|
|
)
|
2019-09-28 06:31:56 +01:00
|
|
|
from core.emane.nodes import EmaneNet
|
2019-09-10 23:10:24 +01:00
|
|
|
from core.emulator.data import (
|
|
|
|
ConfigData,
|
|
|
|
EventData,
|
|
|
|
ExceptionData,
|
|
|
|
FileData,
|
|
|
|
LinkData,
|
|
|
|
NodeData,
|
|
|
|
)
|
2019-10-29 06:11:15 +00:00
|
|
|
from core.emulator.emudata import LinkOptions, NodeOptions
|
|
|
|
from core.emulator.enumerations import EventTypes, LinkTypes, MessageFlags
|
2019-10-11 17:34:49 +01:00
|
|
|
from core.errors import CoreCommandError, CoreError
|
2019-05-06 01:11:07 +01:00
|
|
|
from core.location.mobility import BasicRangeModel, Ns2ScriptedMobility
|
2019-07-11 21:09:04 +01:00
|
|
|
from core.nodes.docker import DockerNode
|
|
|
|
from core.nodes.lxd import LxcNode
|
2019-04-30 07:31:47 +01:00
|
|
|
from core.services.coreservices import ServiceManager
|
2019-02-18 07:41:30 +00:00
|
|
|
|
|
|
|
_ONE_DAY_IN_SECONDS = 60 * 60 * 24
|
2019-06-03 21:06:11 +01:00
|
|
|
_INTERFACE_REGEX = re.compile(r"\d+")
|
2019-02-18 07:41:30 +00:00
|
|
|
|
|
|
|
|
2019-03-22 05:56:33 +00:00
|
|
|
class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
|
2019-09-13 19:07:04 +01:00
|
|
|
"""
|
|
|
|
Create CoreGrpcServer instance
|
|
|
|
|
|
|
|
:param core.emulator.coreemu.CoreEmu coreemu: coreemu object
|
|
|
|
"""
|
|
|
|
|
2019-02-19 06:54:14 +00:00
|
|
|
def __init__(self, coreemu):
|
2019-10-23 17:51:52 +01:00
|
|
|
super().__init__()
|
2019-02-19 06:54:14 +00:00
|
|
|
self.coreemu = coreemu
|
2019-03-21 05:11:09 +00:00
|
|
|
self.running = True
|
2019-03-22 06:29:26 +00:00
|
|
|
self.server = None
|
2019-03-21 05:11:09 +00:00
|
|
|
atexit.register(self._exit_handler)
|
|
|
|
|
|
|
|
def _exit_handler(self):
|
|
|
|
logging.debug("catching exit, stop running")
|
|
|
|
self.running = False
|
|
|
|
|
|
|
|
def _is_running(self, context):
|
|
|
|
return self.running and context.is_active()
|
|
|
|
|
|
|
|
def _cancel_stream(self, context):
|
|
|
|
context.abort(grpc.StatusCode.CANCELLED, "server stopping")
|
2019-02-18 07:41:30 +00:00
|
|
|
|
2019-05-31 00:31:48 +01:00
|
|
|
def listen(self, address):
|
2019-09-11 23:05:05 +01:00
|
|
|
logging.info("CORE gRPC API listening on: %s", address)
|
2019-03-22 06:29:26 +00:00
|
|
|
self.server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
|
|
|
|
core_pb2_grpc.add_CoreApiServicer_to_server(self, self.server)
|
|
|
|
self.server.add_insecure_port(address)
|
|
|
|
self.server.start()
|
2019-03-22 05:56:33 +00:00
|
|
|
|
|
|
|
try:
|
|
|
|
while True:
|
|
|
|
time.sleep(_ONE_DAY_IN_SECONDS)
|
|
|
|
except KeyboardInterrupt:
|
2019-03-22 06:29:26 +00:00
|
|
|
self.server.stop(None)
|
2019-03-22 05:56:33 +00:00
|
|
|
|
2019-05-28 22:31:34 +01:00
|
|
|
def get_session(self, session_id, context):
|
2019-09-13 19:07:04 +01:00
|
|
|
"""
|
|
|
|
Retrieve session given the session id
|
|
|
|
|
|
|
|
:param int session_id: session id
|
|
|
|
:param grpc.ServicerContext context:
|
2019-10-29 21:40:37 +00:00
|
|
|
:return: session object that satisfies, if session not found then raise an
|
|
|
|
exception
|
2019-09-13 19:07:04 +01:00
|
|
|
:rtype: core.emulator.session.Session
|
|
|
|
"""
|
2019-05-28 22:31:34 +01:00
|
|
|
session = self.coreemu.sessions.get(session_id)
|
2019-03-17 22:28:51 +00:00
|
|
|
if not session:
|
2019-10-18 20:55:35 +01:00
|
|
|
context.abort(grpc.StatusCode.NOT_FOUND, f"session {session_id} not found")
|
2019-03-17 22:28:51 +00:00
|
|
|
return session
|
|
|
|
|
2019-05-28 22:31:34 +01:00
|
|
|
def get_node(self, session, node_id, context):
|
2019-09-13 19:07:04 +01:00
|
|
|
"""
|
|
|
|
Retrieve node given session and node id
|
|
|
|
|
2019-09-16 20:55:00 +01:00
|
|
|
:param core.emulator.session.Session session: session that has the node
|
2019-09-13 19:07:04 +01:00
|
|
|
:param int node_id: node id
|
|
|
|
:param grpc.ServicerContext context:
|
|
|
|
:return: node object that satisfies. If node not found then raise an exception.
|
|
|
|
:rtype: core.nodes.base.CoreNode
|
|
|
|
"""
|
2019-03-26 05:00:08 +00:00
|
|
|
try:
|
2019-06-03 21:06:11 +01:00
|
|
|
return session.get_node(node_id)
|
2019-09-12 23:48:09 +01:00
|
|
|
except CoreError:
|
2019-10-18 20:55:35 +01:00
|
|
|
context.abort(grpc.StatusCode.NOT_FOUND, f"node {node_id} not found")
|
2019-03-17 22:28:51 +00:00
|
|
|
|
2019-10-28 22:18:57 +00:00
|
|
|
def StartSession(self, request, context):
|
|
|
|
"""
|
|
|
|
Start a session.
|
|
|
|
|
|
|
|
:param core.api.grpc.core_pb2.StartSessionRequest request: start session request
|
|
|
|
:param context: grcp context
|
|
|
|
:return: start session response
|
|
|
|
:rtype: core.api.grpc.core_pb2.StartSessionResponse
|
|
|
|
"""
|
|
|
|
logging.debug("start session: %s", request)
|
|
|
|
session = self.get_session(request.session_id, context)
|
|
|
|
|
|
|
|
# clear previous state and setup for creation
|
|
|
|
session.clear()
|
|
|
|
session.set_state(EventTypes.CONFIGURATION_STATE)
|
|
|
|
if not os.path.exists(session.session_dir):
|
|
|
|
os.mkdir(session.session_dir)
|
|
|
|
|
2019-10-29 19:35:07 +00:00
|
|
|
# location
|
|
|
|
if request.HasField("location"):
|
|
|
|
grpcutils.session_location(session, request.location)
|
|
|
|
|
|
|
|
# add all hooks
|
|
|
|
for hook in request.hooks:
|
|
|
|
session.add_hook(hook.state, hook.file, None, hook.data)
|
|
|
|
|
2019-10-28 22:18:57 +00:00
|
|
|
# create nodes
|
2019-10-29 06:11:15 +00:00
|
|
|
grpcutils.create_nodes(session, request.nodes)
|
|
|
|
|
2019-10-29 19:35:07 +00:00
|
|
|
# emane configs
|
2019-10-29 20:37:37 +00:00
|
|
|
config = session.emane.get_configs()
|
|
|
|
config.update(request.emane_config)
|
2019-10-29 21:40:37 +00:00
|
|
|
for config in request.emane_model_configs:
|
|
|
|
_id = get_emane_model_id(config.node_id, config.interface_id)
|
|
|
|
session.emane.set_model_config(_id, config.model, config.config)
|
2019-10-29 20:37:37 +00:00
|
|
|
|
2019-10-29 19:35:07 +00:00
|
|
|
# wlan configs
|
2019-10-29 21:40:37 +00:00
|
|
|
for config in request.wlan_configs:
|
2019-10-29 20:37:37 +00:00
|
|
|
session.mobility.set_model_config(
|
2019-10-29 21:40:37 +00:00
|
|
|
config.node_id, BasicRangeModel.name, config.config
|
2019-10-29 20:37:37 +00:00
|
|
|
)
|
|
|
|
|
2019-10-29 19:35:07 +00:00
|
|
|
# mobility configs
|
2019-10-29 21:40:37 +00:00
|
|
|
for config in request.mobility_configs:
|
|
|
|
session.mobility.set_model_config(
|
|
|
|
config.node_id, Ns2ScriptedMobility.name, config.config
|
|
|
|
)
|
2019-10-29 19:35:07 +00:00
|
|
|
|
2019-11-11 18:19:30 +00:00
|
|
|
# service configs
|
|
|
|
for config in request.service_configs:
|
|
|
|
grpcutils.service_configuration(session, config)
|
|
|
|
|
|
|
|
# service file configs
|
|
|
|
for config in request.service_file_configs:
|
|
|
|
session.services.set_service_file(
|
|
|
|
config.node_id, config.service, config.file, config.data
|
|
|
|
)
|
|
|
|
|
2019-10-29 06:11:15 +00:00
|
|
|
# create links
|
|
|
|
grpcutils.create_links(session, request.links)
|
2019-10-28 22:18:57 +00:00
|
|
|
|
|
|
|
# set to instantiation and start
|
|
|
|
session.set_state(EventTypes.INSTANTIATION_STATE)
|
|
|
|
session.instantiate()
|
|
|
|
|
|
|
|
return core_pb2.StartSessionResponse(result=True)
|
|
|
|
|
|
|
|
def StopSession(self, request, context):
|
|
|
|
"""
|
|
|
|
Stop a running session.
|
|
|
|
|
|
|
|
:param core.api.grpc.core_pb2.StopSessionRequest request: stop session request
|
|
|
|
:param context: grcp context
|
|
|
|
:return: stop session response
|
|
|
|
:rtype: core.api.grpc.core_pb2.StopSessionResponse
|
|
|
|
"""
|
|
|
|
logging.debug("stop session: %s", request)
|
2019-10-29 06:11:15 +00:00
|
|
|
session = self.get_session(request.session_id, context)
|
2019-10-29 17:25:39 +00:00
|
|
|
session.data_collect()
|
2019-11-11 21:23:02 +00:00
|
|
|
session.set_state(EventTypes.DATACOLLECT_STATE, send_event=True)
|
2019-10-28 22:18:57 +00:00
|
|
|
session.clear()
|
2019-11-11 21:23:02 +00:00
|
|
|
session.set_state(EventTypes.SHUTDOWN_STATE, send_event=True)
|
2019-10-28 22:18:57 +00:00
|
|
|
return core_pb2.StopSessionResponse(result=True)
|
|
|
|
|
2019-02-24 15:44:41 +00:00
|
|
|
def CreateSession(self, request, context):
|
2019-09-13 19:07:04 +01:00
|
|
|
"""
|
|
|
|
Create a session
|
|
|
|
|
|
|
|
:param core.api.grpc.core_pb2.CreateSessionRequest request: create-session request
|
|
|
|
:param grpc.ServicerContext context:
|
|
|
|
:return: a create-session response
|
|
|
|
:rtype: core.api.grpc.core_pb2.CreateSessionResponse
|
|
|
|
"""
|
2019-03-20 04:43:11 +00:00
|
|
|
logging.debug("create session: %s", request)
|
2019-05-28 22:31:34 +01:00
|
|
|
session = self.coreemu.create_session(request.session_id)
|
2019-02-24 15:44:41 +00:00
|
|
|
session.set_state(EventTypes.DEFINITION_STATE)
|
|
|
|
session.location.setrefgeo(47.57917, -122.13232, 2.0)
|
|
|
|
session.location.refscale = 150000.0
|
2019-09-10 23:10:24 +01:00
|
|
|
return core_pb2.CreateSessionResponse(
|
|
|
|
session_id=session.id, state=session.state
|
|
|
|
)
|
2019-02-24 15:44:41 +00:00
|
|
|
|
2019-02-24 16:15:33 +00:00
|
|
|
def DeleteSession(self, request, context):
|
2019-09-13 19:07:04 +01:00
|
|
|
"""
|
|
|
|
Delete the session
|
|
|
|
|
|
|
|
:param core.api.grpc.core_pb2.DeleteSessionRequest request: delete-session request
|
|
|
|
:param grpc.ServicerContext context: context object
|
|
|
|
:return: a delete-session response
|
|
|
|
:rtype: core.api.grpc.core_pb2.DeleteSessionResponse
|
|
|
|
"""
|
2019-03-20 04:43:11 +00:00
|
|
|
logging.debug("delete session: %s", request)
|
2019-05-28 22:31:34 +01:00
|
|
|
result = self.coreemu.delete_session(request.session_id)
|
2019-03-22 21:32:39 +00:00
|
|
|
return core_pb2.DeleteSessionResponse(result=result)
|
2019-02-24 16:15:33 +00:00
|
|
|
|
2019-02-18 07:41:30 +00:00
|
|
|
def GetSessions(self, request, context):
|
2019-09-13 19:07:04 +01:00
|
|
|
"""
|
|
|
|
Delete the session
|
|
|
|
|
|
|
|
:param core.api.grpc.core_pb2.GetSessionRequest request: get-session request
|
|
|
|
:param grpc.ServicerContext context: context object
|
|
|
|
:return: a delete-session response
|
|
|
|
:rtype: core.api.grpc.core_pb2.DeleteSessionResponse
|
|
|
|
"""
|
2019-03-20 04:43:11 +00:00
|
|
|
logging.debug("get sessions: %s", request)
|
2019-03-23 00:07:54 +00:00
|
|
|
sessions = []
|
2019-02-19 06:54:14 +00:00
|
|
|
for session_id in self.coreemu.sessions:
|
|
|
|
session = self.coreemu.sessions[session_id]
|
2019-03-23 00:07:54 +00:00
|
|
|
session_summary = core_pb2.SessionSummary(
|
2019-10-22 20:08:55 +01:00
|
|
|
id=session_id,
|
|
|
|
state=session.state,
|
|
|
|
nodes=session.get_node_count(),
|
|
|
|
file=session.file_name,
|
2019-09-10 23:10:24 +01:00
|
|
|
)
|
2019-03-23 00:07:54 +00:00
|
|
|
sessions.append(session_summary)
|
|
|
|
return core_pb2.GetSessionsResponse(sessions=sessions)
|
2019-02-19 06:54:14 +00:00
|
|
|
|
2019-02-21 05:19:35 +00:00
|
|
|
def GetSessionLocation(self, request, context):
|
2019-09-13 19:07:04 +01:00
|
|
|
"""
|
|
|
|
Retrieve a requested session location
|
|
|
|
|
|
|
|
:param core.api.grpc.core_pb2.GetSessionLocationRequest request: get-session-location request
|
|
|
|
:param grpc.ServicerContext context: context object
|
|
|
|
:return: a get-session-location response
|
|
|
|
:rtype: core.api.grpc.core_pb2.GetSessionLocationResponse
|
|
|
|
"""
|
2019-03-20 04:43:11 +00:00
|
|
|
logging.debug("get session location: %s", request)
|
2019-05-28 22:31:34 +01:00
|
|
|
session = self.get_session(request.session_id, context)
|
2019-02-21 05:19:35 +00:00
|
|
|
x, y, z = session.location.refxyz
|
|
|
|
lat, lon, alt = session.location.refgeo
|
2019-10-29 19:35:07 +00:00
|
|
|
scale = session.location.refscale
|
|
|
|
location = core_pb2.SessionLocation(
|
|
|
|
x=x, y=y, z=z, lat=lat, lon=lon, alt=alt, scale=scale
|
2019-09-10 23:10:24 +01:00
|
|
|
)
|
2019-10-29 19:35:07 +00:00
|
|
|
return core_pb2.GetSessionLocationResponse(location=location)
|
2019-02-21 05:19:35 +00:00
|
|
|
|
2019-02-24 15:44:41 +00:00
|
|
|
def SetSessionLocation(self, request, context):
|
2019-09-13 19:07:04 +01:00
|
|
|
"""
|
|
|
|
Set session location
|
|
|
|
|
|
|
|
:param core.api.grpc.core_pb2.SetSessionLocationRequest request: set-session-location request
|
|
|
|
:param grpc.ServicerContext context: context object
|
|
|
|
:return: a set-session-location-response
|
|
|
|
:rtype: core.api.grpc.core_pb2.SetSessionLocationResponse
|
|
|
|
"""
|
2019-03-20 04:43:11 +00:00
|
|
|
logging.debug("set session location: %s", request)
|
2019-05-28 22:31:34 +01:00
|
|
|
session = self.get_session(request.session_id, context)
|
2019-10-29 19:35:07 +00:00
|
|
|
grpcutils.session_location(session, request.location)
|
2019-03-22 21:32:39 +00:00
|
|
|
return core_pb2.SetSessionLocationResponse(result=True)
|
2019-02-24 15:44:41 +00:00
|
|
|
|
2019-02-24 16:15:33 +00:00
|
|
|
def SetSessionState(self, request, context):
|
2019-09-13 19:07:04 +01:00
|
|
|
"""
|
|
|
|
Set session state
|
|
|
|
|
|
|
|
:param core.api.grpc.core_pb2.SetSessionStateRequest request: set-session-state request
|
|
|
|
:param grpc.ServicerContext context:context object
|
|
|
|
:return: set-session-state response
|
|
|
|
:rtype: core.api.grpc.core_pb2.SetSessionStateResponse
|
|
|
|
"""
|
2019-03-20 04:43:11 +00:00
|
|
|
logging.debug("set session state: %s", request)
|
2019-05-28 22:31:34 +01:00
|
|
|
session = self.get_session(request.session_id, context)
|
2019-02-24 16:15:33 +00:00
|
|
|
|
|
|
|
try:
|
|
|
|
state = EventTypes(request.state)
|
|
|
|
session.set_state(state)
|
|
|
|
|
|
|
|
if state == EventTypes.INSTANTIATION_STATE:
|
|
|
|
if not os.path.exists(session.session_dir):
|
|
|
|
os.mkdir(session.session_dir)
|
|
|
|
session.instantiate()
|
|
|
|
elif state == EventTypes.SHUTDOWN_STATE:
|
|
|
|
session.shutdown()
|
|
|
|
elif state == EventTypes.DATACOLLECT_STATE:
|
|
|
|
session.data_collect()
|
|
|
|
elif state == EventTypes.DEFINITION_STATE:
|
|
|
|
session.clear()
|
|
|
|
|
2019-03-22 21:32:39 +00:00
|
|
|
result = True
|
2019-02-24 16:15:33 +00:00
|
|
|
except KeyError:
|
2019-03-22 21:32:39 +00:00
|
|
|
result = False
|
2019-02-24 16:15:33 +00:00
|
|
|
|
2019-03-22 21:32:39 +00:00
|
|
|
return core_pb2.SetSessionStateResponse(result=result)
|
2019-02-24 16:15:33 +00:00
|
|
|
|
2019-02-21 05:19:35 +00:00
|
|
|
def GetSessionOptions(self, request, context):
|
2019-09-16 20:55:00 +01:00
|
|
|
"""
|
2019-10-22 17:57:41 +01:00
|
|
|
Retrieve session options.
|
2019-09-16 20:55:00 +01:00
|
|
|
|
2019-10-22 17:57:41 +01:00
|
|
|
:param core.api.grpc.core_pb2.GetSessionOptions request:
|
|
|
|
get-session-options request
|
2019-09-16 20:55:00 +01:00
|
|
|
:param grpc.ServicerContext context: context object
|
|
|
|
:return: get-session-options response about all session's options
|
|
|
|
:rtype: core.api.grpc.core_pb2.GetSessionOptions
|
|
|
|
"""
|
2019-03-20 04:43:11 +00:00
|
|
|
logging.debug("get session options: %s", request)
|
2019-05-28 22:31:34 +01:00
|
|
|
session = self.get_session(request.session_id, context)
|
2019-10-22 17:57:41 +01:00
|
|
|
current_config = session.options.get_configs()
|
|
|
|
default_config = session.options.default_values()
|
|
|
|
default_config.update(current_config)
|
|
|
|
config = get_config_options(default_config, session.options)
|
|
|
|
return core_pb2.GetSessionOptionsResponse(config=config)
|
2019-02-21 05:19:35 +00:00
|
|
|
|
2019-03-17 04:40:15 +00:00
|
|
|
def SetSessionOptions(self, request, context):
|
2019-09-16 20:55:00 +01:00
|
|
|
"""
|
|
|
|
Update a session's configuration
|
|
|
|
|
|
|
|
:param core.api.grpc.core_pb2.SetSessionOptions request: set-session-options request
|
|
|
|
:param grpc.ServicerContext context: context object
|
|
|
|
:return: set-session-options response
|
|
|
|
:rtype: core.api.grpc.core_pb2.SetSessionOptionsResponse
|
|
|
|
"""
|
2019-03-20 04:43:11 +00:00
|
|
|
logging.debug("set session options: %s", request)
|
2019-05-28 22:31:34 +01:00
|
|
|
session = self.get_session(request.session_id, context)
|
2019-03-24 21:13:04 +00:00
|
|
|
config = session.options.get_configs()
|
|
|
|
config.update(request.config)
|
2019-03-22 21:32:39 +00:00
|
|
|
return core_pb2.SetSessionOptionsResponse(result=True)
|
2019-03-17 04:40:15 +00:00
|
|
|
|
2019-10-30 19:01:01 +00:00
|
|
|
def GetSessionMetadata(self, request, context):
|
|
|
|
"""
|
|
|
|
Retrieve session metadata.
|
|
|
|
|
|
|
|
:param core.api.grpc.core_pb2.GetSessionMetadata request: get session metadata
|
|
|
|
request
|
|
|
|
:param grpc.ServicerContext context: context object
|
|
|
|
:return: get session metadata response
|
|
|
|
:rtype: core.api.grpc.core_pb2.GetSessionMetadata
|
|
|
|
"""
|
|
|
|
logging.debug("get session metadata: %s", request)
|
|
|
|
session = self.get_session(request.session_id, context)
|
2019-10-30 20:27:12 +00:00
|
|
|
return core_pb2.GetSessionMetadataResponse(config=session.metadata)
|
2019-10-30 19:01:01 +00:00
|
|
|
|
|
|
|
def SetSessionMetadata(self, request, context):
|
|
|
|
"""
|
|
|
|
Update a session's metadata.
|
|
|
|
|
|
|
|
:param core.api.grpc.core_pb2.SetSessionMetadata request: set metadata request
|
|
|
|
:param grpc.ServicerContext context: context object
|
|
|
|
:return: set metadata response
|
|
|
|
:rtype: core.api.grpc.core_pb2.SetSessionMetadataResponse
|
|
|
|
"""
|
|
|
|
logging.debug("set session metadata: %s", request)
|
|
|
|
session = self.get_session(request.session_id, context)
|
2019-10-30 20:27:12 +00:00
|
|
|
session.metadata = dict(request.config)
|
2019-10-30 19:01:01 +00:00
|
|
|
return core_pb2.SetSessionMetadataResponse(result=True)
|
|
|
|
|
2019-02-19 06:54:14 +00:00
|
|
|
def GetSession(self, request, context):
|
2019-09-13 19:07:04 +01:00
|
|
|
"""
|
|
|
|
Retrieve requested session
|
|
|
|
|
|
|
|
:param core.api.grpc.core_pb2.GetSessionRequest request: get-session request
|
|
|
|
:param grpc.ServicerContext context: context object
|
|
|
|
:return: get-session response
|
|
|
|
:rtype: core.api.grpc.core_bp2.GetSessionResponse
|
|
|
|
"""
|
2019-03-20 04:43:11 +00:00
|
|
|
logging.debug("get session: %s", request)
|
2019-05-28 22:31:34 +01:00
|
|
|
session = self.get_session(request.session_id, context)
|
2019-02-24 16:15:33 +00:00
|
|
|
|
2019-03-23 04:06:10 +00:00
|
|
|
links = []
|
|
|
|
nodes = []
|
2019-04-30 07:31:47 +01:00
|
|
|
for _id in session.nodes:
|
|
|
|
node = session.nodes[_id]
|
2019-04-27 06:07:51 +01:00
|
|
|
if not isinstance(node.id, int):
|
2019-02-19 06:54:14 +00:00
|
|
|
continue
|
|
|
|
|
2019-09-26 21:00:12 +01:00
|
|
|
node_type = session.get_node_type(node.__class__)
|
2019-02-19 06:54:14 +00:00
|
|
|
model = getattr(node, "type", None)
|
2019-09-10 23:10:24 +01:00
|
|
|
position = core_pb2.Position(
|
|
|
|
x=node.position.x, y=node.position.y, z=node.position.z
|
|
|
|
)
|
2019-02-19 06:54:14 +00:00
|
|
|
|
|
|
|
services = getattr(node, "services", [])
|
|
|
|
if services is None:
|
|
|
|
services = []
|
|
|
|
services = [x.name for x in services]
|
|
|
|
|
|
|
|
emane_model = None
|
2019-09-28 06:31:56 +01:00
|
|
|
if isinstance(node, EmaneNet):
|
2019-02-19 06:54:14 +00:00
|
|
|
emane_model = node.model.name
|
2019-03-22 21:32:39 +00:00
|
|
|
|
2019-03-23 04:06:10 +00:00
|
|
|
node_proto = core_pb2.Node(
|
2019-09-10 23:10:24 +01:00
|
|
|
id=node.id,
|
|
|
|
name=node.name,
|
|
|
|
emane=emane_model,
|
|
|
|
model=model,
|
2019-09-26 21:00:12 +01:00
|
|
|
type=node_type.value,
|
2019-09-10 23:10:24 +01:00
|
|
|
position=position,
|
|
|
|
services=services,
|
|
|
|
)
|
2019-07-11 21:09:04 +01:00
|
|
|
if isinstance(node, (DockerNode, LxcNode)):
|
|
|
|
node_proto.image = node.image
|
2019-03-23 04:06:10 +00:00
|
|
|
nodes.append(node_proto)
|
2019-02-19 06:54:14 +00:00
|
|
|
|
2019-03-23 04:06:10 +00:00
|
|
|
node_links = get_links(session, node)
|
|
|
|
links.extend(node_links)
|
2019-02-20 07:32:04 +00:00
|
|
|
|
2019-03-23 04:06:10 +00:00
|
|
|
session_proto = core_pb2.Session(state=session.state, nodes=nodes, links=links)
|
2019-03-22 21:32:39 +00:00
|
|
|
return core_pb2.GetSessionResponse(session=session_proto)
|
2019-02-18 07:41:30 +00:00
|
|
|
|
2019-10-21 20:51:38 +01:00
|
|
|
def AddSessionServer(self, request, context):
|
|
|
|
"""
|
|
|
|
Add distributed server to a session.
|
|
|
|
|
|
|
|
:param core.api.grpc.core_pb2.AddSessionServerRequest request: get-session
|
|
|
|
request
|
|
|
|
:param grpc.ServicerContext context: context object
|
|
|
|
:return: add session server response
|
|
|
|
:rtype: core.api.grpc.core_bp2.AddSessionServerResponse
|
|
|
|
"""
|
|
|
|
session = self.get_session(request.session_id, context)
|
|
|
|
session.distributed.add_server(request.name, request.host)
|
|
|
|
return core_pb2.AddSessionServerResponse(result=True)
|
|
|
|
|
2019-05-30 21:07:45 +01:00
|
|
|
def Events(self, request, context):
|
2019-05-28 22:31:34 +01:00
|
|
|
session = self.get_session(request.session_id, context)
|
2019-03-16 20:48:25 +00:00
|
|
|
queue = Queue()
|
2019-04-05 04:52:20 +01:00
|
|
|
session.node_handlers.append(queue.put)
|
|
|
|
session.link_handlers.append(queue.put)
|
|
|
|
session.config_handlers.append(queue.put)
|
2019-05-30 21:07:45 +01:00
|
|
|
session.file_handlers.append(queue.put)
|
2019-04-05 04:52:20 +01:00
|
|
|
session.exception_handlers.append(queue.put)
|
|
|
|
session.event_handlers.append(queue.put)
|
2019-03-16 20:48:25 +00:00
|
|
|
|
2019-03-21 05:11:09 +00:00
|
|
|
while self._is_running(context):
|
2019-05-30 21:07:45 +01:00
|
|
|
event = core_pb2.Event()
|
2019-03-19 05:32:01 +00:00
|
|
|
try:
|
2019-05-30 21:07:45 +01:00
|
|
|
data = queue.get(timeout=1)
|
|
|
|
if isinstance(data, NodeData):
|
|
|
|
event.node_event.CopyFrom(self._handle_node_event(data))
|
|
|
|
elif isinstance(data, LinkData):
|
|
|
|
event.link_event.CopyFrom(self._handle_link_event(data))
|
|
|
|
elif isinstance(data, EventData):
|
|
|
|
event.session_event.CopyFrom(self._handle_session_event(data))
|
|
|
|
elif isinstance(data, ConfigData):
|
|
|
|
event.config_event.CopyFrom(self._handle_config_event(data))
|
|
|
|
# TODO: remove when config events are fixed
|
|
|
|
event.config_event.session_id = session.id
|
|
|
|
elif isinstance(data, ExceptionData):
|
|
|
|
event.exception_event.CopyFrom(self._handle_exception_event(data))
|
|
|
|
elif isinstance(data, FileData):
|
|
|
|
event.file_event.CopyFrom(self._handle_file_event(data))
|
|
|
|
else:
|
|
|
|
logging.error("unknown event: %s", data)
|
|
|
|
continue
|
|
|
|
|
|
|
|
yield event
|
2019-03-19 05:32:01 +00:00
|
|
|
except Empty:
|
|
|
|
continue
|
2019-03-16 20:48:25 +00:00
|
|
|
|
2019-05-30 21:07:45 +01:00
|
|
|
session.node_handlers.remove(queue.put)
|
|
|
|
session.link_handlers.remove(queue.put)
|
|
|
|
session.config_handlers.remove(queue.put)
|
|
|
|
session.file_handlers.remove(queue.put)
|
|
|
|
session.exception_handlers.remove(queue.put)
|
|
|
|
session.event_handlers.remove(queue.put)
|
2019-03-21 05:11:09 +00:00
|
|
|
self._cancel_stream(context)
|
|
|
|
|
2019-05-30 21:07:45 +01:00
|
|
|
def _handle_node_event(self, event):
|
2019-09-13 19:07:04 +01:00
|
|
|
"""
|
|
|
|
Handle node event when there is a node event
|
|
|
|
|
2019-09-14 00:21:07 +01:00
|
|
|
:param core.emulator.data.NodeData event: node data
|
2019-09-13 19:07:04 +01:00
|
|
|
:return: node event that contains node id, name, model, position, and services
|
2019-09-14 00:21:07 +01:00
|
|
|
:rtype: core.api.grpc.core_pb2.NodeEvent
|
2019-09-13 19:07:04 +01:00
|
|
|
"""
|
2019-11-27 17:15:19 +00:00
|
|
|
x = None
|
|
|
|
if event.x_position is not None:
|
|
|
|
x = int(event.x_position)
|
|
|
|
y = None
|
|
|
|
if event.y_position is not None:
|
|
|
|
y = int(event.y_position)
|
|
|
|
position = core_pb2.Position(x=x, y=y)
|
2019-05-30 21:07:45 +01:00
|
|
|
services = event.services or ""
|
|
|
|
services = services.split("|")
|
|
|
|
node_proto = core_pb2.Node(
|
2019-09-10 23:10:24 +01:00
|
|
|
id=event.id,
|
|
|
|
name=event.name,
|
|
|
|
model=event.model,
|
|
|
|
position=position,
|
|
|
|
services=services,
|
|
|
|
)
|
2019-05-30 21:07:45 +01:00
|
|
|
return core_pb2.NodeEvent(node=node_proto)
|
2019-03-18 06:29:38 +00:00
|
|
|
|
2019-05-30 21:07:45 +01:00
|
|
|
def _handle_link_event(self, event):
|
2019-09-13 19:07:04 +01:00
|
|
|
"""
|
|
|
|
Handle link event when there is a link event
|
|
|
|
|
2019-09-14 00:21:07 +01:00
|
|
|
:param core.emulator.data.LinkData event: link data
|
2019-09-13 19:07:04 +01:00
|
|
|
:return: link event that has message type and link information
|
|
|
|
:rtype: core.api.grpc.core_pb2.LinkEvent
|
|
|
|
"""
|
2019-05-30 21:07:45 +01:00
|
|
|
interface_one = None
|
|
|
|
if event.interface1_id is not None:
|
|
|
|
interface_one = core_pb2.Interface(
|
2019-09-10 23:10:24 +01:00
|
|
|
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,
|
|
|
|
)
|
2019-03-21 05:11:09 +00:00
|
|
|
|
2019-05-30 21:07:45 +01:00
|
|
|
interface_two = None
|
|
|
|
if event.interface2_id is not None:
|
|
|
|
interface_two = core_pb2.Interface(
|
2019-09-10 23:10:24 +01:00
|
|
|
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,
|
|
|
|
)
|
2019-05-30 21:07:45 +01:00
|
|
|
|
|
|
|
options = core_pb2.LinkOptions(
|
|
|
|
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,
|
2019-09-10 23:10:24 +01:00
|
|
|
unidirectional=event.unidirectional,
|
2019-05-30 21:07:45 +01:00
|
|
|
)
|
|
|
|
link = core_pb2.Link(
|
2019-09-10 23:10:24 +01:00
|
|
|
type=event.link_type,
|
|
|
|
node_one_id=event.node1_id,
|
|
|
|
node_two_id=event.node2_id,
|
|
|
|
interface_one=interface_one,
|
|
|
|
interface_two=interface_two,
|
|
|
|
options=options,
|
|
|
|
)
|
2019-05-30 21:07:45 +01:00
|
|
|
return core_pb2.LinkEvent(message_type=event.message_type, link=link)
|
|
|
|
|
|
|
|
def _handle_session_event(self, event):
|
2019-09-13 19:07:04 +01:00
|
|
|
"""
|
|
|
|
Handle session event when there is a session event
|
|
|
|
|
2019-09-14 00:21:07 +01:00
|
|
|
:param core.emulator.data.EventData event: event data
|
2019-09-13 19:07:04 +01:00
|
|
|
:return: session event
|
|
|
|
:rtype: core.api.grpc.core_pb2.SessionEvent
|
|
|
|
"""
|
2019-05-30 21:07:45 +01:00
|
|
|
event_time = event.time
|
|
|
|
if event_time is not None:
|
|
|
|
event_time = float(event_time)
|
|
|
|
return core_pb2.SessionEvent(
|
|
|
|
node_id=event.node,
|
|
|
|
event=event.event_type,
|
|
|
|
name=event.name,
|
|
|
|
data=event.data,
|
|
|
|
time=event_time,
|
2019-09-10 23:10:24 +01:00
|
|
|
session_id=event.session,
|
2019-05-30 21:07:45 +01:00
|
|
|
)
|
2019-03-18 06:29:38 +00:00
|
|
|
|
2019-05-30 21:07:45 +01:00
|
|
|
def _handle_config_event(self, event):
|
2019-09-13 19:07:04 +01:00
|
|
|
"""
|
|
|
|
Handle configuration event when there is configuration event
|
|
|
|
|
2019-09-14 00:21:07 +01:00
|
|
|
:param core.emulator.data.ConfigData event: configuration data
|
2019-09-13 19:07:04 +01:00
|
|
|
:return: configuration event
|
|
|
|
:rtype: core.api.grpc.core_pb2.ConfigEvent
|
|
|
|
"""
|
2019-05-30 21:07:45 +01:00
|
|
|
session_id = None
|
|
|
|
if event.session is not None:
|
|
|
|
session_id = int(event.session)
|
|
|
|
return core_pb2.ConfigEvent(
|
|
|
|
message_type=event.message_type,
|
|
|
|
node_id=event.node,
|
|
|
|
object=event.object,
|
|
|
|
type=event.type,
|
|
|
|
captions=event.captions,
|
|
|
|
bitmap=event.bitmap,
|
|
|
|
data_values=event.data_values,
|
|
|
|
possible_values=event.possible_values,
|
|
|
|
groups=event.groups,
|
|
|
|
session_id=session_id,
|
|
|
|
interface=event.interface_number,
|
|
|
|
network_id=event.network_id,
|
|
|
|
opaque=event.opaque,
|
2019-09-10 23:10:24 +01:00
|
|
|
data_types=event.data_types,
|
2019-05-30 21:07:45 +01:00
|
|
|
)
|
2019-03-18 06:29:38 +00:00
|
|
|
|
2019-05-30 21:07:45 +01:00
|
|
|
def _handle_exception_event(self, event):
|
2019-09-13 19:07:04 +01:00
|
|
|
"""
|
2019-09-14 00:21:07 +01:00
|
|
|
Handle exception event when there is exception event
|
|
|
|
|
|
|
|
:param core.emulator.data.ExceptionData event: exception data
|
|
|
|
:return: exception event
|
|
|
|
:rtype: core.api.grpc.core_pb2.ExceptionEvent
|
2019-09-13 19:07:04 +01:00
|
|
|
"""
|
2019-05-30 21:07:45 +01:00
|
|
|
return core_pb2.ExceptionEvent(
|
|
|
|
node_id=event.node,
|
|
|
|
session_id=int(event.session),
|
|
|
|
level=event.level.value,
|
|
|
|
source=event.source,
|
|
|
|
date=event.date,
|
|
|
|
text=event.text,
|
2019-09-10 23:10:24 +01:00
|
|
|
opaque=event.opaque,
|
2019-05-30 21:07:45 +01:00
|
|
|
)
|
2019-03-21 05:11:09 +00:00
|
|
|
|
2019-05-30 21:07:45 +01:00
|
|
|
def _handle_file_event(self, event):
|
2019-09-14 00:21:07 +01:00
|
|
|
"""
|
|
|
|
Handle file event
|
|
|
|
|
|
|
|
:param core.emulator.data.FileData event: file data
|
|
|
|
:return: file event
|
|
|
|
:rtype: core.api.grpc.core_pb2.FileEvent
|
|
|
|
"""
|
2019-05-30 21:07:45 +01:00
|
|
|
return core_pb2.FileEvent(
|
|
|
|
message_type=event.message_type,
|
|
|
|
node_id=event.node,
|
|
|
|
name=event.name,
|
|
|
|
mode=event.mode,
|
|
|
|
number=event.number,
|
|
|
|
type=event.type,
|
|
|
|
source=event.source,
|
|
|
|
session_id=event.session,
|
|
|
|
data=event.data,
|
2019-09-10 23:10:24 +01:00
|
|
|
compressed_data=event.compressed_data,
|
2019-05-30 21:07:45 +01:00
|
|
|
)
|
2019-03-18 06:29:38 +00:00
|
|
|
|
2019-05-31 22:19:23 +01:00
|
|
|
def Throughputs(self, request, context):
|
2019-09-14 00:21:07 +01:00
|
|
|
"""
|
|
|
|
Calculate average throughput after every certain amount of delay time
|
|
|
|
|
|
|
|
:param core.api.grpc.core_pb2.ThroughputsRequest request: throughputs request
|
|
|
|
:param grpc.SrevicerContext context: context object
|
|
|
|
:return: nothing
|
|
|
|
"""
|
2019-05-31 22:19:23 +01:00
|
|
|
delay = 3
|
|
|
|
last_check = None
|
|
|
|
last_stats = None
|
2019-03-21 05:11:09 +00:00
|
|
|
while self._is_running(context):
|
2019-05-31 22:19:23 +01:00
|
|
|
now = time.time()
|
|
|
|
stats = get_net_stats()
|
|
|
|
|
|
|
|
# calculate average
|
|
|
|
if last_check is not None:
|
|
|
|
interval = now - last_check
|
|
|
|
throughputs_event = core_pb2.ThroughputsEvent()
|
2019-06-03 21:34:54 +01:00
|
|
|
for key in stats:
|
|
|
|
current_rxtx = stats[key]
|
2019-05-31 22:19:23 +01:00
|
|
|
previous_rxtx = last_stats.get(key)
|
|
|
|
if not previous_rxtx:
|
|
|
|
continue
|
2019-09-10 23:10:24 +01:00
|
|
|
rx_kbps = (
|
|
|
|
(current_rxtx["rx"] - previous_rxtx["rx"]) * 8.0 / interval
|
|
|
|
)
|
|
|
|
tx_kbps = (
|
|
|
|
(current_rxtx["tx"] - previous_rxtx["tx"]) * 8.0 / interval
|
|
|
|
)
|
2019-05-31 22:19:23 +01:00
|
|
|
throughput = rx_kbps + tx_kbps
|
|
|
|
if key.startswith("veth"):
|
|
|
|
key = key.split(".")
|
|
|
|
node_id = int(_INTERFACE_REGEX.search(key[0]).group())
|
|
|
|
interface_id = int(key[1])
|
2019-09-10 23:10:24 +01:00
|
|
|
interface_throughput = (
|
|
|
|
throughputs_event.interface_throughputs.add()
|
|
|
|
)
|
2019-05-31 22:19:23 +01:00
|
|
|
interface_throughput.node_id = node_id
|
|
|
|
interface_throughput.interface_id = interface_id
|
|
|
|
interface_throughput.throughput = throughput
|
|
|
|
elif key.startswith("b."):
|
2019-06-01 06:20:19 +01:00
|
|
|
try:
|
|
|
|
node_id = int(key.split(".")[1])
|
2019-09-10 23:10:24 +01:00
|
|
|
bridge_throughput = (
|
|
|
|
throughputs_event.bridge_throughputs.add()
|
|
|
|
)
|
2019-06-01 06:20:19 +01:00
|
|
|
bridge_throughput.node_id = node_id
|
|
|
|
bridge_throughput.throughput = throughput
|
|
|
|
except ValueError:
|
|
|
|
pass
|
2019-05-31 22:19:23 +01:00
|
|
|
|
|
|
|
yield throughputs_event
|
|
|
|
|
|
|
|
last_check = now
|
|
|
|
last_stats = stats
|
|
|
|
time.sleep(delay)
|
2019-03-21 05:11:09 +00:00
|
|
|
|
2019-03-24 20:14:39 +00:00
|
|
|
def AddNode(self, request, context):
|
2019-09-13 19:07:04 +01:00
|
|
|
"""
|
|
|
|
Add node to requested session
|
|
|
|
|
|
|
|
:param core.api.grpc.core_pb2.AddNodeRequest request: add-node request
|
|
|
|
:param grpc.ServicerContext context: context object
|
|
|
|
:return: add-node response
|
|
|
|
:rtype: core.api.grpc.core_pb2.AddNodeResponse
|
|
|
|
"""
|
2019-03-24 20:14:39 +00:00
|
|
|
logging.debug("add node: %s", request)
|
2019-05-28 22:31:34 +01:00
|
|
|
session = self.get_session(request.session_id, context)
|
2019-10-29 06:11:15 +00:00
|
|
|
_type, _id, options = grpcutils.add_node_data(request.node)
|
|
|
|
node = session.add_node(_type=_type, _id=_id, options=options)
|
2019-06-03 21:06:11 +01:00
|
|
|
return core_pb2.AddNodeResponse(node_id=node.id)
|
2019-02-26 06:45:57 +00:00
|
|
|
|
2019-02-26 22:34:52 +00:00
|
|
|
def GetNode(self, request, context):
|
2019-09-13 19:07:04 +01:00
|
|
|
"""
|
|
|
|
Retrieve node
|
|
|
|
|
|
|
|
:param core.api.grpc.core_pb2.GetNodeRequest request: get-node request
|
|
|
|
:param grpc.ServicerContext context: context object
|
|
|
|
:return: get-node response
|
|
|
|
:rtype: core.api.grpc.core_pb2.GetNodeResponse
|
|
|
|
"""
|
2019-03-20 04:43:11 +00:00
|
|
|
logging.debug("get node: %s", request)
|
2019-05-28 22:31:34 +01:00
|
|
|
session = self.get_session(request.session_id, context)
|
|
|
|
node = self.get_node(session, request.node_id, context)
|
2019-02-26 22:34:52 +00:00
|
|
|
|
2019-03-22 23:16:30 +00:00
|
|
|
interfaces = []
|
2019-05-06 05:23:43 +01:00
|
|
|
for interface_id in node._netif:
|
|
|
|
interface = node._netif[interface_id]
|
2019-02-26 22:34:52 +00:00
|
|
|
net_id = None
|
|
|
|
if interface.net:
|
2019-04-27 06:07:51 +01:00
|
|
|
net_id = interface.net.id
|
2019-03-22 23:16:30 +00:00
|
|
|
interface_proto = core_pb2.Interface(
|
2019-09-10 23:10:24 +01:00
|
|
|
id=interface_id,
|
|
|
|
netid=net_id,
|
|
|
|
name=interface.name,
|
|
|
|
mac=str(interface.hwaddr),
|
|
|
|
mtu=interface.mtu,
|
|
|
|
flowid=interface.flow_id,
|
|
|
|
)
|
2019-03-22 23:16:30 +00:00
|
|
|
interfaces.append(interface_proto)
|
2019-02-26 22:34:52 +00:00
|
|
|
|
|
|
|
emane_model = None
|
2019-09-28 06:31:56 +01:00
|
|
|
if isinstance(node, EmaneNet):
|
2019-02-26 22:34:52 +00:00
|
|
|
emane_model = node.model.name
|
|
|
|
|
2019-10-21 17:51:52 +01:00
|
|
|
services = []
|
|
|
|
if node.services:
|
|
|
|
services = [x.name for x in node.services]
|
|
|
|
|
2019-09-10 23:10:24 +01:00
|
|
|
position = core_pb2.Position(
|
|
|
|
x=node.position.x, y=node.position.y, z=node.position.z
|
|
|
|
)
|
2019-09-26 21:00:12 +01:00
|
|
|
node_type = session.get_node_type(node.__class__)
|
2019-07-11 21:09:04 +01:00
|
|
|
node_proto = core_pb2.Node(
|
2019-09-10 23:10:24 +01:00
|
|
|
id=node.id,
|
|
|
|
name=node.name,
|
2019-09-26 21:00:12 +01:00
|
|
|
type=node_type.value,
|
2019-09-10 23:10:24 +01:00
|
|
|
emane=emane_model,
|
|
|
|
model=node.type,
|
|
|
|
position=position,
|
|
|
|
services=services,
|
|
|
|
)
|
2019-07-11 21:09:04 +01:00
|
|
|
if isinstance(node, (DockerNode, LxcNode)):
|
|
|
|
node_proto.image = node.image
|
2019-03-22 23:16:30 +00:00
|
|
|
|
2019-07-11 21:09:04 +01:00
|
|
|
return core_pb2.GetNodeResponse(node=node_proto, interfaces=interfaces)
|
2019-02-26 22:34:52 +00:00
|
|
|
|
2019-02-26 06:45:57 +00:00
|
|
|
def EditNode(self, request, context):
|
2019-09-13 19:07:04 +01:00
|
|
|
"""
|
|
|
|
Edit node
|
|
|
|
|
|
|
|
:param core.api.grpc.core_bp2.EditNodeRequest request: edit-node request
|
|
|
|
:param grpc.ServicerContext context: context object
|
|
|
|
:return: edit-node response
|
|
|
|
:rtype: core.api.grpc.core_pb2.EditNodeResponse
|
|
|
|
"""
|
2019-03-20 04:43:11 +00:00
|
|
|
logging.debug("edit node: %s", request)
|
2019-05-28 22:31:34 +01:00
|
|
|
session = self.get_session(request.session_id, context)
|
2019-10-17 21:00:20 +01:00
|
|
|
node = self.get_node(session, request.node_id, context)
|
2019-10-22 23:31:50 +01:00
|
|
|
options = NodeOptions()
|
|
|
|
options.icon = request.icon
|
2019-02-26 06:45:57 +00:00
|
|
|
x = request.position.x
|
|
|
|
y = request.position.y
|
2019-10-22 23:31:50 +01:00
|
|
|
options.set_position(x, y)
|
2019-02-26 06:45:57 +00:00
|
|
|
lat = request.position.lat
|
|
|
|
lon = request.position.lon
|
|
|
|
alt = request.position.alt
|
2019-10-22 23:31:50 +01:00
|
|
|
options.set_location(lat, lon, alt)
|
2019-09-11 21:12:42 +01:00
|
|
|
result = True
|
|
|
|
try:
|
2019-10-23 04:55:06 +01:00
|
|
|
session.edit_node(node.id, options)
|
2019-10-17 21:00:20 +01:00
|
|
|
node_data = node.data(0)
|
|
|
|
session.broadcast_node(node_data)
|
2019-09-11 21:12:42 +01:00
|
|
|
except CoreError:
|
|
|
|
result = False
|
2019-03-23 00:07:54 +00:00
|
|
|
return core_pb2.EditNodeResponse(result=result)
|
2019-02-26 06:45:57 +00:00
|
|
|
|
2019-02-26 22:34:52 +00:00
|
|
|
def DeleteNode(self, request, context):
|
2019-09-13 19:07:04 +01:00
|
|
|
"""
|
|
|
|
Delete node
|
|
|
|
|
|
|
|
:param core.api.grpc.core_pb2.DeleteNodeRequest request: delete-node request
|
|
|
|
:param grpc.ServicerContext context: context object
|
|
|
|
:return: core.api.grpc.core_pb2.DeleteNodeResponse
|
|
|
|
"""
|
2019-03-20 04:43:11 +00:00
|
|
|
logging.debug("delete node: %s", request)
|
2019-05-28 22:31:34 +01:00
|
|
|
session = self.get_session(request.session_id, context)
|
|
|
|
result = session.delete_node(request.node_id)
|
2019-03-23 00:07:54 +00:00
|
|
|
return core_pb2.DeleteNodeResponse(result=result)
|
2019-02-26 22:34:52 +00:00
|
|
|
|
2019-05-31 19:46:47 +01:00
|
|
|
def NodeCommand(self, request, context):
|
2019-09-13 19:07:04 +01:00
|
|
|
"""
|
|
|
|
Run command on a node
|
|
|
|
|
|
|
|
:param core.api.grpc.core_pb2.NodeCommandRequest request: node-command request
|
|
|
|
:param grpc.ServicerContext context: context object
|
|
|
|
:return: core.api.grpc.core_pb2.NodeCommandResponse
|
|
|
|
"""
|
2019-05-31 19:46:47 +01:00
|
|
|
logging.debug("sending node command: %s", request)
|
|
|
|
session = self.get_session(request.session_id, context)
|
|
|
|
node = self.get_node(session, request.node_id, context)
|
2019-10-11 17:34:49 +01:00
|
|
|
try:
|
2019-10-19 07:28:09 +01:00
|
|
|
output = node.cmd(request.command)
|
2019-10-11 17:34:49 +01:00
|
|
|
except CoreCommandError as e:
|
|
|
|
output = e.stderr
|
2019-05-31 19:46:47 +01:00
|
|
|
return core_pb2.NodeCommandResponse(output=output)
|
|
|
|
|
2019-06-01 06:20:19 +01:00
|
|
|
def GetNodeTerminal(self, request, context):
|
2019-09-13 19:07:04 +01:00
|
|
|
"""
|
|
|
|
Retrieve terminal command string of a node
|
|
|
|
|
|
|
|
:param core.api.grpc.core_pb2.GetNodeTerminalRequest request: get-node-terminal request
|
|
|
|
:param grpc.ServicerContext context: context object
|
|
|
|
:return: get-node-terminal response
|
|
|
|
:rtype: core.api.grpc.core_bp2.GetNodeTerminalResponse
|
|
|
|
"""
|
2019-06-01 06:20:19 +01:00
|
|
|
logging.debug("getting node terminal: %s", request)
|
|
|
|
session = self.get_session(request.session_id, context)
|
|
|
|
node = self.get_node(session, request.node_id, context)
|
|
|
|
terminal = node.termcmdstring("/bin/bash")
|
|
|
|
return core_pb2.GetNodeTerminalResponse(terminal=terminal)
|
|
|
|
|
2019-03-02 06:14:16 +00:00
|
|
|
def GetNodeLinks(self, request, context):
|
2019-09-13 19:07:04 +01:00
|
|
|
"""
|
|
|
|
Retrieve all links form a requested node
|
|
|
|
|
|
|
|
:param core.api.grpc.core_pb2.GetNodeLinksRequest request: get-node-links request
|
|
|
|
:param grpc.ServicerContext context: context object
|
|
|
|
:return: get-node-links response
|
|
|
|
:rtype: core.api.grpc.core_pb2.GetNodeLinksResponse
|
|
|
|
"""
|
2019-03-20 04:43:11 +00:00
|
|
|
logging.debug("get node links: %s", request)
|
2019-05-28 22:31:34 +01:00
|
|
|
session = self.get_session(request.session_id, context)
|
|
|
|
node = self.get_node(session, request.node_id, context)
|
2019-03-23 04:06:10 +00:00
|
|
|
links = get_links(session, node)
|
|
|
|
return core_pb2.GetNodeLinksResponse(links=links)
|
2019-03-02 06:14:16 +00:00
|
|
|
|
2019-03-24 20:14:39 +00:00
|
|
|
def AddLink(self, request, context):
|
2019-09-13 19:07:04 +01:00
|
|
|
"""
|
|
|
|
Add link to a session
|
|
|
|
|
|
|
|
:param core.api.grpc.core_pb2.AddLinkRequest request: add-link request
|
|
|
|
:param grpc.ServicerContext context: context object
|
|
|
|
:return: add-link response
|
|
|
|
:rtype: core.api.grpc.AddLinkResponse
|
|
|
|
"""
|
2019-03-24 20:14:39 +00:00
|
|
|
logging.debug("add link: %s", request)
|
2019-10-29 06:11:15 +00:00
|
|
|
# validate session and nodes
|
2019-05-28 22:31:34 +01:00
|
|
|
session = self.get_session(request.session_id, context)
|
|
|
|
self.get_node(session, request.link.node_one_id, context)
|
|
|
|
self.get_node(session, request.link.node_two_id, context)
|
2019-10-29 06:11:15 +00:00
|
|
|
|
2019-05-28 22:31:34 +01:00
|
|
|
node_one_id = request.link.node_one_id
|
|
|
|
node_two_id = request.link.node_two_id
|
2019-10-29 06:11:15 +00:00
|
|
|
interface_one, interface_two, options = grpcutils.add_link_data(request.link)
|
2019-09-10 23:10:24 +01:00
|
|
|
session.add_link(
|
2019-10-29 06:11:15 +00:00
|
|
|
node_one_id, node_two_id, interface_one, interface_two, link_options=options
|
2019-09-10 23:10:24 +01:00
|
|
|
)
|
2019-03-24 20:14:39 +00:00
|
|
|
return core_pb2.AddLinkResponse(result=True)
|
2019-02-26 22:34:52 +00:00
|
|
|
|
|
|
|
def EditLink(self, request, context):
|
2019-09-13 19:07:04 +01:00
|
|
|
"""
|
|
|
|
Edit a link
|
|
|
|
|
|
|
|
:param core.api.grpc.core_pb2.EditLinkRequest request: edit-link request
|
|
|
|
:param grpc.ServicerContext context: context object
|
|
|
|
:return: edit-link response
|
|
|
|
:rtype: core.api.grpc.core_pb2.EditLinkResponse
|
|
|
|
"""
|
2019-03-20 04:43:11 +00:00
|
|
|
logging.debug("edit link: %s", request)
|
2019-05-28 22:31:34 +01:00
|
|
|
session = self.get_session(request.session_id, context)
|
|
|
|
node_one_id = request.node_one_id
|
|
|
|
node_two_id = request.node_two_id
|
|
|
|
interface_one_id = request.interface_one_id
|
|
|
|
interface_two_id = request.interface_two_id
|
2019-02-26 22:34:52 +00:00
|
|
|
options_data = request.options
|
|
|
|
link_options = LinkOptions()
|
|
|
|
link_options.delay = options_data.delay
|
|
|
|
link_options.bandwidth = options_data.bandwidth
|
|
|
|
link_options.per = options_data.per
|
|
|
|
link_options.dup = options_data.dup
|
|
|
|
link_options.jitter = options_data.jitter
|
|
|
|
link_options.mer = options_data.mer
|
|
|
|
link_options.burst = options_data.burst
|
|
|
|
link_options.mburst = options_data.mburst
|
|
|
|
link_options.unidirectional = options_data.unidirectional
|
|
|
|
link_options.key = options_data.key
|
|
|
|
link_options.opaque = options_data.opaque
|
2019-09-10 23:10:24 +01:00
|
|
|
session.update_link(
|
|
|
|
node_one_id, node_two_id, interface_one_id, interface_two_id, link_options
|
|
|
|
)
|
2019-03-23 00:07:54 +00:00
|
|
|
return core_pb2.EditLinkResponse(result=True)
|
2019-02-26 22:34:52 +00:00
|
|
|
|
|
|
|
def DeleteLink(self, request, context):
|
2019-09-13 19:07:04 +01:00
|
|
|
"""
|
|
|
|
Delete a link
|
|
|
|
|
|
|
|
:param core.api.grpc.core_pb2.DeleteLinkRequest request: delete-link request
|
|
|
|
:param grpc.ServicerContext context: context object
|
|
|
|
:return: delete-link response
|
|
|
|
:rtype: core.api.grpc.core_pb2.DeleteLinkResponse
|
|
|
|
"""
|
2019-03-20 04:43:11 +00:00
|
|
|
logging.debug("delete link: %s", request)
|
2019-05-28 22:31:34 +01:00
|
|
|
session = self.get_session(request.session_id, context)
|
|
|
|
node_one_id = request.node_one_id
|
|
|
|
node_two_id = request.node_two_id
|
|
|
|
interface_one_id = request.interface_one_id
|
|
|
|
interface_two_id = request.interface_two_id
|
2019-09-10 23:10:24 +01:00
|
|
|
session.delete_link(
|
|
|
|
node_one_id, node_two_id, interface_one_id, interface_two_id
|
|
|
|
)
|
2019-03-23 00:07:54 +00:00
|
|
|
return core_pb2.DeleteLinkResponse(result=True)
|
2019-02-26 22:34:52 +00:00
|
|
|
|
2019-03-16 19:33:24 +00:00
|
|
|
def GetHooks(self, request, context):
|
2019-09-14 00:21:07 +01:00
|
|
|
"""
|
|
|
|
Retrieve all hooks from a session
|
|
|
|
|
|
|
|
:param core.api.grpc.core_pb2.GetHooksRequest request: get-hook request
|
|
|
|
:param grpc.ServicerContext context: context object
|
|
|
|
:return: get-hooks response about all the hooks in all session states
|
|
|
|
:rtype: core.api.grpc.core_pb2.GetHooksResponse
|
|
|
|
"""
|
2019-03-20 04:43:11 +00:00
|
|
|
logging.debug("get hooks: %s", request)
|
2019-05-28 22:31:34 +01:00
|
|
|
session = self.get_session(request.session_id, context)
|
2019-03-23 00:07:54 +00:00
|
|
|
hooks = []
|
2019-05-06 05:23:43 +01:00
|
|
|
for state in session._hooks:
|
|
|
|
state_hooks = session._hooks[state]
|
2019-03-16 19:33:24 +00:00
|
|
|
for file_name, file_data in state_hooks:
|
2019-03-23 00:07:54 +00:00
|
|
|
hook = core_pb2.Hook(state=state, file=file_name, data=file_data)
|
|
|
|
hooks.append(hook)
|
|
|
|
return core_pb2.GetHooksResponse(hooks=hooks)
|
2019-03-16 19:33:24 +00:00
|
|
|
|
|
|
|
def AddHook(self, request, context):
|
2019-09-13 19:07:04 +01:00
|
|
|
"""
|
|
|
|
Add hook to a session
|
|
|
|
|
|
|
|
:param core.api.grpc.core_pb2.AddHookRequest request: add-hook request
|
|
|
|
:param grpc.ServicerContext context: context object
|
|
|
|
:return: add-hook response
|
|
|
|
:rtype: core.api.grpc.core_pb2.AddHookResponse
|
|
|
|
"""
|
2019-03-20 04:43:11 +00:00
|
|
|
logging.debug("add hook: %s", request)
|
2019-05-28 22:31:34 +01:00
|
|
|
session = self.get_session(request.session_id, context)
|
2019-03-16 19:33:24 +00:00
|
|
|
hook = request.hook
|
|
|
|
session.add_hook(hook.state, hook.file, None, hook.data)
|
2019-03-23 00:07:54 +00:00
|
|
|
return core_pb2.AddHookResponse(result=True)
|
2019-03-16 19:33:24 +00:00
|
|
|
|
2019-03-17 22:28:51 +00:00
|
|
|
def GetMobilityConfigs(self, request, context):
|
2019-09-13 19:07:04 +01:00
|
|
|
"""
|
|
|
|
Retrieve all mobility configurations from a session
|
|
|
|
|
2019-10-22 17:57:41 +01:00
|
|
|
:param core.api.grpc.core_pb2.GetMobilityConfigsRequest request:
|
|
|
|
get-mobility-configurations request
|
2019-09-13 19:07:04 +01:00
|
|
|
:param grpc.ServicerContext context: context object
|
|
|
|
:return: get-mobility-configurations response that has a list of configurations
|
|
|
|
:rtype: core.api.grpc.core_pb2.GetMobilityConfigsResponse
|
|
|
|
"""
|
2019-03-20 04:43:11 +00:00
|
|
|
logging.debug("get mobility configs: %s", request)
|
2019-05-28 22:31:34 +01:00
|
|
|
session = self.get_session(request.session_id, context)
|
2019-03-25 19:59:07 +00:00
|
|
|
response = core_pb2.GetMobilityConfigsResponse()
|
2019-05-06 05:23:43 +01:00
|
|
|
for node_id in session.mobility.node_configurations:
|
|
|
|
model_config = session.mobility.node_configurations[node_id]
|
2019-03-17 22:28:51 +00:00
|
|
|
if node_id == -1:
|
|
|
|
continue
|
2019-05-06 05:23:43 +01:00
|
|
|
for model_name in model_config:
|
2019-03-17 22:28:51 +00:00
|
|
|
if model_name != Ns2ScriptedMobility.name:
|
|
|
|
continue
|
2019-10-22 17:57:41 +01:00
|
|
|
current_config = session.mobility.get_model_config(node_id, model_name)
|
|
|
|
config = get_config_options(current_config, Ns2ScriptedMobility)
|
|
|
|
mapped_config = core_pb2.MappedConfig(config=config)
|
|
|
|
response.configs[node_id].CopyFrom(mapped_config)
|
2019-03-25 19:59:07 +00:00
|
|
|
return response
|
2019-03-17 22:28:51 +00:00
|
|
|
|
|
|
|
def GetMobilityConfig(self, request, context):
|
2019-09-13 19:07:04 +01:00
|
|
|
"""
|
|
|
|
Retrieve mobility configuration of a node
|
|
|
|
|
2019-10-22 17:57:41 +01:00
|
|
|
:param core.api.grpc.core_pb2.GetMobilityConfigRequest request:
|
|
|
|
get-mobility-configuration request
|
2019-09-13 19:07:04 +01:00
|
|
|
:param grpc.ServicerContext context: context object
|
|
|
|
:return: get-mobility-configuration response
|
|
|
|
:rtype: core.api.grpc.core_pb2.GetMobilityConfigResponse
|
|
|
|
"""
|
2019-03-20 04:43:11 +00:00
|
|
|
logging.debug("get mobility config: %s", request)
|
2019-05-28 22:31:34 +01:00
|
|
|
session = self.get_session(request.session_id, context)
|
2019-10-22 17:57:41 +01:00
|
|
|
current_config = session.mobility.get_model_config(
|
2019-09-10 23:10:24 +01:00
|
|
|
request.node_id, Ns2ScriptedMobility.name
|
|
|
|
)
|
2019-10-22 17:57:41 +01:00
|
|
|
config = get_config_options(current_config, Ns2ScriptedMobility)
|
|
|
|
return core_pb2.GetMobilityConfigResponse(config=config)
|
2019-03-17 22:28:51 +00:00
|
|
|
|
|
|
|
def SetMobilityConfig(self, request, context):
|
2019-09-13 19:07:04 +01:00
|
|
|
"""
|
|
|
|
Set mobility configuration of a node
|
|
|
|
|
2019-10-22 17:57:41 +01:00
|
|
|
:param core.api.grpc.core_pb2.SetMobilityConfigRequest request:
|
|
|
|
set-mobility-configuration request
|
2019-09-13 19:07:04 +01:00
|
|
|
:param grpc.ServicerContext context: context object
|
|
|
|
:return: set-mobility-configuration response
|
|
|
|
"rtype" core.api.grpc.SetMobilityConfigResponse
|
|
|
|
"""
|
2019-03-20 04:43:11 +00:00
|
|
|
logging.debug("set mobility config: %s", request)
|
2019-05-28 22:31:34 +01:00
|
|
|
session = self.get_session(request.session_id, context)
|
2019-10-29 21:40:37 +00:00
|
|
|
mobility_config = request.mobility_config
|
2019-09-10 23:10:24 +01:00
|
|
|
session.mobility.set_model_config(
|
2019-10-29 21:40:37 +00:00
|
|
|
mobility_config.node_id, Ns2ScriptedMobility.name, mobility_config.config
|
2019-09-10 23:10:24 +01:00
|
|
|
)
|
2019-03-23 00:07:54 +00:00
|
|
|
return core_pb2.SetMobilityConfigResponse(result=True)
|
2019-03-17 22:28:51 +00:00
|
|
|
|
|
|
|
def MobilityAction(self, request, context):
|
2019-09-13 19:07:04 +01:00
|
|
|
"""
|
|
|
|
Take mobility action whether to start, pause, stop or none of those
|
|
|
|
|
2019-10-22 17:57:41 +01:00
|
|
|
:param core.api.grpc.core_pb2.MobilityActionRequest request: mobility-action
|
|
|
|
request
|
2019-09-13 19:07:04 +01:00
|
|
|
:param grpc.ServicerContext context: context object
|
|
|
|
:return: mobility-action response
|
|
|
|
:rtype: core.api.grpc.core_pb2.MobilityActionResponse
|
|
|
|
"""
|
2019-03-20 04:43:11 +00:00
|
|
|
logging.debug("mobility action: %s", request)
|
2019-05-28 22:31:34 +01:00
|
|
|
session = self.get_session(request.session_id, context)
|
|
|
|
node = self.get_node(session, request.node_id, context)
|
2019-03-23 00:07:54 +00:00
|
|
|
result = True
|
2019-05-30 16:57:24 +01:00
|
|
|
if request.action == core_pb2.MobilityAction.START:
|
2019-03-17 22:28:51 +00:00
|
|
|
node.mobility.start()
|
2019-05-30 16:57:24 +01:00
|
|
|
elif request.action == core_pb2.MobilityAction.PAUSE:
|
2019-03-17 22:28:51 +00:00
|
|
|
node.mobility.pause()
|
2019-05-30 16:57:24 +01:00
|
|
|
elif request.action == core_pb2.MobilityAction.STOP:
|
2019-03-17 22:28:51 +00:00
|
|
|
node.mobility.stop(move_initial=True)
|
|
|
|
else:
|
2019-03-23 00:07:54 +00:00
|
|
|
result = False
|
|
|
|
return core_pb2.MobilityActionResponse(result=result)
|
2019-03-17 22:28:51 +00:00
|
|
|
|
2019-03-02 06:14:16 +00:00
|
|
|
def GetServices(self, request, context):
|
2019-09-13 19:07:04 +01:00
|
|
|
"""
|
|
|
|
Retrieve all the services that are running
|
|
|
|
|
|
|
|
:param core.api.grpc.core_pb2.GetServicesRequest request: get-service request
|
|
|
|
:param grpc.ServicerContext context: context object
|
|
|
|
:return: get-services response
|
|
|
|
:rtype: core.api.grpc.core_pb2.GetServicesResponse
|
|
|
|
"""
|
2019-03-20 04:43:11 +00:00
|
|
|
logging.debug("get services: %s", request)
|
2019-03-23 00:07:54 +00:00
|
|
|
services = []
|
2019-05-06 05:23:43 +01:00
|
|
|
for name in ServiceManager.services:
|
|
|
|
service = ServiceManager.services[name]
|
2019-03-23 00:07:54 +00:00
|
|
|
service_proto = core_pb2.Service(group=service.group, name=service.name)
|
|
|
|
services.append(service_proto)
|
|
|
|
return core_pb2.GetServicesResponse(services=services)
|
2019-03-02 06:14:16 +00:00
|
|
|
|
2019-03-15 05:33:10 +00:00
|
|
|
def GetServiceDefaults(self, request, context):
|
2019-09-13 19:07:04 +01:00
|
|
|
"""
|
|
|
|
Retrieve all the default services of all node types in a session
|
|
|
|
|
2019-10-22 17:57:41 +01:00
|
|
|
:param core.api.grpc.core_pb2.GetServiceDefaultsRequest request:
|
|
|
|
get-default-service request
|
2019-09-13 19:07:04 +01:00
|
|
|
:param grpc.ServicerContext context: context object
|
|
|
|
:return: get-service-defaults response about all the available default services
|
|
|
|
:rtype: core.api.grpc.core_pb2.GetServiceDefaultsResponse
|
|
|
|
"""
|
2019-03-20 04:43:11 +00:00
|
|
|
logging.debug("get service defaults: %s", request)
|
2019-05-28 22:31:34 +01:00
|
|
|
session = self.get_session(request.session_id, context)
|
2019-03-23 00:07:54 +00:00
|
|
|
all_service_defaults = []
|
2019-03-15 05:33:10 +00:00
|
|
|
for node_type in session.services.default_services:
|
|
|
|
services = session.services.default_services[node_type]
|
2019-09-10 23:10:24 +01:00
|
|
|
service_defaults = core_pb2.ServiceDefaults(
|
|
|
|
node_type=node_type, services=services
|
|
|
|
)
|
2019-03-23 00:07:54 +00:00
|
|
|
all_service_defaults.append(service_defaults)
|
|
|
|
return core_pb2.GetServiceDefaultsResponse(defaults=all_service_defaults)
|
2019-03-15 05:33:10 +00:00
|
|
|
|
|
|
|
def SetServiceDefaults(self, request, context):
|
2019-09-14 00:21:07 +01:00
|
|
|
"""
|
|
|
|
Set new default services to the session after whipping out the old ones
|
2019-10-22 17:57:41 +01:00
|
|
|
:param core.api.grpc.core_pb2.SetServiceDefaults request: set-service-defaults
|
|
|
|
request
|
2019-09-14 00:21:07 +01:00
|
|
|
:param grpc.ServicerContext context: context object
|
|
|
|
:return: set-service-defaults response
|
|
|
|
:rtype: core.api.grpc.core_pb2 SetServiceDefaultsResponse
|
|
|
|
"""
|
2019-03-20 04:43:11 +00:00
|
|
|
logging.debug("set service defaults: %s", request)
|
2019-05-28 22:31:34 +01:00
|
|
|
session = self.get_session(request.session_id, context)
|
2019-03-15 05:33:10 +00:00
|
|
|
session.services.default_services.clear()
|
|
|
|
for service_defaults in request.defaults:
|
2019-09-10 23:10:24 +01:00
|
|
|
session.services.default_services[
|
|
|
|
service_defaults.node_type
|
|
|
|
] = service_defaults.services
|
2019-03-23 00:07:54 +00:00
|
|
|
return core_pb2.SetServiceDefaultsResponse(result=True)
|
2019-03-15 05:33:10 +00:00
|
|
|
|
|
|
|
def GetNodeService(self, request, context):
|
2019-09-13 19:07:04 +01:00
|
|
|
"""
|
|
|
|
Retrieve a requested service from a node
|
|
|
|
|
2019-10-22 17:57:41 +01:00
|
|
|
:param core.api.grpc.core_pb2.GetNodeServiceRequest request: get-node-service
|
|
|
|
request
|
2019-09-13 19:07:04 +01:00
|
|
|
:param grpc.ServicerContext context: context object
|
|
|
|
:return: get-node-service response about the requested service
|
|
|
|
:rtype: core.api.grpc.core_pb2.GetNodeServiceResponse
|
|
|
|
"""
|
2019-03-20 04:43:11 +00:00
|
|
|
logging.debug("get node service: %s", request)
|
2019-05-28 22:31:34 +01:00
|
|
|
session = self.get_session(request.session_id, context)
|
2019-09-10 23:10:24 +01:00
|
|
|
service = session.services.get_service(
|
|
|
|
request.node_id, request.service, default_service=True
|
|
|
|
)
|
2019-03-23 00:07:54 +00:00
|
|
|
service_proto = core_pb2.NodeServiceData(
|
|
|
|
executables=service.executables,
|
|
|
|
dependencies=service.dependencies,
|
|
|
|
dirs=service.dirs,
|
|
|
|
configs=service.configs,
|
|
|
|
startup=service.startup,
|
|
|
|
validate=service.validate,
|
|
|
|
validation_mode=service.validation_mode.value,
|
|
|
|
validation_timer=service.validation_timer,
|
|
|
|
shutdown=service.shutdown,
|
2019-09-10 23:10:24 +01:00
|
|
|
meta=service.meta,
|
2019-03-23 00:07:54 +00:00
|
|
|
)
|
|
|
|
return core_pb2.GetNodeServiceResponse(service=service_proto)
|
2019-03-15 05:33:10 +00:00
|
|
|
|
2019-03-17 03:53:26 +00:00
|
|
|
def GetNodeServiceFile(self, request, context):
|
2019-09-13 19:07:04 +01:00
|
|
|
"""
|
|
|
|
Retrieve a requested service file from a node
|
|
|
|
|
2019-10-22 17:57:41 +01:00
|
|
|
:param core.api.grpc.core_pb2.GetNodeServiceFileRequest request:
|
|
|
|
get-node-service request
|
2019-09-13 19:07:04 +01:00
|
|
|
:param grpc.ServicerContext context: context object
|
|
|
|
:return: get-node-service response about the requested service
|
|
|
|
:rtype: core.api.grpc.core_pb2.GetNodeServiceFileResponse
|
|
|
|
"""
|
2019-03-20 04:43:11 +00:00
|
|
|
logging.debug("get node service file: %s", request)
|
2019-05-28 22:31:34 +01:00
|
|
|
session = self.get_session(request.session_id, context)
|
|
|
|
node = self.get_node(session, request.node_id, context)
|
2019-03-17 03:53:26 +00:00
|
|
|
service = None
|
|
|
|
for current_service in node.services:
|
|
|
|
if current_service.name == request.service:
|
|
|
|
service = current_service
|
|
|
|
break
|
|
|
|
if not service:
|
2019-03-23 00:07:54 +00:00
|
|
|
context.abort(grpc.StatusCode.NOT_FOUND, "service not found")
|
2019-09-10 23:10:24 +01:00
|
|
|
file_data = session.services.get_service_file(
|
|
|
|
node, request.service, request.file
|
|
|
|
)
|
2019-03-23 00:07:54 +00:00
|
|
|
return core_pb2.GetNodeServiceFileResponse(data=file_data.data)
|
2019-03-17 03:53:26 +00:00
|
|
|
|
2019-03-17 04:40:15 +00:00
|
|
|
def SetNodeService(self, request, context):
|
2019-09-13 19:07:04 +01:00
|
|
|
"""
|
|
|
|
Set a node service for a node
|
|
|
|
|
2019-10-22 17:57:41 +01:00
|
|
|
:param core.api.grpc.core_pb2.SetNodeServiceRequest request: set-node-service
|
|
|
|
request that has info to set a node service
|
2019-09-13 19:07:04 +01:00
|
|
|
:param grpc.ServicerContext context: context object
|
|
|
|
:return: set-node-service response
|
|
|
|
:rtype: core.api.grpc.core_pb2.SetNodeServiceResponse
|
|
|
|
"""
|
2019-03-20 04:43:11 +00:00
|
|
|
logging.debug("set node service: %s", request)
|
2019-05-28 22:31:34 +01:00
|
|
|
session = self.get_session(request.session_id, context)
|
2019-11-11 18:19:30 +00:00
|
|
|
config = request.config
|
|
|
|
grpcutils.service_configuration(session, config)
|
2019-03-23 00:07:54 +00:00
|
|
|
return core_pb2.SetNodeServiceResponse(result=True)
|
2019-03-17 04:40:15 +00:00
|
|
|
|
|
|
|
def SetNodeServiceFile(self, request, context):
|
2019-09-13 19:07:04 +01:00
|
|
|
"""
|
|
|
|
Store the customized service file in the service config
|
|
|
|
|
2019-10-22 17:57:41 +01:00
|
|
|
:param core.api.grpc.core_pb2.SetNodeServiceFileRequest request:
|
|
|
|
set-node-service-file request
|
2019-09-13 19:07:04 +01:00
|
|
|
:param grpc.ServicerContext context: context object
|
|
|
|
:return: set-node-service-file response
|
|
|
|
:rtype: core.api.grpc.core_pb2.SetNodeServiceFileResponse
|
|
|
|
"""
|
2019-03-20 04:43:11 +00:00
|
|
|
logging.debug("set node service file: %s", request)
|
2019-05-28 22:31:34 +01:00
|
|
|
session = self.get_session(request.session_id, context)
|
2019-11-11 18:19:30 +00:00
|
|
|
config = request.config
|
2019-09-10 23:10:24 +01:00
|
|
|
session.services.set_service_file(
|
2019-11-11 18:19:30 +00:00
|
|
|
config.node_id, config.service, config.file, config.data
|
2019-09-10 23:10:24 +01:00
|
|
|
)
|
2019-03-23 00:07:54 +00:00
|
|
|
return core_pb2.SetNodeServiceFileResponse(result=True)
|
2019-03-17 04:40:15 +00:00
|
|
|
|
2019-03-17 03:53:26 +00:00
|
|
|
def ServiceAction(self, request, context):
|
2019-09-13 19:07:04 +01:00
|
|
|
"""
|
|
|
|
Take action whether to start, stop, restart, validate the service or none of the above
|
|
|
|
|
|
|
|
:param core.api.grpc.core_pb2.ServiceActionRequest request: service-action request
|
|
|
|
:param grpcServicerContext context: context object
|
|
|
|
:return: service-action response about status of action
|
|
|
|
:rtype: core.api.grpc.core_pb2.ServiceActionResponse
|
|
|
|
"""
|
2019-03-20 04:43:11 +00:00
|
|
|
logging.debug("service action: %s", request)
|
2019-05-28 22:31:34 +01:00
|
|
|
session = self.get_session(request.session_id, context)
|
|
|
|
node = self.get_node(session, request.node_id, context)
|
2019-03-17 03:53:26 +00:00
|
|
|
service = None
|
|
|
|
for current_service in node.services:
|
|
|
|
if current_service.name == request.service:
|
|
|
|
service = current_service
|
|
|
|
break
|
|
|
|
|
|
|
|
if not service:
|
2019-03-23 00:07:54 +00:00
|
|
|
context.abort(grpc.StatusCode.NOT_FOUND, "service not found")
|
2019-03-17 03:53:26 +00:00
|
|
|
|
|
|
|
status = -1
|
2019-05-30 16:57:24 +01:00
|
|
|
if request.action == core_pb2.ServiceAction.START:
|
2019-03-17 03:53:26 +00:00
|
|
|
status = session.services.startup_service(node, service, wait=True)
|
2019-05-30 16:57:24 +01:00
|
|
|
elif request.action == core_pb2.ServiceAction.STOP:
|
2019-03-17 03:53:26 +00:00
|
|
|
status = session.services.stop_service(node, service)
|
2019-05-30 16:57:24 +01:00
|
|
|
elif request.action == core_pb2.ServiceAction.RESTART:
|
2019-03-17 03:53:26 +00:00
|
|
|
status = session.services.stop_service(node, service)
|
|
|
|
if not status:
|
|
|
|
status = session.services.startup_service(node, service, wait=True)
|
2019-05-30 16:57:24 +01:00
|
|
|
elif request.action == core_pb2.ServiceAction.VALIDATE:
|
2019-03-17 03:53:26 +00:00
|
|
|
status = session.services.validate_service(node, service)
|
|
|
|
|
2019-03-23 00:07:54 +00:00
|
|
|
result = False
|
2019-03-17 03:53:26 +00:00
|
|
|
if not status:
|
2019-03-23 00:07:54 +00:00
|
|
|
result = True
|
2019-03-17 03:53:26 +00:00
|
|
|
|
2019-03-23 00:07:54 +00:00
|
|
|
return core_pb2.ServiceActionResponse(result=result)
|
2019-03-17 03:53:26 +00:00
|
|
|
|
2019-03-16 19:48:37 +00:00
|
|
|
def GetWlanConfig(self, request, context):
|
2019-09-13 19:07:04 +01:00
|
|
|
"""
|
|
|
|
Retrieve wireless-lan configuration of a node
|
|
|
|
|
|
|
|
:param core.api.grpc.core_pb2.GetWlanConfigRequest request: get-wlan-configuration request
|
|
|
|
:param context: core.api.grpc.core_pb2.GetWlanConfigResponse
|
|
|
|
:return: get-wlan-configuration response about the wlan configuration of a node
|
|
|
|
:rtype: core.api.grpc.core_pb2.GetWlanConfigResponse
|
|
|
|
"""
|
2019-03-20 04:43:11 +00:00
|
|
|
logging.debug("get wlan config: %s", request)
|
2019-05-28 22:31:34 +01:00
|
|
|
session = self.get_session(request.session_id, context)
|
2019-10-22 17:57:41 +01:00
|
|
|
current_config = session.mobility.get_model_config(
|
2019-09-10 23:10:24 +01:00
|
|
|
request.node_id, BasicRangeModel.name
|
|
|
|
)
|
2019-10-22 17:57:41 +01:00
|
|
|
config = get_config_options(current_config, BasicRangeModel)
|
|
|
|
return core_pb2.GetWlanConfigResponse(config=config)
|
2019-03-16 19:48:37 +00:00
|
|
|
|
|
|
|
def SetWlanConfig(self, request, context):
|
2019-09-13 19:07:04 +01:00
|
|
|
"""
|
|
|
|
Set configuration data for a model
|
|
|
|
|
|
|
|
:param core.api.grpc.core_pb2.SetWlanConfigRequest request: set-wlan-configuration request
|
|
|
|
:param grpc.ServicerContext context: context object
|
|
|
|
:return: set-wlan-configuration response
|
|
|
|
:rtype: core.api.grpc.core_pb2.SetWlanConfigResponse
|
|
|
|
"""
|
2019-03-20 04:43:11 +00:00
|
|
|
logging.debug("set wlan config: %s", request)
|
2019-05-28 22:31:34 +01:00
|
|
|
session = self.get_session(request.session_id, context)
|
2019-10-29 20:37:37 +00:00
|
|
|
wlan_config = request.wlan_config
|
2019-09-10 23:10:24 +01:00
|
|
|
session.mobility.set_model_config(
|
2019-10-29 20:37:37 +00:00
|
|
|
wlan_config.node_id, BasicRangeModel.name, wlan_config.config
|
2019-09-10 23:10:24 +01:00
|
|
|
)
|
2019-06-11 21:11:36 +01:00
|
|
|
if session.state == EventTypes.RUNTIME_STATE.value:
|
2019-10-29 20:37:37 +00:00
|
|
|
node = self.get_node(session, wlan_config.node_id, context)
|
|
|
|
node.updatemodel(wlan_config.config)
|
2019-03-23 00:07:54 +00:00
|
|
|
return core_pb2.SetWlanConfigResponse(result=True)
|
2019-03-16 19:48:37 +00:00
|
|
|
|
2019-03-02 06:14:16 +00:00
|
|
|
def GetEmaneConfig(self, request, context):
|
2019-09-13 19:07:04 +01:00
|
|
|
"""
|
|
|
|
Retrieve EMANE configuration of a session
|
|
|
|
|
|
|
|
:param core.api.grpc.core_pb2.GetEmanConfigRequest request: get-EMANE-configuration request
|
|
|
|
:param grpc.ServicerContext context: context object
|
|
|
|
:return: get-EMANE-configuration response
|
|
|
|
:rtype: core.api.grpc.core_pb2.GetEmaneConfigResponse
|
|
|
|
"""
|
2019-03-20 04:43:11 +00:00
|
|
|
logging.debug("get emane config: %s", request)
|
2019-05-28 22:31:34 +01:00
|
|
|
session = self.get_session(request.session_id, context)
|
2019-10-22 17:57:41 +01:00
|
|
|
current_config = session.emane.get_configs()
|
|
|
|
config = get_config_options(current_config, session.emane.emane_config)
|
|
|
|
return core_pb2.GetEmaneConfigResponse(config=config)
|
2019-03-02 06:14:16 +00:00
|
|
|
|
2019-03-16 05:03:37 +00:00
|
|
|
def SetEmaneConfig(self, request, context):
|
2019-09-13 19:07:04 +01:00
|
|
|
"""
|
|
|
|
Set EMANE configuration of a session
|
|
|
|
|
|
|
|
:param core.api.grpc.core_pb2.SetEmaneConfigRequest request: set-EMANE-configuration request
|
|
|
|
:param grpc.ServicerContext context: context object
|
|
|
|
:return: set-EMANE-configuration response
|
|
|
|
:rtype: core.api.grpc.core_pb2.SetEmaneConfigResponse
|
|
|
|
"""
|
2019-03-20 04:43:11 +00:00
|
|
|
logging.debug("set emane config: %s", request)
|
2019-05-28 22:31:34 +01:00
|
|
|
session = self.get_session(request.session_id, context)
|
2019-03-24 21:13:04 +00:00
|
|
|
config = session.emane.get_configs()
|
|
|
|
config.update(request.config)
|
2019-03-23 00:07:54 +00:00
|
|
|
return core_pb2.SetEmaneConfigResponse(result=True)
|
2019-03-16 05:03:37 +00:00
|
|
|
|
2019-03-16 04:38:29 +00:00
|
|
|
def GetEmaneModels(self, request, context):
|
2019-09-13 19:07:04 +01:00
|
|
|
"""
|
|
|
|
Retrieve all the EMANE models in the session
|
|
|
|
|
2019-09-14 00:21:07 +01:00
|
|
|
:param core.api.grpc.core_pb2.GetEmaneModelRequest request: get-emane-model request
|
|
|
|
:param grpc.ServicerContext context: context object
|
|
|
|
:return: get-EMANE-models response that has all the models
|
|
|
|
:rtype: core.api.grpc.core_pb2.GetEmaneModelsResponse
|
2019-09-13 19:07:04 +01:00
|
|
|
"""
|
2019-03-20 04:43:11 +00:00
|
|
|
logging.debug("get emane models: %s", request)
|
2019-05-28 22:31:34 +01:00
|
|
|
session = self.get_session(request.session_id, context)
|
2019-03-16 04:38:29 +00:00
|
|
|
models = []
|
|
|
|
for model in session.emane.models.keys():
|
|
|
|
if len(model.split("_")) != 2:
|
|
|
|
continue
|
|
|
|
models.append(model)
|
2019-03-23 00:07:54 +00:00
|
|
|
return core_pb2.GetEmaneModelsResponse(models=models)
|
2019-03-16 04:38:29 +00:00
|
|
|
|
|
|
|
def GetEmaneModelConfig(self, request, context):
|
2019-09-14 00:21:07 +01:00
|
|
|
"""
|
|
|
|
Retrieve EMANE model configuration of a node
|
|
|
|
|
2019-10-22 17:57:41 +01:00
|
|
|
:param core.api.grpc.core_pb2.GetEmaneModelConfigRequest request:
|
|
|
|
get-EMANE-model-configuration request
|
2019-09-14 00:21:07 +01:00
|
|
|
:param grpc.ServicerContext context: context object
|
|
|
|
:return: get-EMANE-model-configuration response
|
|
|
|
:rtype: core.api.grpc.core_pb2.GetEmaneModelConfigResponse
|
|
|
|
"""
|
2019-03-20 04:43:11 +00:00
|
|
|
logging.debug("get emane model config: %s", request)
|
2019-05-28 22:31:34 +01:00
|
|
|
session = self.get_session(request.session_id, context)
|
2019-03-16 04:38:29 +00:00
|
|
|
model = session.emane.models[request.model]
|
2019-05-28 22:31:34 +01:00
|
|
|
_id = get_emane_model_id(request.node_id, request.interface)
|
2019-10-22 17:57:41 +01:00
|
|
|
current_config = session.emane.get_model_config(_id, request.model)
|
|
|
|
config = get_config_options(current_config, model)
|
|
|
|
return core_pb2.GetEmaneModelConfigResponse(config=config)
|
2019-03-16 04:38:29 +00:00
|
|
|
|
2019-03-16 05:03:37 +00:00
|
|
|
def SetEmaneModelConfig(self, request, context):
|
2019-09-14 00:21:07 +01:00
|
|
|
"""
|
|
|
|
Set EMANE model configuration of a node
|
|
|
|
|
2019-10-22 17:57:41 +01:00
|
|
|
:param core.api.grpc.core_pb2.SetEmaneModelConfigRequest request:
|
|
|
|
set-EMANE-model-configuration request
|
2019-09-14 00:21:07 +01:00
|
|
|
:param grpc.ServicerContext context: context object
|
|
|
|
:return: set-EMANE-model-configuration response
|
|
|
|
:rtype: core.api.grpc.core_pb2.SetEmaneModelConfigResponse
|
|
|
|
"""
|
2019-03-20 04:43:11 +00:00
|
|
|
logging.debug("set emane model config: %s", request)
|
2019-05-28 22:31:34 +01:00
|
|
|
session = self.get_session(request.session_id, context)
|
2019-10-29 21:40:37 +00:00
|
|
|
model_config = request.emane_model_config
|
|
|
|
_id = get_emane_model_id(model_config.node_id, model_config.interface_id)
|
|
|
|
session.emane.set_model_config(_id, model_config.model, model_config.config)
|
2019-03-23 00:07:54 +00:00
|
|
|
return core_pb2.SetEmaneModelConfigResponse(result=True)
|
2019-03-16 05:03:37 +00:00
|
|
|
|
2019-03-16 04:38:29 +00:00
|
|
|
def GetEmaneModelConfigs(self, request, context):
|
2019-09-14 00:21:07 +01:00
|
|
|
"""
|
|
|
|
Retrieve all EMANE model configurations of a session
|
|
|
|
|
2019-10-22 17:57:41 +01:00
|
|
|
:param core.api.grpc.core_pb2.GetEmaneModelConfigsRequest request:
|
|
|
|
get-EMANE-model-configurations request
|
2019-09-14 00:21:07 +01:00
|
|
|
:param grpc.ServicerContext context: context object
|
2019-10-22 17:57:41 +01:00
|
|
|
:return: get-EMANE-model-configurations response that has all the EMANE
|
|
|
|
configurations
|
2019-09-14 00:21:07 +01:00
|
|
|
:rtype: core.api.grpc.core_pb2.GetEmaneModelConfigsResponse
|
|
|
|
"""
|
2019-03-20 04:43:11 +00:00
|
|
|
logging.debug("get emane model configs: %s", request)
|
2019-05-28 22:31:34 +01:00
|
|
|
session = self.get_session(request.session_id, context)
|
2019-03-16 04:38:29 +00:00
|
|
|
response = core_pb2.GetEmaneModelConfigsResponse()
|
2019-05-06 05:23:43 +01:00
|
|
|
for node_id in session.emane.node_configurations:
|
|
|
|
model_config = session.emane.node_configurations[node_id]
|
2019-03-16 04:38:29 +00:00
|
|
|
if node_id == -1:
|
|
|
|
continue
|
|
|
|
|
2019-05-06 05:23:43 +01:00
|
|
|
for model_name in model_config:
|
2019-03-16 04:38:29 +00:00
|
|
|
model = session.emane.models[model_name]
|
2019-10-22 17:57:41 +01:00
|
|
|
current_config = session.emane.get_model_config(node_id, model_name)
|
|
|
|
config = get_config_options(current_config, model)
|
|
|
|
model_config = core_pb2.GetEmaneModelConfigsResponse.ModelConfig(
|
|
|
|
model=model_name, config=config
|
|
|
|
)
|
|
|
|
response.configs[node_id].CopyFrom(model_config)
|
2019-03-16 04:38:29 +00:00
|
|
|
return response
|
|
|
|
|
2019-03-02 21:44:27 +00:00
|
|
|
def SaveXml(self, request, context):
|
2019-09-13 19:07:04 +01:00
|
|
|
"""
|
|
|
|
Export the session nto the EmulationScript XML format
|
|
|
|
|
|
|
|
:param core.api.grpc.core_pb2.SaveXmlRequest request: save xml request
|
|
|
|
:param grpc SrvicerContext context: context object
|
|
|
|
:return: save-xml response
|
|
|
|
:rtype: core.api.grpc.core_pb2.SaveXmlResponse
|
|
|
|
"""
|
2019-03-20 04:43:11 +00:00
|
|
|
logging.debug("save xml: %s", request)
|
2019-05-28 22:31:34 +01:00
|
|
|
session = self.get_session(request.session_id, context)
|
2019-03-02 21:44:27 +00:00
|
|
|
|
|
|
|
_, temp_path = tempfile.mkstemp()
|
|
|
|
session.save_xml(temp_path)
|
|
|
|
|
2019-06-03 21:34:54 +01:00
|
|
|
with open(temp_path, "r") as xml_file:
|
2019-03-02 21:44:27 +00:00
|
|
|
data = xml_file.read()
|
|
|
|
|
2019-03-23 00:07:54 +00:00
|
|
|
return core_pb2.SaveXmlResponse(data=data)
|
2019-03-02 21:44:27 +00:00
|
|
|
|
|
|
|
def OpenXml(self, request, context):
|
2019-09-13 19:07:04 +01:00
|
|
|
"""
|
|
|
|
Import a session from the EmulationScript XML format
|
|
|
|
|
|
|
|
:param core.api.grpc.OpenXmlRequest request: open-xml request
|
|
|
|
:param grpc.ServicerContext context: context object
|
|
|
|
:return: Open-XML response or raise an exception if invalid XML file
|
|
|
|
:rtype: core.api.grpc.core_pb2.OpenXMLResponse
|
|
|
|
"""
|
2019-03-20 04:43:11 +00:00
|
|
|
logging.debug("open xml: %s", request)
|
2019-03-02 21:44:27 +00:00
|
|
|
session = self.coreemu.create_session()
|
|
|
|
|
2019-10-22 20:08:55 +01:00
|
|
|
temp = tempfile.NamedTemporaryFile(delete=False)
|
|
|
|
temp.write(request.data.encode("utf-8"))
|
|
|
|
temp.close()
|
2019-03-02 21:44:27 +00:00
|
|
|
|
|
|
|
try:
|
2019-10-22 20:08:55 +01:00
|
|
|
session.open_xml(temp.name, request.start)
|
|
|
|
session.name = os.path.basename(request.file)
|
|
|
|
session.file_name = request.file
|
2019-05-28 22:31:34 +01:00
|
|
|
return core_pb2.OpenXmlResponse(session_id=session.id, result=True)
|
2019-03-23 00:07:54 +00:00
|
|
|
except IOError:
|
2019-03-02 21:44:27 +00:00
|
|
|
logging.exception("error opening session file")
|
2019-04-08 18:39:36 +01:00
|
|
|
self.coreemu.delete_session(session.id)
|
2019-03-23 00:07:54 +00:00
|
|
|
context.abort(grpc.StatusCode.INVALID_ARGUMENT, "invalid xml file")
|
2019-10-22 20:08:55 +01:00
|
|
|
finally:
|
|
|
|
os.unlink(temp.name)
|
2019-07-12 21:02:15 +01:00
|
|
|
|
|
|
|
def GetInterfaces(self, request, context):
|
2019-09-14 00:21:07 +01:00
|
|
|
"""
|
|
|
|
Retrieve all the interfaces of the system including bridges, virtual ethernet, and loopback
|
|
|
|
|
|
|
|
:param core.api.grpc.core_pb2.GetInterfacesRequest request: get-interfaces request
|
|
|
|
:param grpc.ServicerContext context: context object
|
|
|
|
:return: get-interfaces response that has all the system's interfaces
|
|
|
|
:rtype: core.api.grpc.core_pb2.GetInterfacesResponse
|
|
|
|
"""
|
2019-07-12 21:02:15 +01:00
|
|
|
interfaces = []
|
|
|
|
for interface in os.listdir("/sys/class/net"):
|
2019-09-10 23:10:24 +01:00
|
|
|
if (
|
|
|
|
interface.startswith("b.")
|
|
|
|
or interface.startswith("veth")
|
|
|
|
or interface == "lo"
|
|
|
|
):
|
2019-07-12 21:02:15 +01:00
|
|
|
continue
|
|
|
|
interfaces.append(interface)
|
|
|
|
return core_pb2.GetInterfacesResponse(interfaces=interfaces)
|
2019-10-12 16:56:39 +01:00
|
|
|
|
|
|
|
def EmaneLink(self, request, context):
|
|
|
|
"""
|
|
|
|
Helps broadcast wireless link/unlink between EMANE nodes.
|
|
|
|
|
|
|
|
:param core.api.grpc.core_pb2.EmaneLinkRequest request: get-interfaces request
|
|
|
|
:param grpc.ServicerContext context: context object
|
|
|
|
:return: emane link response with success status
|
|
|
|
:rtype: core.api.grpc.core_pb2.EmaneLinkResponse
|
|
|
|
"""
|
|
|
|
logging.debug("emane link: %s", request)
|
|
|
|
session = self.get_session(request.session_id, context)
|
|
|
|
nem_one = request.nem_one
|
|
|
|
emane_one, netif = session.emane.nemlookup(nem_one)
|
|
|
|
if not emane_one or not netif:
|
2019-10-18 20:55:35 +01:00
|
|
|
context.abort(grpc.StatusCode.NOT_FOUND, f"nem one {nem_one} not found")
|
2019-10-12 16:56:39 +01:00
|
|
|
node_one = netif.node
|
|
|
|
|
|
|
|
nem_two = request.nem_two
|
|
|
|
emane_two, netif = session.emane.nemlookup(nem_two)
|
|
|
|
if not emane_two or not netif:
|
2019-10-18 20:55:35 +01:00
|
|
|
context.abort(grpc.StatusCode.NOT_FOUND, f"nem two {nem_two} not found")
|
2019-10-12 16:56:39 +01:00
|
|
|
node_two = netif.node
|
|
|
|
|
|
|
|
if emane_one.id == emane_two.id:
|
|
|
|
if request.linked:
|
|
|
|
flag = MessageFlags.ADD.value
|
|
|
|
else:
|
|
|
|
flag = MessageFlags.DELETE.value
|
|
|
|
link = LinkData(
|
|
|
|
message_type=flag,
|
|
|
|
link_type=LinkTypes.WIRELESS.value,
|
|
|
|
node1_id=node_one.id,
|
|
|
|
node2_id=node_two.id,
|
|
|
|
network_id=emane_one.id,
|
|
|
|
)
|
|
|
|
session.broadcast_link(link)
|
|
|
|
return core_pb2.EmaneLinkResponse(result=True)
|
|
|
|
else:
|
|
|
|
return core_pb2.EmaneLinkResponse(result=False)
|