From 07c07da0996eb911e14e5c9ff2e6b783630b9bb0 Mon Sep 17 00:00:00 2001 From: bharnden <32446120+bharnden@users.noreply.github.com> Date: Wed, 20 Nov 2019 11:20:08 -0800 Subject: [PATCH] update node config dialog to display fields based on node type, added field for nodes with images --- coretk/coretk/canvasaction.py | 3 +- coretk/coretk/coreclient.py | 6 +++- coretk/coretk/dialogs/nodeconfig.py | 56 +++++++++++++++++++---------- coretk/coretk/nodeutils.py | 16 +++++++-- 4 files changed, 57 insertions(+), 24 deletions(-) diff --git a/coretk/coretk/canvasaction.py b/coretk/coretk/canvasaction.py index 08aa8c3d..509b9723 100644 --- a/coretk/coretk/canvasaction.py +++ b/coretk/coretk/canvasaction.py @@ -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) diff --git a/coretk/coretk/coreclient.py b/coretk/coretk/coreclient.py index 14cc3a11..d9bbd659 100644 --- a/coretk/coretk/coreclient.py +++ b/coretk/coretk/coreclient.py @@ -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( diff --git a/coretk/coretk/dialogs/nodeconfig.py b/coretk/coretk/dialogs/nodeconfig.py index 8a0d4522..4ed4baa6 100644 --- a/coretk/coretk/dialogs/nodeconfig.py +++ b/coretk/coretk/dialogs/nodeconfig.py @@ -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 diff --git a/coretk/coretk/nodeutils.py b/coretk/coretk/nodeutils.py index 6777718a..380c9a0b 100644 --- a/coretk/coretk/nodeutils.py +++ b/coretk/coretk/nodeutils.py @@ -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):