grpc added save/open xml, fixed session.get_node_count(), fixed issue with grpc get session options
This commit is contained in:
parent
0ccf5a7456
commit
0c20e76630
4 changed files with 145 additions and 62 deletions
|
@ -1,5 +1,6 @@
|
||||||
from __future__ import print_function
|
from __future__ import print_function
|
||||||
import logging
|
import logging
|
||||||
|
import os
|
||||||
from contextlib import contextmanager
|
from contextlib import contextmanager
|
||||||
|
|
||||||
import grpc
|
import grpc
|
||||||
|
@ -220,6 +221,21 @@ class CoreApiClient(object):
|
||||||
request.session = session
|
request.session = session
|
||||||
return self.stub.GetEmaneConfig(request)
|
return self.stub.GetEmaneConfig(request)
|
||||||
|
|
||||||
|
def save_xml(self, session, file_path):
|
||||||
|
request = core_pb2.SaveXmlRequest()
|
||||||
|
request.session = session
|
||||||
|
response = self.stub.SaveXml(request)
|
||||||
|
with open(file_path, "wb") as xml_file:
|
||||||
|
xml_file.write(response.data)
|
||||||
|
|
||||||
|
def open_xml(self, file_path):
|
||||||
|
with open(file_path, "rb") as xml_file:
|
||||||
|
data = xml_file.read()
|
||||||
|
|
||||||
|
request = core_pb2.OpenXmlRequest()
|
||||||
|
request.data = data
|
||||||
|
return self.stub.OpenXml(request)
|
||||||
|
|
||||||
@contextmanager
|
@contextmanager
|
||||||
def connect(self):
|
def connect(self):
|
||||||
channel = grpc.insecure_channel(self.address)
|
channel = grpc.insecure_channel(self.address)
|
||||||
|
@ -231,20 +247,22 @@ class CoreApiClient(object):
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
|
xml_file_name = "/tmp/core.xml"
|
||||||
|
|
||||||
client = CoreApiClient()
|
client = CoreApiClient()
|
||||||
with client.connect():
|
with client.connect():
|
||||||
|
if os.path.exists(xml_file_name):
|
||||||
|
print("open xml: %s" % client.open_xml(xml_file_name))
|
||||||
|
|
||||||
print("services: %s" % client.get_services())
|
print("services: %s" % client.get_services())
|
||||||
|
|
||||||
# create session
|
# create session
|
||||||
response = client.create_session()
|
session_data = client.create_session()
|
||||||
print("created session: %s" % response)
|
print("created session: %s" % session_data)
|
||||||
|
|
||||||
response = client.get_sessions()
|
response = client.get_sessions()
|
||||||
print("core client received: %s" % response)
|
print("core client received: %s" % response)
|
||||||
|
|
||||||
if len(response.sessions) > 0:
|
|
||||||
session_data = response.sessions[0]
|
|
||||||
|
|
||||||
print("emane config: %s" % client.get_emane_config(session_data.id))
|
print("emane config: %s" % client.get_emane_config(session_data.id))
|
||||||
|
|
||||||
# set session location
|
# set session location
|
||||||
|
@ -304,6 +322,9 @@ def main():
|
||||||
# get session
|
# get session
|
||||||
print("get session: %s" % client.get_session(session_data.id))
|
print("get session: %s" % client.get_session(session_data.id))
|
||||||
|
|
||||||
|
# save xml
|
||||||
|
client.save_xml(session_data.id, xml_file_name)
|
||||||
|
|
||||||
# delete session
|
# delete session
|
||||||
print("delete session: %s" % client.delete_session(session_data.id))
|
print("delete session: %s" % client.delete_session(session_data.id))
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
import os
|
import os
|
||||||
|
import tempfile
|
||||||
|
|
||||||
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
|
||||||
|
@ -201,7 +202,10 @@ class CoreApiServer(core_pb2_grpc.CoreApiServicer):
|
||||||
session = self.coreemu.sessions.get(request.id)
|
session = self.coreemu.sessions.get(request.id)
|
||||||
|
|
||||||
config = session.options.get_configs()
|
config = session.options.get_configs()
|
||||||
groups = get_config_groups(config, session.options)
|
defaults = session.options.default_values()
|
||||||
|
defaults.update(config)
|
||||||
|
|
||||||
|
groups = get_config_groups(defaults, session.options)
|
||||||
|
|
||||||
response = core_pb2.SessionOptionsResponse()
|
response = core_pb2.SessionOptionsResponse()
|
||||||
response.groups.extend(groups)
|
response.groups.extend(groups)
|
||||||
|
@ -519,6 +523,41 @@ class CoreApiServer(core_pb2_grpc.CoreApiServicer):
|
||||||
response.groups.extend(groups)
|
response.groups.extend(groups)
|
||||||
return response
|
return response
|
||||||
|
|
||||||
|
def SaveXml(self, request, context):
|
||||||
|
session = self.coreemu.sessions.get(request.session)
|
||||||
|
if not session:
|
||||||
|
raise Exception("no session found")
|
||||||
|
|
||||||
|
_, temp_path = tempfile.mkstemp()
|
||||||
|
session.save_xml(temp_path)
|
||||||
|
|
||||||
|
with open(temp_path, "rb") as xml_file:
|
||||||
|
data = xml_file.read()
|
||||||
|
|
||||||
|
response = core_pb2.SaveXmlResponse()
|
||||||
|
response.data = data
|
||||||
|
return response
|
||||||
|
|
||||||
|
def OpenXml(self, request, context):
|
||||||
|
session = self.coreemu.create_session()
|
||||||
|
session.set_state(EventTypes.CONFIGURATION_STATE)
|
||||||
|
|
||||||
|
_, temp_path = tempfile.mkstemp()
|
||||||
|
with open(temp_path, "wb") as xml_file:
|
||||||
|
xml_file.write(request.data)
|
||||||
|
|
||||||
|
response = core_pb2.OpenXmlResponse()
|
||||||
|
try:
|
||||||
|
session.open_xml(temp_path, start=True)
|
||||||
|
response.session = session.session_id
|
||||||
|
response.result = True
|
||||||
|
except:
|
||||||
|
response.result = False
|
||||||
|
logging.exception("error opening session file")
|
||||||
|
self.coreemu.delete_session(session.session_id)
|
||||||
|
|
||||||
|
return response
|
||||||
|
|
||||||
|
|
||||||
def listen(coreemu, address="[::]:50051"):
|
def listen(coreemu, address="[::]:50051"):
|
||||||
logging.info("starting grpc api: %s", address)
|
logging.info("starting grpc api: %s", address)
|
||||||
|
|
|
@ -631,10 +631,12 @@ class Session(object):
|
||||||
"""
|
"""
|
||||||
|
|
||||||
with self._objects_lock:
|
with self._objects_lock:
|
||||||
count = len([x for x in self.objects if not nodeutils.is_node(x, (NodeTypes.PEER_TO_PEER, NodeTypes.CONTROL_NET))])
|
count = len([x for x in self.objects.itervalues()
|
||||||
|
if not nodeutils.is_node(x, (NodeTypes.PEER_TO_PEER, NodeTypes.CONTROL_NET))])
|
||||||
|
|
||||||
# on Linux, GreTapBridges are auto-created, not part of GUI's node count
|
# on Linux, GreTapBridges are auto-created, not part of GUI's node count
|
||||||
count -= len([x for x in self.objects if nodeutils.is_node(x, NodeTypes.TAP_BRIDGE) and not nodeutils.is_node(x, NodeTypes.TUNNEL)])
|
count -= len([x for x in self.objects.itervalues()
|
||||||
|
if nodeutils.is_node(x, NodeTypes.TAP_BRIDGE) and not nodeutils.is_node(x, NodeTypes.TUNNEL)])
|
||||||
|
|
||||||
return count
|
return count
|
||||||
|
|
||||||
|
|
|
@ -39,6 +39,10 @@ service CoreApi {
|
||||||
}
|
}
|
||||||
rpc GetEmaneConfig (GetEmaneConfigRequest) returns (GetEmaneConfigResponse) {
|
rpc GetEmaneConfig (GetEmaneConfigRequest) returns (GetEmaneConfigResponse) {
|
||||||
}
|
}
|
||||||
|
rpc SaveXml (SaveXmlRequest) returns (SaveXmlResponse) {
|
||||||
|
}
|
||||||
|
rpc OpenXml (OpenXmlRequest) returns (OpenXmlResponse) {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// rpc request/response messages
|
// rpc request/response messages
|
||||||
|
@ -216,6 +220,23 @@ message GetEmaneConfigResponse {
|
||||||
repeated ConfigGroup groups = 1;
|
repeated ConfigGroup groups = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
message SaveXmlRequest {
|
||||||
|
int32 session = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
message SaveXmlResponse {
|
||||||
|
bytes data = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
message OpenXmlRequest {
|
||||||
|
bytes data = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
message OpenXmlResponse {
|
||||||
|
bool result = 1;
|
||||||
|
int32 session = 2;
|
||||||
|
}
|
||||||
|
|
||||||
// data structures for messages below
|
// data structures for messages below
|
||||||
enum SessionState {
|
enum SessionState {
|
||||||
NONE = 0;
|
NONE = 0;
|
||||||
|
|
Loading…
Add table
Reference in a new issue