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.nodeconfig import NodeConfigDialog
from coretk.dialogs.wlanconfig import WlanConfigDialog
from coretk.nodeutils import NodeUtils
class CanvasAction:
@ -16,7 +17,7 @@ class CanvasAction:
def display_configuration(self, canvas_node):
node_type = canvas_node.core_node.type
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()
elif node_type == core_pb2.NodeType.WIRELESS_LAN:
self.display_wlan_configuration(canvas_node)

View file

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

View file

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

View file

@ -44,11 +44,21 @@ class NodeUtils:
NODES = []
NETWORK_NODES = []
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
def is_interface_node(cls, node_type):
return node_type in cls.INTERFACE_NODE
def is_container_node(cls, node_type):
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
def node_icon(cls, node_type, model):