updated open_xml functionality, grpc open_xml can optionally start now, added opened files to grpc get_sessions

This commit is contained in:
Blake Harnden 2019-10-22 12:08:55 -07:00
parent 0a689a3e96
commit f39b7e9f96
6 changed files with 29 additions and 16 deletions

View file

@ -880,17 +880,18 @@ class CoreGrpcClient(object):
with open(file_path, "w") as xml_file: with open(file_path, "w") as xml_file:
xml_file.write(response.data) xml_file.write(response.data)
def open_xml(self, file_path): def open_xml(self, file_path, start=False):
""" """
Load a local scenario XML file to open as a new session. Load a local scenario XML file to open as a new session.
:param str file_path: path of scenario XML file :param str file_path: path of scenario XML file
:param bool start: True to start session, False otherwise
:return: response with opened session id :return: response with opened session id
:rtype: core_pb2.OpenXmlResponse :rtype: core_pb2.OpenXmlResponse
""" """
with open(file_path, "r") as xml_file: with open(file_path, "r") as xml_file:
data = xml_file.read() data = xml_file.read()
request = core_pb2.OpenXmlRequest(data=data) request = core_pb2.OpenXmlRequest(data=data, start=start, file=file_path)
return self.stub.OpenXml(request) return self.stub.OpenXml(request)
def emane_link(self, session_id, nem_one, nem_two, linked): def emane_link(self, session_id, nem_one, nem_two, linked):

View file

@ -305,7 +305,10 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
for session_id in self.coreemu.sessions: for session_id in self.coreemu.sessions:
session = self.coreemu.sessions[session_id] session = self.coreemu.sessions[session_id]
session_summary = core_pb2.SessionSummary( session_summary = core_pb2.SessionSummary(
id=session_id, state=session.state, nodes=session.get_node_count() id=session_id,
state=session.state,
nodes=session.get_node_count(),
file=session.file_name,
) )
sessions.append(session_summary) sessions.append(session_summary)
return core_pb2.GetSessionsResponse(sessions=sessions) return core_pb2.GetSessionsResponse(sessions=sessions)
@ -1555,19 +1558,22 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
""" """
logging.debug("open xml: %s", request) logging.debug("open xml: %s", request)
session = self.coreemu.create_session() session = self.coreemu.create_session()
session.set_state(EventTypes.CONFIGURATION_STATE)
_, temp_path = tempfile.mkstemp() temp = tempfile.NamedTemporaryFile(delete=False)
with open(temp_path, "w") as xml_file: temp.write(request.data.encode("utf-8"))
xml_file.write(request.data) temp.close()
try: try:
session.open_xml(temp_path, start=True) session.open_xml(temp.name, request.start)
session.name = os.path.basename(request.file)
session.file_name = request.file
return core_pb2.OpenXmlResponse(session_id=session.id, result=True) return core_pb2.OpenXmlResponse(session_id=session.id, result=True)
except IOError: except IOError:
logging.exception("error opening session file") logging.exception("error opening session file")
self.coreemu.delete_session(session.id) self.coreemu.delete_session(session.id)
context.abort(grpc.StatusCode.INVALID_ARGUMENT, "invalid xml file") context.abort(grpc.StatusCode.INVALID_ARGUMENT, "invalid xml file")
finally:
os.unlink(temp.name)
def GetInterfaces(self, request, context): def GetInterfaces(self, request, context):
""" """

View file

@ -944,7 +944,7 @@ class CoreHandler(socketserver.BaseRequestHandler):
if os.path.splitext(file_name)[1].lower() == ".xml": if os.path.splitext(file_name)[1].lower() == ".xml":
session = self.coreemu.create_session(master=False) session = self.coreemu.create_session(master=False)
try: try:
session.open_xml(file_name, start=True) session.open_xml(file_name)
except Exception: except Exception:
self.coreemu.delete_session(session.id) self.coreemu.delete_session(session.id)
raise raise

View file

@ -820,19 +820,24 @@ class Session(object):
:param bool start: instantiate session if true, false otherwise :param bool start: instantiate session if true, false otherwise
:return: nothing :return: nothing
""" """
logging.info("opening xml: %s", file_name)
# clear out existing session # clear out existing session
self.clear() self.clear()
if start: if start:
self.set_state(EventTypes.CONFIGURATION_STATE) state = EventTypes.CONFIGURATION_STATE
else:
state = EventTypes.DEFINITION_STATE
self.set_state(state)
self.name = os.path.basename(file_name)
self.file_name = file_name
# write out xml file # write out xml file
CoreXmlReader(self).read(file_name) CoreXmlReader(self).read(file_name)
# start session if needed # start session if needed
if start: if start:
self.name = os.path.basename(file_name)
self.file_name = file_name
self.instantiate() self.instantiate()
def save_xml(self, file_name): def save_xml(self, file_name):

View file

@ -304,10 +304,8 @@ class CoreXmlWriter(object):
default_options = self.session.options.default_values() default_options = self.session.options.default_values()
for _id in default_options: for _id in default_options:
default_value = default_options[_id] default_value = default_options[_id]
# TODO: should we just save the current config regardless, since it may change? value = options_config.get(_id, default_value)
value = options_config[_id] add_configuration(option_elements, _id, value)
if value != default_value:
add_configuration(option_elements, _id, value)
if option_elements.getchildren(): if option_elements.getchildren():
self.scenario.append(option_elements) self.scenario.append(option_elements)

View file

@ -631,6 +631,8 @@ message SaveXmlResponse {
message OpenXmlRequest { message OpenXmlRequest {
string data = 1; string data = 1;
bool start = 2;
string file = 3;
} }
message OpenXmlResponse { message OpenXmlResponse {
@ -798,6 +800,7 @@ message SessionSummary {
int32 id = 1; int32 id = 1;
SessionState.Enum state = 2; SessionState.Enum state = 2;
int32 nodes = 3; int32 nodes = 3;
string file = 4;
} }
message Node { message Node {