From c42b3a59bfa8db219684ae020beb6536ae2b8d43 Mon Sep 17 00:00:00 2001 From: YueGuobin Date: Sun, 14 Jun 2026 02:00:06 +0800 Subject: [PATCH] fix: Merge commands for duplicate device_names in _configs_map Dict comprehension overwrote earlier entries when the same device appeared multiple times, causing all entries' outputs to collapse into the last one. Now commands are appended for duplicate names. --- .../gns3_copilot/tools_v2/config_tools_nornir.py | 14 ++++++++++---- .../gns3_copilot/tools_v2/display_tools_nornir.py | 14 ++++++++++---- .../gns3_copilot/tools_v2/vpcs_tools_netmiko.py | 15 +++++++++++---- 3 files changed, 31 insertions(+), 12 deletions(-) diff --git a/gns3server/agent/gns3_copilot/tools_v2/config_tools_nornir.py b/gns3server/agent/gns3_copilot/tools_v2/config_tools_nornir.py index 41ed58f9d..28d04555f 100644 --- a/gns3server/agent/gns3_copilot/tools_v2/config_tools_nornir.py +++ b/gns3server/agent/gns3_copilot/tools_v2/config_tools_nornir.py @@ -543,12 +543,18 @@ class ExecuteMultipleDeviceConfigCommands(BaseTool): def _configs_map( self, device_config_list: list[dict[str, Any]] ) -> dict[str, list[str]]: - """Create a mapping of device names to their configuration commands.""" - device_configs_map = {} + """Create a mapping of device names to their configuration commands. + + Merges commands when the same device appears multiple times in the list. + """ + device_configs_map: dict[str, list[str]] = {} for device_config in device_config_list: device_name = device_config["device_name"] - config_commands = device_config["config_commands"] - device_configs_map[device_name] = config_commands + commands = device_config.get("config_commands", []) + if device_name in device_configs_map: + device_configs_map[device_name].extend(commands) + else: + device_configs_map[device_name] = list(commands) return device_configs_map diff --git a/gns3server/agent/gns3_copilot/tools_v2/display_tools_nornir.py b/gns3server/agent/gns3_copilot/tools_v2/display_tools_nornir.py index 8fa056650..f79ce6e75 100644 --- a/gns3server/agent/gns3_copilot/tools_v2/display_tools_nornir.py +++ b/gns3server/agent/gns3_copilot/tools_v2/display_tools_nornir.py @@ -486,12 +486,18 @@ class ExecuteMultipleDeviceCommands(BaseTool): def _configs_map( self, device_config_list: list[dict[str, Any]] ) -> dict[str, list[str]]: - """Create a mapping of device names to their diagnostic commands.""" - device_diagnostic_map = {} + """Create a mapping of device names to their diagnostic commands. + + Merges commands when the same device appears multiple times in the list. + """ + device_diagnostic_map: dict[str, list[str]] = {} for device_config in device_config_list: device_name = device_config["device_name"] - diagnostic_commands = device_config["commands"] - device_diagnostic_map[device_name] = diagnostic_commands + commands = device_config.get("commands", []) + if device_name in device_diagnostic_map: + device_diagnostic_map[device_name].extend(commands) + else: + device_diagnostic_map[device_name] = list(commands) return device_diagnostic_map diff --git a/gns3server/agent/gns3_copilot/tools_v2/vpcs_tools_netmiko.py b/gns3server/agent/gns3_copilot/tools_v2/vpcs_tools_netmiko.py index 221bf9bed..b561f9ba2 100644 --- a/gns3server/agent/gns3_copilot/tools_v2/vpcs_tools_netmiko.py +++ b/gns3server/agent/gns3_copilot/tools_v2/vpcs_tools_netmiko.py @@ -405,16 +405,23 @@ class VPCSCommands(BaseTool): """ Create a mapping of device names to their command lists. + Merges commands when the same device appears multiple times. + Args: device_config_list: List of device configurations Returns: Dictionary mapping device names to command lists """ - return { - config["device_name"]: config["commands"] - for config in device_config_list - } + cmd_map: dict[str, list[str]] = {} + for config in device_config_list: + name = config["device_name"] + cmds = config.get("commands", []) + if name in cmd_map: + cmd_map[name].extend(cmds) + else: + cmd_map[name] = list(cmds) + return cmd_map def _prepare_device_hosts_data( self,