pygui: modified usages of protobufs within coreclient to use module namespace to make more obvious, replaced config services and services with wrappers

This commit is contained in:
Blake Harnden 2020-07-25 20:27:11 -07:00
parent a9a2fb8e46
commit 82a212d1cf
6 changed files with 213 additions and 128 deletions

View file

@ -12,13 +12,15 @@ from typing import TYPE_CHECKING, Dict, Iterable, List, Optional, Set, Tuple
import grpc import grpc
from core.api.grpc import client, core_pb2 from core.api.grpc import (
from core.api.grpc.configservices_pb2 import ConfigService, ConfigServiceConfig client,
from core.api.grpc.core_pb2 import CpuUsageEvent, Event configservices_pb2,
from core.api.grpc.emane_pb2 import EmaneModelConfig core_pb2,
from core.api.grpc.mobility_pb2 import MobilityConfig emane_pb2,
from core.api.grpc.services_pb2 import NodeServiceData, ServiceConfig, ServiceFileConfig mobility_pb2,
from core.api.grpc.wlan_pb2 import WlanConfig services_pb2,
wlan_pb2,
)
from core.gui import appconfig from core.gui import appconfig
from core.gui.appconfig import CoreServer, Observer from core.gui.appconfig import CoreServer, Observer
from core.gui.dialogs.emaneinstall import EmaneInstallDialog from core.gui.dialogs.emaneinstall import EmaneInstallDialog
@ -33,6 +35,7 @@ from core.gui.interface import InterfaceManager
from core.gui.nodeutils import NodeDraw, NodeUtils from core.gui.nodeutils import NodeDraw, NodeUtils
from core.gui.wrappers import ( from core.gui.wrappers import (
ConfigOption, ConfigOption,
ConfigService,
ExceptionEvent, ExceptionEvent,
Hook, Hook,
Interface, Interface,
@ -42,6 +45,7 @@ from core.gui.wrappers import (
MessageType, MessageType,
Node, Node,
NodeEvent, NodeEvent,
NodeServiceData,
NodeType, NodeType,
Position, Position,
SessionLocation, SessionLocation,
@ -150,7 +154,7 @@ class CoreClient:
for observer in self.app.guiconfig.observers: for observer in self.app.guiconfig.observers:
self.custom_observers[observer.name] = observer self.custom_observers[observer.name] = observer
def handle_events(self, event: Event) -> None: def handle_events(self, event: core_pb2.Event) -> None:
if event.source == GUI_SOURCE: if event.source == GUI_SOURCE:
return return
if event.session_id != self.session_id: if event.session_id != self.session_id:
@ -288,7 +292,7 @@ class CoreClient:
logging.debug("handling throughputs event: %s", event) logging.debug("handling throughputs event: %s", event)
self.app.after(0, self.app.canvas.set_throughputs, event) self.app.after(0, self.app.canvas.set_throughputs, event)
def handle_cpu_event(self, event: CpuUsageEvent) -> None: def handle_cpu_event(self, event: core_pb2.CpuUsageEvent) -> None:
self.app.after(0, self.app.statusbar.set_cpu, event.usage) self.app.after(0, self.app.statusbar.set_cpu, event.usage)
def handle_exception_event(self, event: ExceptionEvent) -> None: def handle_exception_event(self, event: ExceptionEvent) -> None:
@ -514,7 +518,7 @@ class CoreClient:
# get config service informations # get config service informations
response = self.client.get_config_services() response = self.client.get_config_services()
for service in response.services: for service in response.services:
self.config_services[service.name] = service self.config_services[service.name] = ConfigService.from_proto(service)
group_services = self.config_services_groups.setdefault( group_services = self.config_services_groups.setdefault(
service.group, set() service.group, set()
) )
@ -708,7 +712,7 @@ class CoreClient:
logging.debug( logging.debug(
"get node(%s) %s service, response: %s", node_id, service_name, response "get node(%s) %s service, response: %s", node_id, service_name, response
) )
return response.service return NodeServiceData.from_proto(response.service)
def set_node_service( def set_node_service(
self, self,
@ -742,7 +746,7 @@ class CoreClient:
response, response,
) )
response = self.client.get_node_service(self.session_id, node_id, service_name) response = self.client.get_node_service(self.session_id, node_id, service_name)
return response.service return NodeServiceData.from_proto(response.service)
def get_node_service_file( def get_node_service_file(
self, node_id: int, service_name: str, file_name: str self, node_id: int, service_name: str, file_name: str
@ -1000,7 +1004,7 @@ class CoreClient:
self.links[edge.token] = edge self.links[edge.token] = edge
logging.info("Add link between %s and %s", src_node.name, dst_node.name) logging.info("Add link between %s and %s", src_node.name, dst_node.name)
def get_wlan_configs_proto(self) -> List[WlanConfig]: def get_wlan_configs_proto(self) -> List[wlan_pb2.WlanConfig]:
configs = [] configs = []
for canvas_node in self.canvas_nodes.values(): for canvas_node in self.canvas_nodes.values():
if canvas_node.core_node.type != NodeType.WIRELESS_LAN: if canvas_node.core_node.type != NodeType.WIRELESS_LAN:
@ -1009,11 +1013,11 @@ class CoreClient:
continue continue
config = ConfigOption.to_dict(canvas_node.wlan_config) config = ConfigOption.to_dict(canvas_node.wlan_config)
node_id = canvas_node.core_node.id node_id = canvas_node.core_node.id
wlan_config = WlanConfig(node_id=node_id, config=config) wlan_config = wlan_pb2.WlanConfig(node_id=node_id, config=config)
configs.append(wlan_config) configs.append(wlan_config)
return configs return configs
def get_mobility_configs_proto(self) -> List[MobilityConfig]: def get_mobility_configs_proto(self) -> List[mobility_pb2.MobilityConfig]:
configs = [] configs = []
for canvas_node in self.canvas_nodes.values(): for canvas_node in self.canvas_nodes.values():
if canvas_node.core_node.type != NodeType.WIRELESS_LAN: if canvas_node.core_node.type != NodeType.WIRELESS_LAN:
@ -1022,11 +1026,13 @@ class CoreClient:
continue continue
config = ConfigOption.to_dict(canvas_node.mobility_config) config = ConfigOption.to_dict(canvas_node.mobility_config)
node_id = canvas_node.core_node.id node_id = canvas_node.core_node.id
mobility_config = MobilityConfig(node_id=node_id, config=config) mobility_config = mobility_pb2.MobilityConfig(
node_id=node_id, config=config
)
configs.append(mobility_config) configs.append(mobility_config)
return configs return configs
def get_emane_model_configs_proto(self) -> List[EmaneModelConfig]: def get_emane_model_configs_proto(self) -> List[emane_pb2.EmaneModelConfig]:
configs = [] configs = []
for canvas_node in self.canvas_nodes.values(): for canvas_node in self.canvas_nodes.values():
if canvas_node.core_node.type != NodeType.EMANE: if canvas_node.core_node.type != NodeType.EMANE:
@ -1037,13 +1043,13 @@ class CoreClient:
config = ConfigOption.to_dict(config) config = ConfigOption.to_dict(config)
if iface_id is None: if iface_id is None:
iface_id = -1 iface_id = -1
config_proto = EmaneModelConfig( config_proto = emane_pb2.EmaneModelConfig(
node_id=node_id, iface_id=iface_id, model=model, config=config node_id=node_id, iface_id=iface_id, model=model, config=config
) )
configs.append(config_proto) configs.append(config_proto)
return configs return configs
def get_service_configs_proto(self) -> List[ServiceConfig]: def get_service_configs_proto(self) -> List[services_pb2.ServiceConfig]:
configs = [] configs = []
for canvas_node in self.canvas_nodes.values(): for canvas_node in self.canvas_nodes.values():
if not NodeUtils.is_container_node(canvas_node.core_node.type): if not NodeUtils.is_container_node(canvas_node.core_node.type):
@ -1052,7 +1058,7 @@ class CoreClient:
continue continue
node_id = canvas_node.core_node.id node_id = canvas_node.core_node.id
for name, config in canvas_node.service_configs.items(): for name, config in canvas_node.service_configs.items():
config_proto = ServiceConfig( config_proto = services_pb2.ServiceConfig(
node_id=node_id, node_id=node_id,
service=name, service=name,
directories=config.dirs, directories=config.dirs,
@ -1064,7 +1070,7 @@ class CoreClient:
configs.append(config_proto) configs.append(config_proto)
return configs return configs
def get_service_file_configs_proto(self) -> List[ServiceFileConfig]: def get_service_file_configs_proto(self) -> List[services_pb2.ServiceFileConfig]:
configs = [] configs = []
for canvas_node in self.canvas_nodes.values(): for canvas_node in self.canvas_nodes.values():
if not NodeUtils.is_container_node(canvas_node.core_node.type): if not NodeUtils.is_container_node(canvas_node.core_node.type):
@ -1074,13 +1080,15 @@ class CoreClient:
node_id = canvas_node.core_node.id node_id = canvas_node.core_node.id
for service, file_configs in canvas_node.service_file_configs.items(): for service, file_configs in canvas_node.service_file_configs.items():
for file, data in file_configs.items(): for file, data in file_configs.items():
config_proto = ServiceFileConfig( config_proto = services_pb2.ServiceFileConfig(
node_id=node_id, service=service, file=file, data=data node_id=node_id, service=service, file=file, data=data
) )
configs.append(config_proto) configs.append(config_proto)
return configs return configs
def get_config_service_configs_proto(self) -> List[ConfigServiceConfig]: def get_config_service_configs_proto(
self
) -> List[configservices_pb2.ConfigServiceConfig]:
config_service_protos = [] config_service_protos = []
for canvas_node in self.canvas_nodes.values(): for canvas_node in self.canvas_nodes.values():
if not NodeUtils.is_container_node(canvas_node.core_node.type): if not NodeUtils.is_container_node(canvas_node.core_node.type):
@ -1090,7 +1098,7 @@ class CoreClient:
node_id = canvas_node.core_node.id node_id = canvas_node.core_node.id
for name, service_config in canvas_node.config_service_configs.items(): for name, service_config in canvas_node.config_service_configs.items():
config = service_config.get("config", {}) config = service_config.get("config", {})
config_proto = ConfigServiceConfig( config_proto = configservices_pb2.ConfigServiceConfig(
node_id=node_id, node_id=node_id,
name=name, name=name,
templates=service_config["templates"], templates=service_config["templates"],

View file

@ -8,11 +8,10 @@ from typing import TYPE_CHECKING, Dict, List, Optional, Set
import grpc import grpc
from core.api.grpc.services_pb2 import ServiceValidationMode
from core.gui.dialogs.dialog import Dialog from core.gui.dialogs.dialog import Dialog
from core.gui.themes import FRAME_PAD, PADX, PADY from core.gui.themes import FRAME_PAD, PADX, PADY
from core.gui.widgets import CodeText, ConfigFrame, ListboxScroll from core.gui.widgets import CodeText, ConfigFrame, ListboxScroll
from core.gui.wrappers import ConfigOption from core.gui.wrappers import ConfigOption, ServiceValidationMode
if TYPE_CHECKING: if TYPE_CHECKING:
from core.gui.app import Application from core.gui.app import Application

View file

@ -4,11 +4,10 @@ from typing import TYPE_CHECKING, Dict, Optional
import grpc import grpc
from core.api.grpc.mobility_pb2 import MobilityAction
from core.gui.dialogs.dialog import Dialog from core.gui.dialogs.dialog import Dialog
from core.gui.images import ImageEnum from core.gui.images import ImageEnum
from core.gui.themes import PADX, PADY from core.gui.themes import PADX, PADY
from core.gui.wrappers import ConfigOption, Node from core.gui.wrappers import ConfigOption, MobilityAction, Node
if TYPE_CHECKING: if TYPE_CHECKING:
from core.gui.app import Application from core.gui.app import Application
@ -150,7 +149,7 @@ class MobilityPlayerDialog(Dialog):
session_id = self.app.core.session_id session_id = self.app.core.session_id
try: try:
self.app.core.client.mobility_action( self.app.core.client.mobility_action(
session_id, self.node.id, MobilityAction.START session_id, self.node.id, MobilityAction.START.value
) )
except grpc.RpcError as e: except grpc.RpcError as e:
self.app.show_grpc_exception("Mobility Error", e) self.app.show_grpc_exception("Mobility Error", e)
@ -160,7 +159,7 @@ class MobilityPlayerDialog(Dialog):
session_id = self.app.core.session_id session_id = self.app.core.session_id
try: try:
self.app.core.client.mobility_action( self.app.core.client.mobility_action(
session_id, self.node.id, MobilityAction.PAUSE session_id, self.node.id, MobilityAction.PAUSE.value
) )
except grpc.RpcError as e: except grpc.RpcError as e:
self.app.show_grpc_exception("Mobility Error", e) self.app.show_grpc_exception("Mobility Error", e)
@ -170,7 +169,7 @@ class MobilityPlayerDialog(Dialog):
session_id = self.app.core.session_id session_id = self.app.core.session_id
try: try:
self.app.core.client.mobility_action( self.app.core.client.mobility_action(
session_id, self.node.id, MobilityAction.STOP session_id, self.node.id, MobilityAction.STOP.value
) )
except grpc.RpcError as e: except grpc.RpcError as e:
self.app.show_grpc_exception("Mobility Error", e) self.app.show_grpc_exception("Mobility Error", e)

View file

@ -7,12 +7,12 @@ from typing import TYPE_CHECKING, Dict, List, Optional, Set, Tuple
import grpc import grpc
from PIL.ImageTk import PhotoImage from PIL.ImageTk import PhotoImage
from core.api.grpc.services_pb2 import NodeServiceData, ServiceValidationMode
from core.gui.dialogs.copyserviceconfig import CopyServiceConfigDialog from core.gui.dialogs.copyserviceconfig import CopyServiceConfigDialog
from core.gui.dialogs.dialog import Dialog from core.gui.dialogs.dialog import Dialog
from core.gui.images import ImageEnum, Images from core.gui.images import ImageEnum, Images
from core.gui.themes import FRAME_PAD, PADX, PADY from core.gui.themes import FRAME_PAD, PADX, PADY
from core.gui.widgets import CodeText, ListboxScroll from core.gui.widgets import CodeText, ListboxScroll
from core.gui.wrappers import NodeServiceData, ServiceValidationMode
if TYPE_CHECKING: if TYPE_CHECKING:
from core.gui.app import Application from core.gui.app import Application
@ -72,7 +72,7 @@ class ServiceConfigDialog(Dialog):
self.service_file_data: Optional[CodeText] = None self.service_file_data: Optional[CodeText] = None
self.validation_period_entry: Optional[ttk.Entry] = None self.validation_period_entry: Optional[ttk.Entry] = None
self.original_service_files: Dict[str, str] = {} self.original_service_files: Dict[str, str] = {}
self.default_config: NodeServiceData = None self.default_config: Optional[NodeServiceData] = None
self.temp_service_files: Dict[str, str] = {} self.temp_service_files: Dict[str, str] = {}
self.modified_files: Set[str] = set() self.modified_files: Set[str] = set()
self.has_error: bool = False self.has_error: bool = False

View file

@ -6,7 +6,6 @@ from typing import TYPE_CHECKING, Any, Dict, List, Optional, Set, Tuple
import grpc import grpc
from PIL.ImageTk import PhotoImage from PIL.ImageTk import PhotoImage
from core.api.grpc.services_pb2 import NodeServiceData
from core.gui import themes from core.gui import themes
from core.gui.dialogs.emaneconfig import EmaneConfigDialog from core.gui.dialogs.emaneconfig import EmaneConfigDialog
from core.gui.dialogs.mobilityconfig import MobilityConfigDialog from core.gui.dialogs.mobilityconfig import MobilityConfigDialog
@ -20,7 +19,7 @@ from core.gui.graph.edges import CanvasEdge, CanvasWirelessEdge
from core.gui.graph.tooltip import CanvasTooltip from core.gui.graph.tooltip import CanvasTooltip
from core.gui.images import ImageEnum from core.gui.images import ImageEnum
from core.gui.nodeutils import ANTENNA_SIZE, NodeUtils from core.gui.nodeutils import ANTENNA_SIZE, NodeUtils
from core.gui.wrappers import ConfigOption, Interface, Node, NodeType from core.gui.wrappers import ConfigOption, Interface, Node, NodeServiceData, NodeType
if TYPE_CHECKING: if TYPE_CHECKING:
from core.gui.app import Application from core.gui.app import Application

View file

@ -2,7 +2,25 @@ from dataclasses import dataclass, field
from enum import Enum from enum import Enum
from typing import Dict, List from typing import Dict, List
from core.api.grpc import common_pb2, core_pb2 from core.api.grpc import common_pb2, configservices_pb2, core_pb2, services_pb2
class ConfigServiceValidationMode(Enum):
BLOCKING = 0
NON_BLOCKING = 1
TIMER = 2
class ServiceValidationMode(Enum):
BLOCKING = 0
NON_BLOCKING = 1
TIMER = 2
class MobilityAction(Enum):
START = 0
PAUSE = 1
STOP = 2
class ConfigOptionType(Enum): class ConfigOptionType(Enum):
@ -68,6 +86,68 @@ class MessageType(Enum):
TTY = 64 TTY = 64
@dataclass
class ConfigService:
group: str
name: str
executables: List[str]
dependencies: List[str]
directories: List[str]
files: List[str]
startup: List[str]
validate: List[str]
shutdown: List[str]
validation_mode: ConfigServiceValidationMode
validation_timer: int
validation_period: float
@classmethod
def from_proto(cls, proto: configservices_pb2.ConfigService) -> "ConfigService":
return ConfigService(
group=proto.group,
name=proto.name,
executables=proto.executables,
dependencies=proto.dependencies,
directories=proto.directories,
files=proto.files,
startup=proto.startup,
validate=proto.validate,
shutdown=proto.shutdown,
validation_mode=ConfigServiceValidationMode(proto.validation_mode),
validation_timer=proto.validation_timer,
validation_period=proto.validation_period,
)
@dataclass
class NodeServiceData:
executables: List[str]
dependencies: List[str]
dirs: List[str]
configs: List[str]
startup: List[str]
validate: List[str]
validation_mode: ServiceValidationMode
validation_timer: int
shutdown: List[str]
meta: str
@classmethod
def from_proto(cls, proto: services_pb2.NodeServiceData) -> "NodeServiceData":
return NodeServiceData(
executables=proto.executables,
dependencies=proto.dependencies,
dirs=proto.dirs,
configs=proto.configs,
startup=proto.startup,
validate=proto.validate,
validation_mode=proto.validation_mode,
validation_timer=proto.validation_timer,
shutdown=proto.shutdown,
meta=proto.meta,
)
@dataclass @dataclass
class BridgeThroughput: class BridgeThroughput:
node_id: int node_id: int
@ -119,15 +199,15 @@ class SessionLocation:
scale: float scale: float
@classmethod @classmethod
def from_proto(cls, location: core_pb2.SessionLocation) -> "SessionLocation": def from_proto(cls, proto: core_pb2.SessionLocation) -> "SessionLocation":
return SessionLocation( return SessionLocation(
x=location.x, x=proto.x,
y=location.y, y=proto.y,
z=location.z, z=proto.z,
lat=location.lat, lat=proto.lat,
lon=location.lon, lon=proto.lon,
alt=location.alt, alt=proto.alt,
scale=location.scale, scale=proto.scale,
) )
def to_proto(self) -> core_pb2.SessionLocation: def to_proto(self) -> core_pb2.SessionLocation:
@ -154,16 +234,16 @@ class ExceptionEvent:
@classmethod @classmethod
def from_proto( def from_proto(
cls, session_id: int, event: core_pb2.ExceptionEvent cls, session_id: int, proto: core_pb2.ExceptionEvent
) -> "ExceptionEvent": ) -> "ExceptionEvent":
return ExceptionEvent( return ExceptionEvent(
session_id=session_id, session_id=session_id,
node_id=event.node_id, node_id=proto.node_id,
level=ExceptionLevel(event.level), level=ExceptionLevel(proto.level),
source=event.source, source=proto.source,
date=event.date, date=proto.date,
text=event.text, text=proto.text,
opaque=event.opaque, opaque=proto.opaque,
) )
@ -190,14 +270,14 @@ class ConfigOption:
return {k: v.value for k, v in config.items()} return {k: v.value for k, v in config.items()}
@classmethod @classmethod
def from_proto(cls, option: common_pb2.ConfigOption) -> "ConfigOption": def from_proto(cls, proto: common_pb2.ConfigOption) -> "ConfigOption":
return ConfigOption( return ConfigOption(
label=option.label, label=proto.label,
name=option.name, name=proto.name,
value=option.value, value=proto.value,
type=ConfigOptionType(option.type), type=ConfigOptionType(proto.type),
group=option.group, group=proto.group,
select=option.select, select=proto.select,
) )
@ -217,20 +297,20 @@ class Interface:
net2_id: int = None net2_id: int = None
@classmethod @classmethod
def from_proto(cls, iface: core_pb2.Interface) -> "Interface": def from_proto(cls, proto: core_pb2.Interface) -> "Interface":
return Interface( return Interface(
id=iface.id, id=proto.id,
name=iface.name, name=proto.name,
mac=iface.mac, mac=proto.mac,
ip4=iface.ip4, ip4=proto.ip4,
ip4_mask=iface.ip4_mask, ip4_mask=proto.ip4_mask,
ip6=iface.ip6, ip6=proto.ip6,
ip6_mask=iface.ip6_mask, ip6_mask=proto.ip6_mask,
net_id=iface.net_id, net_id=proto.net_id,
flow_id=iface.flow_id, flow_id=proto.flow_id,
mtu=iface.mtu, mtu=proto.mtu,
node_id=iface.node_id, node_id=proto.node_id,
net2_id=iface.net2_id, net2_id=proto.net2_id,
) )
def to_proto(self) -> core_pb2.Interface: def to_proto(self) -> core_pb2.Interface:
@ -264,18 +344,18 @@ class LinkOptions:
unidirectional: bool = False unidirectional: bool = False
@classmethod @classmethod
def from_proto(cls, options: core_pb2.LinkOptions) -> "LinkOptions": def from_proto(cls, proto: core_pb2.LinkOptions) -> "LinkOptions":
return LinkOptions( return LinkOptions(
jitter=options.jitter, jitter=proto.jitter,
key=options.key, key=proto.key,
mburst=options.mburst, mburst=proto.mburst,
mer=options.mer, mer=proto.mer,
loss=options.loss, loss=proto.loss,
bandwidth=options.bandwidth, bandwidth=proto.bandwidth,
burst=options.burst, burst=proto.burst,
delay=options.delay, delay=proto.delay,
dup=options.dup, dup=proto.dup,
unidirectional=options.unidirectional, unidirectional=proto.unidirectional,
) )
def to_proto(self) -> core_pb2.LinkOptions: def to_proto(self) -> core_pb2.LinkOptions:
@ -306,26 +386,26 @@ class Link:
color: str = None color: str = None
@classmethod @classmethod
def from_proto(cls, link: core_pb2.Link) -> "Link": def from_proto(cls, proto: core_pb2.Link) -> "Link":
iface1 = None iface1 = None
if link.HasField("iface1"): if proto.HasField("iface1"):
iface1 = Interface.from_proto(link.iface1) iface1 = Interface.from_proto(proto.iface1)
iface2 = None iface2 = None
if link.HasField("iface2"): if proto.HasField("iface2"):
iface2 = Interface.from_proto(link.iface2) iface2 = Interface.from_proto(proto.iface2)
options = None options = None
if link.HasField("options"): if proto.HasField("options"):
options = LinkOptions.from_proto(link.options) options = LinkOptions.from_proto(proto.options)
return Link( return Link(
type=LinkType(link.type), type=LinkType(proto.type),
node1_id=link.node1_id, node1_id=proto.node1_id,
node2_id=link.node2_id, node2_id=proto.node2_id,
iface1=iface1, iface1=iface1,
iface2=iface2, iface2=iface2,
options=options, options=options,
network_id=link.network_id, network_id=proto.network_id,
label=link.label, label=proto.label,
color=link.color, color=proto.color,
) )
def to_proto(self) -> core_pb2.Link: def to_proto(self) -> core_pb2.Link:
@ -360,13 +440,13 @@ class SessionSummary:
dir: str dir: str
@classmethod @classmethod
def from_proto(cls, summary: core_pb2.SessionSummary) -> "SessionSummary": def from_proto(cls, proto: core_pb2.SessionSummary) -> "SessionSummary":
return SessionSummary( return SessionSummary(
id=summary.id, id=proto.id,
state=SessionState(summary.state), state=SessionState(proto.state),
nodes=summary.nodes, nodes=proto.nodes,
file=summary.file, file=proto.file,
dir=summary.dir, dir=proto.dir,
) )
@ -377,8 +457,8 @@ class Hook:
data: str data: str
@classmethod @classmethod
def from_proto(cls, hook: core_pb2.Hook) -> "Hook": def from_proto(cls, proto: core_pb2.Hook) -> "Hook":
return Hook(state=SessionState(hook.state), file=hook.file, data=hook.data) return Hook(state=SessionState(proto.state), file=proto.file, data=proto.data)
def to_proto(self) -> core_pb2.Hook: def to_proto(self) -> core_pb2.Hook:
return core_pb2.Hook(state=self.state.value, file=self.file, data=self.data) return core_pb2.Hook(state=self.state.value, file=self.file, data=self.data)
@ -390,8 +470,8 @@ class Position:
y: float y: float
@classmethod @classmethod
def from_proto(cls, position: core_pb2.Position) -> "Position": def from_proto(cls, proto: core_pb2.Position) -> "Position":
return Position(x=position.x, y=position.y) return Position(x=proto.x, y=proto.y)
def to_proto(self) -> core_pb2.Position: def to_proto(self) -> core_pb2.Position:
return core_pb2.Position(x=self.x, y=self.y) return core_pb2.Position(x=self.x, y=self.y)
@ -404,8 +484,8 @@ class Geo:
alt: float = None alt: float = None
@classmethod @classmethod
def from_proto(cls, geo: core_pb2.Geo) -> "Geo": def from_proto(cls, proto: core_pb2.Geo) -> "Geo":
return Geo(lat=geo.lat, lon=geo.lon, alt=geo.alt) return Geo(lat=proto.lat, lon=proto.lon, alt=proto.alt)
def to_proto(self) -> core_pb2.Geo: def to_proto(self) -> core_pb2.Geo:
return core_pb2.Geo(lat=self.lat, lon=self.lon, alt=self.alt) return core_pb2.Geo(lat=self.lat, lon=self.lon, alt=self.alt)
@ -429,22 +509,22 @@ class Node:
channel: str = None channel: str = None
@classmethod @classmethod
def from_proto(cls, node: core_pb2.Node) -> "Node": def from_proto(cls, proto: core_pb2.Node) -> "Node":
return Node( return Node(
id=node.id, id=proto.id,
name=node.name, name=proto.name,
type=NodeType(node.type), type=NodeType(proto.type),
model=node.model, model=proto.model,
position=Position.from_proto(node.position), position=Position.from_proto(proto.position),
services=list(node.services), services=list(proto.services),
config_services=list(node.config_services), config_services=list(proto.config_services),
emane=node.emane, emane=proto.emane,
icon=node.icon, icon=proto.icon,
image=node.image, image=proto.image,
server=node.server, server=proto.server,
geo=Geo.from_proto(node.geo), geo=Geo.from_proto(proto.geo),
dir=node.dir, dir=proto.dir,
channel=node.channel, channel=proto.channel,
) )
def to_proto(self) -> core_pb2.Node: def to_proto(self) -> core_pb2.Node:
@ -471,10 +551,10 @@ class LinkEvent:
link: Link link: Link
@classmethod @classmethod
def from_proto(cls, event: core_pb2.LinkEvent) -> "LinkEvent": def from_proto(cls, proto: core_pb2.LinkEvent) -> "LinkEvent":
return LinkEvent( return LinkEvent(
message_type=MessageType(event.message_type), message_type=MessageType(proto.message_type),
link=Link.from_proto(event.link), link=Link.from_proto(proto.link),
) )
@ -484,8 +564,8 @@ class NodeEvent:
node: Node node: Node
@classmethod @classmethod
def from_proto(cls, event: core_pb2.NodeEvent) -> "NodeEvent": def from_proto(cls, proto: core_pb2.NodeEvent) -> "NodeEvent":
return NodeEvent( return NodeEvent(
message_type=MessageType(event.message_type), message_type=MessageType(proto.message_type),
node=Node.from_proto(event.node), node=Node.from_proto(proto.node),
) )