update node config dialog to display fields based on node type, added field for nodes with images
This commit is contained in:
parent
c43e5f999c
commit
07c07da099
4 changed files with 57 additions and 24 deletions
|
@ -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)
|
||||||
|
|
|
@ -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(
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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):
|
||||||
|
|
Loading…
Add table
Reference in a new issue