def click_apply(self) -> None: error = False # update core node self.node.name = self.name.get() if nutils.has_image(self.node.type): self.node.image = self.container_image.get() server = self.server.get() if nutils.is_container(self.node): if server == DEFAULT_SERVER: self.node.server = None else: self.node.server = server # set custom icon if self.image_file: self.node.icon = self.image_file # update canvas node self.canvas_node.image = self.image # update node interface data for iface in self.canvas_node.ifaces.values(): data = self.ifaces[iface.id] error = not data.validate(self, iface) if error: break # redraw if not error: self.canvas_node.redraw() self.destroy()
def create_node(self, x: float, y: float, node_type: NodeType, model: str) -> Optional[Node]: """ Add node, with information filled in, to grpc manager """ node_id = self.next_node_id() position = Position(x=x, y=y) image = None if nutils.has_image(node_type): image = "ubuntu:latest" emane = None if node_type == NodeType.EMANE: if not self.emane_models: dialog = EmaneInstallDialog(self.app) dialog.show() return emane = self.emane_models[0] name = f"emane{node_id}" elif node_type == NodeType.WIRELESS_LAN: name = f"wlan{node_id}" elif node_type in [NodeType.RJ45, NodeType.TUNNEL]: name = "unassigned" else: name = f"n{node_id}" node = Node( id=node_id, type=node_type, name=name, model=model, position=position, image=image, emane=emane, ) if nutils.is_custom(node): services = nutils.get_custom_services(self.app.guiconfig, model) node.config_services = set(services) # assign default services to CORE node else: services = self.session.default_services.get(model) if services: node.config_services = set(services) logger.info( "add node(%s) to session(%s), coordinates(%s, %s)", node.name, self.session.id, x, y, ) self.session.nodes[node.id] = node return node
def draw(self) -> None: self.columnconfigure(0, weight=1) node = self.canvas_node.core_node frame = DetailsFrame(self) frame.grid(sticky=tk.EW) frame.add_detail("ID", str(node.id)) frame.add_detail("Name", node.name) if nutils.is_model(node): frame.add_detail("Type", node.model) if nutils.is_container(node): for index, service in enumerate(sorted(node.services)): if index == 0: frame.add_detail("Services", service) else: frame.add_detail("", service) if node.type == NodeType.EMANE: emane = "".join(node.emane.split("_")[1:]) frame.add_detail("EMANE", emane) if nutils.has_image(node.type): frame.add_detail("Image", node.image) if nutils.is_container(node): server = node.server if node.server else "localhost" frame.add_detail("Server", server)
def draw(self) -> None: self.top.columnconfigure(0, weight=1) row = 0 # field states state = tk.DISABLED if self.app.core.is_runtime() else tk.NORMAL combo_state = tk.DISABLED if self.app.core.is_runtime() else "readonly" # field frame frame = ttk.Frame(self.top) frame.grid(sticky=tk.EW) frame.columnconfigure(1, weight=1) # icon field label = ttk.Label(frame, text="Icon") label.grid(row=row, column=0, sticky=tk.EW, padx=PADX, pady=PADY) self.image_button = ttk.Button( frame, text="Icon", image=self.image, compound=tk.NONE, command=self.click_icon, ) self.image_button.grid(row=row, column=1, sticky=tk.EW) row += 1 # name field label = ttk.Label(frame, text="Name") label.grid(row=row, column=0, sticky=tk.EW, padx=PADX, pady=PADY) entry = validation.NodeNameEntry(frame, textvariable=self.name, state=state) entry.grid(row=row, column=1, sticky=tk.EW) row += 1 # node type field if nutils.is_model(self.node): label = ttk.Label(frame, text="Type") label.grid(row=row, column=0, sticky=tk.EW, padx=PADX, pady=PADY) combobox = ttk.Combobox( frame, textvariable=self.type, values=list(nutils.NODE_MODELS), state=combo_state, ) combobox.grid(row=row, column=1, sticky=tk.EW) row += 1 # container image field if nutils.has_image(self.node.type): label = ttk.Label(frame, text="Image") label.grid(row=row, column=0, sticky=tk.EW, padx=PADX, pady=PADY) entry = ttk.Entry(frame, textvariable=self.container_image, state=state) entry.grid(row=row, column=1, sticky=tk.EW) row += 1 if nutils.is_container(self.node): # server frame.grid(sticky=tk.EW) frame.columnconfigure(1, weight=1) label = ttk.Label(frame, text="Server") label.grid(row=row, column=0, sticky=tk.EW, padx=PADX, pady=PADY) servers = [DEFAULT_SERVER] servers.extend(list(sorted(self.app.core.servers.keys()))) combobox = ttk.Combobox(frame, textvariable=self.server, values=servers, state=combo_state) combobox.grid(row=row, column=1, sticky=tk.EW) row += 1 if nutils.is_rj45(self.node): ifaces = self.app.core.client.get_ifaces() logger.debug("host machine available interfaces: %s", ifaces) ifaces_scroll = ListboxScroll(frame) ifaces_scroll.listbox.config(state=state) ifaces_scroll.grid(row=row, column=0, columnspan=2, sticky=tk.EW, padx=PADX, pady=PADY) for inf in sorted(ifaces): ifaces_scroll.listbox.insert(tk.END, inf) row += 1 ifaces_scroll.listbox.bind("<<ListboxSelect>>", self.iface_select) # interfaces if self.canvas_node.ifaces: self.draw_ifaces() self.draw_spacer() self.draw_buttons()