grpc: added session options to session wrapped object, updated get_session and start_session to utilize this change, updated pygui to leverage as well
This commit is contained in:
parent
597834a993
commit
7938379e6d
7 changed files with 42 additions and 21 deletions
|
@ -314,6 +314,7 @@ class CoreGrpcClient:
|
||||||
config=service_config.config,
|
config=service_config.config,
|
||||||
)
|
)
|
||||||
config_service_configs.append(config_service_config)
|
config_service_configs.append(config_service_config)
|
||||||
|
options = {k: v.value for k, v in session.options.items()}
|
||||||
request = core_pb2.StartSessionRequest(
|
request = core_pb2.StartSessionRequest(
|
||||||
session_id=session.id,
|
session_id=session.id,
|
||||||
nodes=nodes,
|
nodes=nodes,
|
||||||
|
@ -328,6 +329,7 @@ class CoreGrpcClient:
|
||||||
service_file_configs=service_file_configs,
|
service_file_configs=service_file_configs,
|
||||||
asymmetric_links=asymmetric_links,
|
asymmetric_links=asymmetric_links,
|
||||||
config_service_configs=config_service_configs,
|
config_service_configs=config_service_configs,
|
||||||
|
options=options,
|
||||||
)
|
)
|
||||||
response = self.stub.StartSession(request)
|
response = self.stub.StartSession(request)
|
||||||
return response.result, list(response.exceptions)
|
return response.result, list(response.exceptions)
|
||||||
|
|
|
@ -226,6 +226,11 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
|
||||||
session.directory.mkdir(exist_ok=True)
|
session.directory.mkdir(exist_ok=True)
|
||||||
session.set_state(EventTypes.CONFIGURATION_STATE)
|
session.set_state(EventTypes.CONFIGURATION_STATE)
|
||||||
|
|
||||||
|
# session options
|
||||||
|
session.options.config_reset()
|
||||||
|
for key, value in request.options.items():
|
||||||
|
session.options.set_config(key, value)
|
||||||
|
|
||||||
# location
|
# location
|
||||||
if request.HasField("location"):
|
if request.HasField("location"):
|
||||||
grpcutils.session_location(session, request.location)
|
grpcutils.session_location(session, request.location)
|
||||||
|
@ -571,6 +576,7 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
|
||||||
service_configs = grpcutils.get_node_service_configs(session)
|
service_configs = grpcutils.get_node_service_configs(session)
|
||||||
config_service_configs = grpcutils.get_node_config_service_configs(session)
|
config_service_configs = grpcutils.get_node_config_service_configs(session)
|
||||||
session_file = str(session.file_path) if session.file_path else None
|
session_file = str(session.file_path) if session.file_path else None
|
||||||
|
options = get_config_options(session.options.get_configs(), session.options)
|
||||||
session_proto = core_pb2.Session(
|
session_proto = core_pb2.Session(
|
||||||
id=session.id,
|
id=session.id,
|
||||||
state=session.state.value,
|
state=session.state.value,
|
||||||
|
@ -590,6 +596,7 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
|
||||||
mobility_configs=mobility_configs,
|
mobility_configs=mobility_configs,
|
||||||
metadata=session.metadata,
|
metadata=session.metadata,
|
||||||
file=session_file,
|
file=session_file,
|
||||||
|
options=options,
|
||||||
)
|
)
|
||||||
return core_pb2.GetSessionResponse(session=session_proto)
|
return core_pb2.GetSessionResponse(session=session_proto)
|
||||||
|
|
||||||
|
|
|
@ -753,6 +753,7 @@ class Session:
|
||||||
emane_config: Dict[str, ConfigOption]
|
emane_config: Dict[str, ConfigOption]
|
||||||
metadata: Dict[str, str]
|
metadata: Dict[str, str]
|
||||||
file: Path
|
file: Path
|
||||||
|
options: Dict[str, ConfigOption]
|
||||||
|
|
||||||
def set_node(self, node: Node) -> None:
|
def set_node(self, node: Node) -> None:
|
||||||
self.nodes[node.id] = node
|
self.nodes[node.id] = node
|
||||||
|
@ -792,6 +793,7 @@ class Session:
|
||||||
node = nodes[node_id]
|
node = nodes[node_id]
|
||||||
node.mobility_config = ConfigOption.from_dict(mapped_config.config)
|
node.mobility_config = ConfigOption.from_dict(mapped_config.config)
|
||||||
file_path = Path(proto.file) if proto.file else None
|
file_path = Path(proto.file) if proto.file else None
|
||||||
|
options = ConfigOption.from_dict(proto.options)
|
||||||
return Session(
|
return Session(
|
||||||
id=proto.id,
|
id=proto.id,
|
||||||
state=SessionState(proto.state),
|
state=SessionState(proto.state),
|
||||||
|
@ -806,6 +808,7 @@ class Session:
|
||||||
emane_config=ConfigOption.from_dict(proto.emane_config),
|
emane_config=ConfigOption.from_dict(proto.emane_config),
|
||||||
metadata=dict(proto.metadata),
|
metadata=dict(proto.metadata),
|
||||||
file=file_path,
|
file=file_path,
|
||||||
|
options=options,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -112,3 +112,13 @@ class SessionConfig(ConfigurableManager, ConfigurableOptions):
|
||||||
if value is not None:
|
if value is not None:
|
||||||
value = int(value)
|
value = int(value)
|
||||||
return value
|
return value
|
||||||
|
|
||||||
|
def config_reset(self, node_id: int = None) -> None:
|
||||||
|
"""
|
||||||
|
Clear prior configuration files and reset to default values.
|
||||||
|
|
||||||
|
:param node_id: node id to store configuration for
|
||||||
|
:return: nothing
|
||||||
|
"""
|
||||||
|
super().config_reset(node_id)
|
||||||
|
self.set_configs(self.default_values())
|
||||||
|
|
|
@ -1,11 +1,8 @@
|
||||||
import logging
|
import logging
|
||||||
import tkinter as tk
|
import tkinter as tk
|
||||||
from tkinter import ttk
|
from tkinter import ttk
|
||||||
from typing import TYPE_CHECKING, Dict, Optional
|
from typing import TYPE_CHECKING, Optional
|
||||||
|
|
||||||
import grpc
|
|
||||||
|
|
||||||
from core.api.grpc.wrappers import ConfigOption
|
|
||||||
from core.gui.dialogs.dialog import Dialog
|
from core.gui.dialogs.dialog import Dialog
|
||||||
from core.gui.themes import PADX, PADY
|
from core.gui.themes import PADX, PADY
|
||||||
from core.gui.widgets import ConfigFrame
|
from core.gui.widgets import ConfigFrame
|
||||||
|
@ -21,24 +18,15 @@ class SessionOptionsDialog(Dialog):
|
||||||
super().__init__(app, "Session Options")
|
super().__init__(app, "Session Options")
|
||||||
self.config_frame: Optional[ConfigFrame] = None
|
self.config_frame: Optional[ConfigFrame] = None
|
||||||
self.has_error: bool = False
|
self.has_error: bool = False
|
||||||
self.config: Dict[str, ConfigOption] = self.get_config()
|
|
||||||
self.enabled: bool = not self.app.core.is_runtime()
|
self.enabled: bool = not self.app.core.is_runtime()
|
||||||
if not self.has_error:
|
if not self.has_error:
|
||||||
self.draw()
|
self.draw()
|
||||||
|
|
||||||
def get_config(self) -> Dict[str, ConfigOption]:
|
|
||||||
try:
|
|
||||||
session_id = self.app.core.session.id
|
|
||||||
return self.app.core.client.get_session_options(session_id)
|
|
||||||
except grpc.RpcError as e:
|
|
||||||
self.app.show_grpc_exception("Get Session Options Error", e)
|
|
||||||
self.has_error = True
|
|
||||||
self.destroy()
|
|
||||||
|
|
||||||
def draw(self) -> None:
|
def draw(self) -> None:
|
||||||
self.top.columnconfigure(0, weight=1)
|
self.top.columnconfigure(0, weight=1)
|
||||||
self.top.rowconfigure(0, weight=1)
|
self.top.rowconfigure(0, weight=1)
|
||||||
self.config_frame = ConfigFrame(self.top, self.app, self.config, self.enabled)
|
options = self.app.core.session.options
|
||||||
|
self.config_frame = ConfigFrame(self.top, self.app, options, self.enabled)
|
||||||
self.config_frame.draw_config()
|
self.config_frame.draw_config()
|
||||||
self.config_frame.grid(sticky=tk.NSEW, pady=PADY)
|
self.config_frame.grid(sticky=tk.NSEW, pady=PADY)
|
||||||
|
|
||||||
|
@ -54,10 +42,6 @@ class SessionOptionsDialog(Dialog):
|
||||||
|
|
||||||
def save(self) -> None:
|
def save(self) -> None:
|
||||||
config = self.config_frame.parse_config()
|
config = self.config_frame.parse_config()
|
||||||
try:
|
for key, value in config.items():
|
||||||
session_id = self.app.core.session.id
|
self.app.core.session.options[key].value = value
|
||||||
result = self.app.core.client.set_session_options(session_id, config)
|
|
||||||
logger.info("saved session config: %s", result)
|
|
||||||
except grpc.RpcError as e:
|
|
||||||
self.app.show_grpc_exception("Set Session Options Error", e)
|
|
||||||
self.destroy()
|
self.destroy()
|
||||||
|
|
|
@ -188,6 +188,7 @@ message StartSessionRequest {
|
||||||
repeated services.ServiceFileConfig service_file_configs = 11;
|
repeated services.ServiceFileConfig service_file_configs = 11;
|
||||||
repeated Link asymmetric_links = 12;
|
repeated Link asymmetric_links = 12;
|
||||||
repeated configservices.ConfigServiceConfig config_service_configs = 13;
|
repeated configservices.ConfigServiceConfig config_service_configs = 13;
|
||||||
|
map<string, string> options = 14;
|
||||||
}
|
}
|
||||||
|
|
||||||
message StartSessionResponse {
|
message StartSessionResponse {
|
||||||
|
@ -727,6 +728,7 @@ message Session {
|
||||||
map<int32, common.MappedConfig> mobility_configs = 16;
|
map<int32, common.MappedConfig> mobility_configs = 16;
|
||||||
map<string, string> metadata = 17;
|
map<string, string> metadata = 17;
|
||||||
string file = 18;
|
string file = 18;
|
||||||
|
map<string, common.ConfigOption> options = 19;
|
||||||
}
|
}
|
||||||
|
|
||||||
message SessionSummary {
|
message SessionSummary {
|
||||||
|
|
|
@ -149,6 +149,18 @@ class TestGrpcw:
|
||||||
service_file_data = "echo hello"
|
service_file_data = "echo hello"
|
||||||
node1.service_file_configs[service_name] = {service_file: service_file_data}
|
node1.service_file_configs[service_name] = {service_file: service_file_data}
|
||||||
|
|
||||||
|
# setup session option
|
||||||
|
option_key = "controlnet"
|
||||||
|
option_value = "172.16.0.0/24"
|
||||||
|
option = ConfigOption(
|
||||||
|
label=option_key,
|
||||||
|
name=option_key,
|
||||||
|
value=option_value,
|
||||||
|
type=ConfigOptionType.STRING,
|
||||||
|
group="Default",
|
||||||
|
)
|
||||||
|
session.options[option_key] = option
|
||||||
|
|
||||||
# when
|
# when
|
||||||
with patch.object(CoreXmlWriter, "write"):
|
with patch.object(CoreXmlWriter, "write"):
|
||||||
with client.context_connect():
|
with client.context_connect():
|
||||||
|
@ -189,6 +201,7 @@ class TestGrpcw:
|
||||||
real_node1, service_name, service_file
|
real_node1, service_name, service_file
|
||||||
)
|
)
|
||||||
assert service_file.data == service_file_data
|
assert service_file.data == service_file_data
|
||||||
|
assert option_value == real_session.options.get_config(option_key)
|
||||||
|
|
||||||
@pytest.mark.parametrize("session_id", [None, 6013])
|
@pytest.mark.parametrize("session_id", [None, 6013])
|
||||||
def test_create_session(
|
def test_create_session(
|
||||||
|
|
Loading…
Add table
Reference in a new issue