pygui: added wrapper class for sessions returned by grpc GetSession

This commit is contained in:
Blake Harnden 2020-07-26 11:45:40 -07:00
parent 82a212d1cf
commit 41a3c5fd7f
3 changed files with 32 additions and 11 deletions

View file

@ -48,6 +48,7 @@ from core.gui.wrappers import (
NodeServiceData, NodeServiceData,
NodeType, NodeType,
Position, Position,
Session,
SessionLocation, SessionLocation,
SessionState, SessionState,
ThroughputsEvent, ThroughputsEvent,
@ -311,8 +312,8 @@ class CoreClient:
# get session data # get session data
try: try:
response = self.client.get_session(self.session_id) response = self.client.get_session(self.session_id)
session = response.session session = Session.from_proto(response.session)
self.state = SessionState(session.state) self.state = session.state
self.handling_events = self.client.events( self.handling_events = self.client.events(
self.session_id, self.handle_events self.session_id, self.handle_events
) )
@ -349,9 +350,7 @@ class CoreClient:
self.ifaces_manager.joined(session.links) self.ifaces_manager.joined(session.links)
# draw session # draw session
nodes = [Node.from_proto(x) for x in session.nodes] self.app.canvas.reset_and_redraw(session)
links = [Link.from_proto(x) for x in session.links]
self.app.canvas.reset_and_redraw(nodes, links)
# get mobility configs # get mobility configs
response = self.client.get_mobility_configs(self.session_id) response = self.client.get_mobility_configs(self.session_id)

View file

@ -22,7 +22,7 @@ from core.gui.graph.shape import Shape
from core.gui.graph.shapeutils import ShapeType, is_draw_shape, is_marker from core.gui.graph.shapeutils import ShapeType, is_draw_shape, is_marker
from core.gui.images import ImageEnum, TypeToImage from core.gui.images import ImageEnum, TypeToImage
from core.gui.nodeutils import NodeDraw, NodeUtils from core.gui.nodeutils import NodeDraw, NodeUtils
from core.gui.wrappers import Interface, Link, LinkType, Node, ThroughputsEvent from core.gui.wrappers import Interface, Link, LinkType, Node, Session, ThroughputsEvent
if TYPE_CHECKING: if TYPE_CHECKING:
from core.gui.app import Application from core.gui.app import Application
@ -127,7 +127,7 @@ class CanvasGraph(tk.Canvas):
) )
self.configure(scrollregion=self.bbox(tk.ALL)) self.configure(scrollregion=self.bbox(tk.ALL))
def reset_and_redraw(self, nodes: List[Node], links: List[Link]) -> None: def reset_and_redraw(self, session: Session) -> None:
# reset view options to default state # reset view options to default state
self.show_node_labels.set(True) self.show_node_labels.set(True)
self.show_link_labels.set(True) self.show_link_labels.set(True)
@ -152,7 +152,7 @@ class CanvasGraph(tk.Canvas):
self.wireless_edges.clear() self.wireless_edges.clear()
self.wireless_network.clear() self.wireless_network.clear()
self.drawing_edge = None self.drawing_edge = None
self.draw_session(nodes, links) self.draw_session(session)
def setup_bindings(self) -> None: def setup_bindings(self) -> None:
""" """
@ -325,19 +325,20 @@ class CanvasGraph(tk.Canvas):
self.nodes[node.id] = node self.nodes[node.id] = node
self.core.canvas_nodes[core_node.id] = node self.core.canvas_nodes[core_node.id] = node
def draw_session(self, nodes: List[Node], links: List[Link]) -> None: def draw_session(self, session: Session) -> None:
""" """
Draw existing session. Draw existing session.
""" """
# draw existing nodes # draw existing nodes
for core_node in nodes: for core_node in session.nodes:
logging.debug("drawing node: %s", core_node)
# peer to peer node is not drawn on the GUI # peer to peer node is not drawn on the GUI
if NodeUtils.is_ignore_node(core_node.type): if NodeUtils.is_ignore_node(core_node.type):
continue continue
self.add_core_node(core_node) self.add_core_node(core_node)
# draw existing links # draw existing links
for link in links: for link in session.links:
logging.debug("drawing link: %s", link) logging.debug("drawing link: %s", link)
canvas_node1 = self.core.canvas_nodes[link.node1_id] canvas_node1 = self.core.canvas_nodes[link.node1_id]
canvas_node2 = self.core.canvas_nodes[link.node2_id] canvas_node2 = self.core.canvas_nodes[link.node2_id]

View file

@ -545,6 +545,27 @@ class Node:
) )
@dataclass
class Session:
id: int
state: SessionState
nodes: List[Node]
links: List[Link]
dir: str
@classmethod
def from_proto(cls, proto: core_pb2.Session) -> "Session":
nodes = [Node.from_proto(x) for x in proto.nodes]
links = [Link.from_proto(x) for x in proto.links]
return Session(
id=proto.id,
state=SessionState(proto.state),
nodes=nodes,
links=links,
dir=proto.dir,
)
@dataclass @dataclass
class LinkEvent: class LinkEvent:
message_type: MessageType message_type: MessageType