update node config dialog to display fields based on node type, added field for nodes with images

This commit is contained in:
bharnden 2019-11-20 11:20:08 -08:00
parent c43e5f999c
commit 07c07da099
4 changed files with 57 additions and 24 deletions

View file

@ -5,6 +5,7 @@ from core.api.grpc import core_pb2
from coretk.dialogs.emaneconfig import EmaneConfiguration from coretk.dialogs.emaneconfig import EmaneConfiguration
from coretk.dialogs.nodeconfig import NodeConfigDialog from coretk.dialogs.nodeconfig import NodeConfigDialog
from coretk.dialogs.wlanconfig import WlanConfigDialog from coretk.dialogs.wlanconfig import WlanConfigDialog
from coretk.nodeutils import NodeUtils
class CanvasAction: class CanvasAction:
@ -16,7 +17,7 @@ class CanvasAction:
def display_configuration(self, canvas_node): def display_configuration(self, canvas_node):
node_type = canvas_node.core_node.type node_type = canvas_node.core_node.type
self.node_to_show_config = canvas_node self.node_to_show_config = canvas_node
if node_type == core_pb2.NodeType.DEFAULT: if NodeUtils.is_container_node(node_type):
self.display_node_configuration() self.display_node_configuration()
elif node_type == core_pb2.NodeType.WIRELESS_LAN: elif node_type == core_pb2.NodeType.WIRELESS_LAN:
self.display_wlan_configuration(canvas_node) self.display_wlan_configuration(canvas_node)

View file

@ -440,12 +440,16 @@ class CoreClient:
""" """
node_id = self.get_id() node_id = self.get_id()
position = core_pb2.Position(x=x, y=y) position = core_pb2.Position(x=x, y=y)
image = None
if NodeUtils.is_image_node(node_type):
image = "ubuntu:latest"
node = core_pb2.Node( node = core_pb2.Node(
id=node_id, id=node_id,
type=node_type, type=node_type,
name=f"n{node_id}", name=f"n{node_id}",
model=model, model=model,
position=position, position=position,
image=image,
) )
# set default configuration for wireless node # set default configuration for wireless node
@ -530,7 +534,7 @@ class CoreClient:
def create_interface(self, canvas_node): def create_interface(self, canvas_node):
interface = None interface = None
core_node = canvas_node.core_node core_node = canvas_node.core_node
if NodeUtils.is_interface_node(core_node.type): if NodeUtils.is_container_node(core_node.type):
ifid = len(canvas_node.interfaces) ifid = len(canvas_node.interfaces)
name = f"eth{ifid}" name = f"eth{ifid}"
interface = core_pb2.Interface( interface = core_pb2.Interface(

View file

@ -6,9 +6,9 @@ from tkinter import ttk
from coretk.dialogs.dialog import Dialog from coretk.dialogs.dialog import Dialog
from coretk.dialogs.icondialog import IconDialog from coretk.dialogs.icondialog import IconDialog
from coretk.dialogs.nodeservice import NodeService from coretk.dialogs.nodeservice import NodeService
from coretk.nodeutils import NodeUtils
from coretk.widgets import FrameScroll from coretk.widgets import FrameScroll
DEFAULT_NODES = {"router", "host", "PC", "mdr", "prouter"}
PAD = 5 PAD = 5
@ -49,6 +49,7 @@ class NodeConfigDialog(Dialog):
self.image_button = None self.image_button = None
self.name = tk.StringVar(value=self.node.name) self.name = tk.StringVar(value=self.node.name)
self.type = tk.StringVar(value=self.node.model) self.type = tk.StringVar(value=self.node.model)
self.container_image = tk.StringVar(value=self.node.image)
server = "localhost" server = "localhost"
if self.node.server: if self.node.server:
server = self.node.server server = self.node.server
@ -86,26 +87,39 @@ class NodeConfigDialog(Dialog):
row += 1 row += 1
# node type field # node type field
label = ttk.Label(frame, text="Type") if NodeUtils.is_model_node(self.node.type):
label.grid(row=row, column=0, sticky="ew", padx=PAD, pady=PAD) label = ttk.Label(frame, text="Type")
combobox = ttk.Combobox( label.grid(row=row, column=0, sticky="ew", padx=PAD, pady=PAD)
frame, textvariable=self.type, values=list(DEFAULT_NODES), state="readonly" combobox = ttk.Combobox(
) frame,
combobox.grid(row=row, column=1, sticky="ew") textvariable=self.type,
row += 1 values=list(NodeUtils.NODE_MODELS),
state="readonly",
)
combobox.grid(row=row, column=1, sticky="ew")
row += 1
# container image field
if NodeUtils.is_image_node(self.node.type):
label = ttk.Label(frame, text="Image")
label.grid(row=row, column=0, sticky="ew", padx=PAD, pady=PAD)
entry = ttk.Entry(frame, textvariable=self.container_image)
entry.grid(row=row, column=1, sticky="ew")
row += 1
# server # server
frame.grid(sticky="ew") if NodeUtils.is_container_node(self.node.type):
frame.columnconfigure(1, weight=1) frame.grid(sticky="ew")
label = ttk.Label(frame, text="Server") frame.columnconfigure(1, weight=1)
label.grid(row=row, column=0, sticky="ew", padx=PAD, pady=PAD) label = ttk.Label(frame, text="Server")
servers = ["localhost"] label.grid(row=row, column=0, sticky="ew", padx=PAD, pady=PAD)
servers.extend(list(sorted(self.app.core.servers.keys()))) servers = ["localhost"]
combobox = ttk.Combobox( servers.extend(list(sorted(self.app.core.servers.keys())))
frame, textvariable=self.server, values=servers, state="readonly" combobox = ttk.Combobox(
) frame, textvariable=self.server, values=servers, state="readonly"
combobox.grid(row=row, column=1, sticky="ew") )
row += 1 combobox.grid(row=row, column=1, sticky="ew")
row += 1
# services # services
button = ttk.Button(self.top, text="Services", command=self.click_services) button = ttk.Button(self.top, text="Services", command=self.click_services)
@ -181,6 +195,10 @@ class NodeConfigDialog(Dialog):
def config_apply(self): def config_apply(self):
# update core node # update core node
self.node.name = self.name.get() self.node.name = self.name.get()
if NodeUtils.is_image_node(self.node.type):
self.node.image = self.container_image.get()
if NodeUtils.is_container_node(self.node.type):
self.node.server = self.server.get()
# update canvas node # update canvas node
self.canvas_node.image = self.image self.canvas_node.image = self.image

View file

@ -44,11 +44,21 @@ class NodeUtils:
NODES = [] NODES = []
NETWORK_NODES = [] NETWORK_NODES = []
NODE_ICONS = {} NODE_ICONS = {}
INTERFACE_NODE = {NodeType.DEFAULT, NodeType.DOCKER, NodeType.LXC} CONTAINER_NODES = {NodeType.DEFAULT, NodeType.DOCKER, NodeType.LXC}
IMAGE_NODES = {NodeType.DOCKER, NodeType.LXC}
NODE_MODELS = {"router", "host", "PC", "mdr", "prouter"}
@classmethod @classmethod
def is_interface_node(cls, node_type): def is_container_node(cls, node_type):
return node_type in cls.INTERFACE_NODE return node_type in cls.CONTAINER_NODES
@classmethod
def is_model_node(cls, node_type):
return node_type == NodeType.DEFAULT
@classmethod
def is_image_node(cls, node_type):
return node_type in cls.IMAGE_NODES
@classmethod @classmethod
def node_icon(cls, node_type, model): def node_icon(cls, node_type, model):