diff --git a/coretk/coretk/coreclient.py b/coretk/coretk/coreclient.py index 14cc3a11..9b486ccf 100644 --- a/coretk/coretk/coreclient.py +++ b/coretk/coretk/coreclient.py @@ -123,6 +123,9 @@ class CoreClient: ) def join_session(self, session_id): + self.master.config(cursor="watch") + self.master.update() + # update session and title self.session_id = session_id self.master.title(f"CORE Session({self.session_id})") @@ -193,6 +196,7 @@ class CoreClient: self.app.toolbar.runtime_frame.tkraise() else: self.app.toolbar.design_frame.tkraise() + self.master.config(cursor="") def is_runtime(self): return self.state == core_pb2.SessionState.RUNTIME @@ -296,7 +300,8 @@ class CoreClient: mobility_configs = self.get_mobility_configs_proto() emane_model_configs = self.get_emane_model_configs_proto() hooks = list(self.hooks.values()) - # service_configs = self.get_service_config_proto() + service_configs = self.get_service_config_proto() + print(service_configs) # service_file_configs = self.get_service_file_config_proto() self.created_links.clear() self.created_nodes.clear() @@ -313,7 +318,7 @@ class CoreClient: emane_config=emane_config, emane_model_configs=emane_model_configs, mobility_configs=mobility_configs, - # service_configs=service_configs + service_configs=service_configs, ) logging.debug("Start session %s, result: %s", self.session_id, response.result) @@ -638,14 +643,15 @@ class CoreClient: service_configs, ) in self.serviceconfig_manager.configurations.items(): for service, config in service_configs.items(): - config = core_pb2.ServiceConfig( - node_id=node_id, - service=service, - startup=config.startup, - validate=config.validate, - shutdown=config.shutdown, - ) - configs.append(config) + if service in self.serviceconfig_manager.current_services[node_id]: + config = core_pb2.ServiceConfig( + node_id=node_id, + service=service, + startup=config.startup, + validate=config.validate, + shutdown=config.shutdown, + ) + configs.append(config) return configs def get_service_file_config_proto(self): diff --git a/coretk/coretk/dialogs/nodeservice.py b/coretk/coretk/dialogs/nodeservice.py index 67d9a0b3..35c55b75 100644 --- a/coretk/coretk/dialogs/nodeservice.py +++ b/coretk/coretk/dialogs/nodeservice.py @@ -19,9 +19,11 @@ class NodeService(Dialog): self.current = None if services is None: services = set( - app.core.serviceconfig_manager.configurations[self.node_id].keys() + app.core.serviceconfig_manager.current_services[self.node_id] ) self.current_services = services + self.service_manager = self.app.core.serviceconfig_manager + self.service_file_manager = self.app.core.servicefileconfig_manager self.draw() def draw(self): @@ -76,9 +78,16 @@ class NodeService(Dialog): def service_clicked(self, name, var): if var.get() and name not in self.current_services: - self.current_services.add(name) + if self.service_manager.node_new_service_configuration(self.node_id, name): + self.current_services.add(name) + else: + for checkbutton in self.services.frame.winfo_children(): + if name == checkbutton.cget("text"): + checkbutton.config(variable=tk.BooleanVar(value=False)) + elif not var.get() and name in self.current_services: self.current_services.remove(name) + self.service_manager.current_services[self.node_id].remove(name) self.current.listbox.delete(0, tk.END) for name in sorted(self.current_services): self.current.listbox.insert(tk.END, name) @@ -90,7 +99,7 @@ class NodeService(Dialog): master=self, app=self.app, service_name=self.current.listbox.get(current_selection[0]), - canvas_node=self.canvas_node, + node_id=self.node_id, ) dialog.show() else: diff --git a/coretk/coretk/dialogs/serviceconfiguration.py b/coretk/coretk/dialogs/serviceconfiguration.py index 195dc913..bb1fd858 100644 --- a/coretk/coretk/dialogs/serviceconfiguration.py +++ b/coretk/coretk/dialogs/serviceconfiguration.py @@ -11,11 +11,11 @@ from coretk.widgets import ListboxScroll class ServiceConfiguration(Dialog): - def __init__(self, master, app, service_name, canvas_node): + def __init__(self, master, app, service_name, node_id): super().__init__(master, app, f"{service_name} service", modal=True) self.app = app - self.canvas_node = canvas_node - self.node_id = canvas_node.core_node.id + self.service_manager = app.core.serviceconfig_manager + self.node_id = node_id self.service_name = service_name self.radiovar = tk.IntVar() self.radiovar.set(2) @@ -51,16 +51,15 @@ class ServiceConfiguration(Dialog): # create nodes and links in definition state for getting and setting service file self.app.core.create_nodes_and_links() # load data from local memory - serviceconfig_manager = self.app.core.serviceconfig_manager - if self.service_name in serviceconfig_manager.configurations[self.node_id]: - service_config = serviceconfig_manager.configurations[self.node_id][ + if self.service_name in self.service_manager.configurations[self.node_id]: + service_config = self.service_manager.configurations[self.node_id][ self.service_name ] else: - serviceconfig_manager.node_custom_service_configuration( + self.service_manager.node_custom_service_configuration( self.node_id, self.service_name ) - service_config = serviceconfig_manager.configurations[self.node_id][ + service_config = self.service_manager.configurations[self.node_id][ self.service_name ] self.dependencies = [x for x in service_config.dependencies] @@ -363,7 +362,7 @@ class ServiceConfiguration(Dialog): startup_commands = self.startup_commands_listbox.get(0, "end") shutdown_commands = self.shutdown_commands_listbox.get(0, "end") validate_commands = self.validate_commands_listbox.get(0, "end") - self.app.core.serviceconfig_manager.node_service_custom_configuration( + self.service_manager.node_service_custom_configuration( self.node_id, self.service_name, startup_commands, diff --git a/coretk/coretk/icons/host.png b/coretk/coretk/icons/host.png new file mode 100644 index 00000000..e6efda08 Binary files /dev/null and b/coretk/coretk/icons/host.png differ diff --git a/coretk/coretk/icons/hub.png b/coretk/coretk/icons/hub.png new file mode 100644 index 00000000..26b7eba5 Binary files /dev/null and b/coretk/coretk/icons/hub.png differ diff --git a/coretk/coretk/icons/lanswitch.png b/coretk/coretk/icons/lanswitch.png new file mode 100644 index 00000000..6f7ac92f Binary files /dev/null and b/coretk/coretk/icons/lanswitch.png differ diff --git a/coretk/coretk/icons/marker.png b/coretk/coretk/icons/marker.png new file mode 100644 index 00000000..9a41ccbe Binary files /dev/null and b/coretk/coretk/icons/marker.png differ diff --git a/coretk/coretk/icons/oval.png b/coretk/coretk/icons/oval.png new file mode 100644 index 00000000..06f492d4 Binary files /dev/null and b/coretk/coretk/icons/oval.png differ diff --git a/coretk/coretk/icons/pc.png b/coretk/coretk/icons/pc.png new file mode 100644 index 00000000..a0577da3 Binary files /dev/null and b/coretk/coretk/icons/pc.png differ diff --git a/coretk/coretk/icons/rectangle.png b/coretk/coretk/icons/rectangle.png new file mode 100644 index 00000000..f8a9581e Binary files /dev/null and b/coretk/coretk/icons/rectangle.png differ diff --git a/coretk/coretk/icons/rj45.png b/coretk/coretk/icons/rj45.png new file mode 100644 index 00000000..baf4f9e8 Binary files /dev/null and b/coretk/coretk/icons/rj45.png differ diff --git a/coretk/coretk/icons/router.png b/coretk/coretk/icons/router.png new file mode 100644 index 00000000..a42623a4 Binary files /dev/null and b/coretk/coretk/icons/router.png differ diff --git a/coretk/coretk/icons/select.png b/coretk/coretk/icons/select.png new file mode 100644 index 00000000..9063d308 Binary files /dev/null and b/coretk/coretk/icons/select.png differ diff --git a/coretk/coretk/icons/start.png b/coretk/coretk/icons/start.png new file mode 100644 index 00000000..191d6636 Binary files /dev/null and b/coretk/coretk/icons/start.png differ diff --git a/coretk/coretk/icons/stop.png b/coretk/coretk/icons/stop.png new file mode 100644 index 00000000..1db886c8 Binary files /dev/null and b/coretk/coretk/icons/stop.png differ diff --git a/coretk/coretk/icons/text.png b/coretk/coretk/icons/text.png new file mode 100644 index 00000000..4933dabb Binary files /dev/null and b/coretk/coretk/icons/text.png differ diff --git a/coretk/coretk/icons/host.gif b/coretk/coretk/oldicons/host.gif similarity index 100% rename from coretk/coretk/icons/host.gif rename to coretk/coretk/oldicons/host.gif diff --git a/coretk/coretk/icons/hub.gif b/coretk/coretk/oldicons/hub.gif similarity index 100% rename from coretk/coretk/icons/hub.gif rename to coretk/coretk/oldicons/hub.gif diff --git a/coretk/coretk/icons/lanswitch.gif b/coretk/coretk/oldicons/lanswitch.gif similarity index 100% rename from coretk/coretk/icons/lanswitch.gif rename to coretk/coretk/oldicons/lanswitch.gif diff --git a/coretk/coretk/icons/oval.gif b/coretk/coretk/oldicons/oval.gif similarity index 100% rename from coretk/coretk/icons/oval.gif rename to coretk/coretk/oldicons/oval.gif diff --git a/coretk/coretk/icons/pc.gif b/coretk/coretk/oldicons/pc.gif similarity index 100% rename from coretk/coretk/icons/pc.gif rename to coretk/coretk/oldicons/pc.gif diff --git a/coretk/coretk/icons/rectangle.gif b/coretk/coretk/oldicons/rectangle.gif similarity index 100% rename from coretk/coretk/icons/rectangle.gif rename to coretk/coretk/oldicons/rectangle.gif diff --git a/coretk/coretk/icons/rj45.gif b/coretk/coretk/oldicons/rj45.gif similarity index 100% rename from coretk/coretk/icons/rj45.gif rename to coretk/coretk/oldicons/rj45.gif diff --git a/coretk/coretk/icons/router.gif b/coretk/coretk/oldicons/router.gif similarity index 100% rename from coretk/coretk/icons/router.gif rename to coretk/coretk/oldicons/router.gif diff --git a/coretk/coretk/icons/select.gif b/coretk/coretk/oldicons/select.gif similarity index 100% rename from coretk/coretk/icons/select.gif rename to coretk/coretk/oldicons/select.gif diff --git a/coretk/coretk/icons/start.gif b/coretk/coretk/oldicons/start.gif similarity index 100% rename from coretk/coretk/icons/start.gif rename to coretk/coretk/oldicons/start.gif diff --git a/coretk/coretk/icons/stop.gif b/coretk/coretk/oldicons/stop.gif similarity index 100% rename from coretk/coretk/icons/stop.gif rename to coretk/coretk/oldicons/stop.gif diff --git a/coretk/coretk/icons/text.gif b/coretk/coretk/oldicons/text.gif similarity index 100% rename from coretk/coretk/icons/text.gif rename to coretk/coretk/oldicons/text.gif diff --git a/coretk/coretk/servicenodeconfig.py b/coretk/coretk/servicenodeconfig.py index 98de9034..3473e1d8 100644 --- a/coretk/coretk/servicenodeconfig.py +++ b/coretk/coretk/servicenodeconfig.py @@ -2,15 +2,23 @@ service node configuration """ import logging +from tkinter import messagebox + +import grpc class ServiceNodeConfig: def __init__(self, app): self.app = app # dict(node_id:dict(service:node_service_config_proto)) + # maps node to all of its service configuration self.configurations = {} + # dict(node_id:set(str)) + # maps node to current configurations + self.current_services = {} self.default_services = {} + # todo rewrite, no need self.default services def node_default_services_configuration(self, node_id, node_model): """ set the default configurations for the default services of a node @@ -20,6 +28,7 @@ class ServiceNodeConfig: """ session_id = self.app.core.session_id client = self.app.core.client + if len(self.default_services) == 0: response = client.get_service_defaults(session_id) logging.info("session default services: %s", response) @@ -28,6 +37,7 @@ class ServiceNodeConfig: self.configurations[node_id] = {} + self.current_services[node_id] = set() for default in self.default_services[node_model]: response = client.get_node_service(session_id, node_id, default) logging.info( @@ -36,6 +46,29 @@ class ServiceNodeConfig: response, ) self.configurations[node_id][default] = response.service + self.current_services[node_id].add(default) + + def node_new_service_configuration(self, node_id, service_name): + """ + store node's configuration if a new service is added from the GUI + + :param int node_id: node id + :param str service_name: service name + :return: nothing + """ + try: + config = self.app.core.get_node_service(node_id, service_name) + except grpc.RpcError: + messagebox.showerror("Service problem", "Service not found") + return False + if node_id not in self.configurations: + self.configurations[node_id] = {} + if node_id not in self.current_services: + self.current_services[node_id] = set() + if service_name not in self.configurations[node_id]: + self.configurations[node_id][service_name] = config + self.current_services[node_id].add(service_name) + return True def node_custom_service_configuration(self, node_id, service_name): self.configurations[node_id][service_name] = self.app.core.get_node_service( diff --git a/coretk/coretk/toolbar.py b/coretk/coretk/toolbar.py index bb1803ea..834f7b39 100644 --- a/coretk/coretk/toolbar.py +++ b/coretk/coretk/toolbar.py @@ -196,9 +196,12 @@ class Toolbar(ttk.Frame): :return: nothing """ logging.debug("clicked start button") + self.master.config(cursor="watch") + self.master.update() self.app.canvas.mode = GraphMode.SELECT self.app.core.start_session() self.runtime_frame.tkraise() + self.master.config(cursor="") def click_link(self): logging.debug("Click LINK button")