diff --git a/gns3server/agent/gns3_copilot/agent/gns3_copilot.py b/gns3server/agent/gns3_copilot/agent/gns3_copilot.py index a9616eb8b..ac784cab0 100644 --- a/gns3server/agent/gns3_copilot/agent/gns3_copilot.py +++ b/gns3server/agent/gns3_copilot/agent/gns3_copilot.py @@ -527,7 +527,7 @@ def tool_node(state: dict, config: RunnableConfig | None = None): ) except Exception as e: logger.error("Tool %s failed: %s", tool_name, e, exc_info=True) - observation = f"Error: {str(e)}" + observation = f"Error: {e!s}" # Serialize observation to JSON string if it's not already a string # This ensures ToolMessage.content is always JSON format, not Python diff --git a/gns3server/agent/gns3_copilot/gns3_client/connector.py b/gns3server/agent/gns3_copilot/gns3_client/connector.py index 40ce1c5e5..21f7fc58d 100644 --- a/gns3server/agent/gns3_copilot/gns3_client/connector.py +++ b/gns3server/agent/gns3_copilot/gns3_client/connector.py @@ -175,7 +175,7 @@ class Gns3Connector: else: raise HTTPError(f"v3 API authentication failed: {response.status_code} - {response.text}") except Exception as e: - raise HTTPError(f"v3 API authentication error: {str(e)}") from e + raise HTTPError(f"v3 API authentication error: {e!s}") from e def _is_token_expired(self) -> bool: """ @@ -273,7 +273,7 @@ class Gns3Connector: except Exception: # If JSON parsing fails, return error with original text return HTTPError( - f"Original Error: {str(e)}. GNS3 response text: {response.text}", + f"Original Error: {e!s}. GNS3 response text: {response.text}", response=response, ) return e diff --git a/gns3server/agent/gns3_copilot/gns3_client/gns3_project_info.py b/gns3server/agent/gns3_copilot/gns3_client/gns3_project_info.py index 9b699e51f..3ed793580 100644 --- a/gns3server/agent/gns3_copilot/gns3_client/gns3_project_info.py +++ b/gns3server/agent/gns3_copilot/gns3_client/gns3_project_info.py @@ -143,7 +143,7 @@ class GNS3ProjectInfoTool(BaseTool): except Exception as e: logger.error("Error retrieving GNS3 project info: %s", str(e)) - return {"error": f"Failed to retrieve project info: {str(e)}"} + return {"error": f"Failed to retrieve project info: {e!s}"} if __name__ == "__main__": diff --git a/gns3server/agent/gns3_copilot/gns3_client/gns3_topology_reader.py b/gns3server/agent/gns3_copilot/gns3_client/gns3_topology_reader.py index ce5449079..208d7074f 100644 --- a/gns3server/agent/gns3_copilot/gns3_client/gns3_topology_reader.py +++ b/gns3server/agent/gns3_copilot/gns3_client/gns3_topology_reader.py @@ -145,7 +145,7 @@ class GNS3TopologyTool(BaseTool): except Exception as e: logger.error("Error retrieving GNS3 topology: %s", str(e)) - return {"error": f"Failed to retrieve topology: {str(e)}"} + return {"error": f"Failed to retrieve topology: {e!s}"} def _clean_nodes_ports(self, data: dict) -> dict: """ diff --git a/gns3server/agent/gns3_copilot/skills/registry.py b/gns3server/agent/gns3_copilot/skills/registry.py index d9e2b5083..aa67cd51b 100644 --- a/gns3server/agent/gns3_copilot/skills/registry.py +++ b/gns3server/agent/gns3_copilot/skills/registry.py @@ -239,7 +239,7 @@ def reload_injection_skills() -> dict[str, Any]: logger.error(f"Error during skills reload: {e}") return { "success": False, - "message": f"Error: {str(e)}", + "message": f"Error: {e!s}", "skill_count": len(INJECTION_SKILLS_REGISTRY), "version": "", } @@ -278,7 +278,7 @@ def reload_prompts() -> dict[str, Any]: manager = get_skills_manager() return { "success": False, - "message": f"Error: {str(e)}", + "message": f"Error: {e!s}", "prompt_count": manager.get_prompt_count() if manager else 0, "version": "", } @@ -314,7 +314,7 @@ def reload_forbidden_commands() -> dict[str, Any]: } except Exception as e: logger.error(f"Error during forbidden commands reload: {e}") - return {"success": False, "message": f"Error: {str(e)}", "command_count": 0, "version": ""} + return {"success": False, "message": f"Error: {e!s}", "command_count": 0, "version": ""} def get_prompt(prompt_name: str) -> str: 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 6b96e6202..250fb559d 100644 --- a/gns3server/agent/gns3_copilot/tools_v2/config_tools_nornir.py +++ b/gns3server/agent/gns3_copilot/tools_v2/config_tools_nornir.py @@ -255,7 +255,7 @@ class ExecuteMultipleDeviceConfigCommands(BaseTool): except Exception as e: # Overall execution failed logger.error("Error executing configurations on all devices: %s", e) - return [{"status": "failed", "error": f"Execution error: {str(e)}"}] + return [{"status": "failed", "error": f"Execution error: {e!s}"}] logger.info( "Multiple device configuration execution completed. Results: %s", @@ -285,7 +285,7 @@ class ExecuteMultipleDeviceConfigCommands(BaseTool): ) return Result( host=task.host, - result=f"Configuration failed (ReadTimeout): {str(e)}", + result=f"Configuration failed (ReadTimeout): {e!s}", failed=True, ) @@ -305,7 +305,7 @@ class ExecuteMultipleDeviceConfigCommands(BaseTool): ) return Result( host=task.host, - result=f"Configuration failed (Unhandled Exception): {str(e)}", + result=f"Configuration failed (Unhandled Exception): {e!s}", failed=True, ) 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 206ca10ea..ab31e9978 100644 --- a/gns3server/agent/gns3_copilot/tools_v2/display_tools_nornir.py +++ b/gns3server/agent/gns3_copilot/tools_v2/display_tools_nornir.py @@ -253,7 +253,7 @@ class ExecuteMultipleDeviceCommands(BaseTool): except Exception as e: # Overall execution failed logger.error("Error executing display on all devices: %s", e) - return [{"status": "failed", "error": f"Execution error: {str(e)}"}] + return [{"status": "failed", "error": f"Execution error: {e!s}"}] logger.debug( "Multiple device display execution completed. Results: %s", @@ -288,7 +288,7 @@ class ExecuteMultipleDeviceCommands(BaseTool): ) return Result( host=task.host, - result=f"diagnostic command failed (ReadTimeout): {str(e)}", + result=f"diagnostic command failed (ReadTimeout): {e!s}", failed=True, ) @@ -313,7 +313,7 @@ class ExecuteMultipleDeviceCommands(BaseTool): ) return Result( host=task.host, - result=f"diagnostic command failed (Unhandled): {str(e)}", + result=f"diagnostic command failed (Unhandled): {e!s}", failed=True, ) diff --git a/gns3server/agent/gns3_copilot/tools_v2/gns3_create_link.py b/gns3server/agent/gns3_copilot/tools_v2/gns3_create_link.py index ff11c6a44..c70c559ba 100644 --- a/gns3server/agent/gns3_copilot/tools_v2/gns3_create_link.py +++ b/gns3server/agent/gns3_copilot/tools_v2/gns3_create_link.py @@ -238,7 +238,7 @@ class GNS3LinkTool(BaseTool): created_links.append(link_info) except Exception as e: - error_msg = f"Failed to create link {i}: {str(e)}" + error_msg = f"Failed to create link {i}: {e!s}" logger.error(error_msg) created_links.append({"error": error_msg}) @@ -257,7 +257,7 @@ class GNS3LinkTool(BaseTool): return [{"error": f"Invalid JSON input: {e}"}] except Exception as e: logger.error("Failed to process link creation: %s", e) - return [{"error": f"Failed to process link creation: {str(e)}"}] + return [{"error": f"Failed to process link creation: {e!s}"}] if __name__ == "__main__": diff --git a/gns3server/agent/gns3_copilot/tools_v2/gns3_create_node.py b/gns3server/agent/gns3_copilot/tools_v2/gns3_create_node.py index bdbc0bf42..60b2b0801 100644 --- a/gns3server/agent/gns3_copilot/tools_v2/gns3_create_node.py +++ b/gns3server/agent/gns3_copilot/tools_v2/gns3_create_node.py @@ -244,7 +244,7 @@ class GNS3CreateNodeTool(BaseTool): except Exception as e: error_info = { - "error": f"Node {i + 1} creation failed: {str(e)}", + "error": f"Node {i + 1} creation failed: {e!s}", "status": "failed", } results.append(error_info) @@ -280,7 +280,7 @@ class GNS3CreateNodeTool(BaseTool): return {"error": f"Invalid JSON input: {e}"} except Exception as e: logger.error("Failed to process node creation request: %s", e) - return {"error": f"Failed to process node creation request: {str(e)}"} + return {"error": f"Failed to process node creation request: {e!s}"} if __name__ == "__main__": diff --git a/gns3server/agent/gns3_copilot/tools_v2/gns3_get_node_temp.py b/gns3server/agent/gns3_copilot/tools_v2/gns3_get_node_temp.py index af685ea4b..594c2c2cf 100644 --- a/gns3server/agent/gns3_copilot/tools_v2/gns3_get_node_temp.py +++ b/gns3server/agent/gns3_copilot/tools_v2/gns3_get_node_temp.py @@ -168,7 +168,7 @@ class GNS3TemplateTool(BaseTool): except Exception as e: logger.error("Failed to connect to GNS3 server or retrieve templates: %s", e) - return {"error": f"Failed to retrieve templates: {str(e)}"} + return {"error": f"Failed to retrieve templates: {e!s}"} if __name__ == "__main__": diff --git a/gns3server/agent/gns3_copilot/tools_v2/gns3_packet_filter.py b/gns3server/agent/gns3_copilot/tools_v2/gns3_packet_filter.py index be7af824f..ed563cbbd 100644 --- a/gns3server/agent/gns3_copilot/tools_v2/gns3_packet_filter.py +++ b/gns3server/agent/gns3_copilot/tools_v2/gns3_packet_filter.py @@ -239,7 +239,7 @@ class GNS3PacketFilterTool(BaseTool): return {"error": f"Invalid JSON input: {e}"} except Exception as e: logger.error("Failed to process packet filter request: %s", e) - return {"error": f"Failed to process packet filter request: {str(e)}"} + return {"error": f"Failed to process packet filter request: {e!s}"} def _get_available_filters(self, gns3_ctx: dict, project_id: str, link_id: str) -> dict[str, Any]: """Get available filter types for the link.""" @@ -260,7 +260,7 @@ class GNS3PacketFilterTool(BaseTool): return { "action": "get_available", "link_id": link_id, - "error": f"Failed to get available filters: {str(e)}", + "error": f"Failed to get available filters: {e!s}", "status": "failed", } @@ -318,7 +318,7 @@ class GNS3PacketFilterTool(BaseTool): except Exception as e: logger.error("Unexpected error during BPF validation: %s", e) - return {"valid": False, "error": f"BPF validation error: {str(e)}"} + return {"valid": False, "error": f"BPF validation error: {e!s}"} def _set_filters( self, @@ -384,7 +384,7 @@ class GNS3PacketFilterTool(BaseTool): return { "action": "set", "link_id": link_id, - "error": f"Failed to set filters: {str(e)}", + "error": f"Failed to set filters: {e!s}", "status": "failed", } @@ -407,7 +407,7 @@ class GNS3PacketFilterTool(BaseTool): return { "action": "get", "link_id": link_id, - "error": f"Failed to get filters: {str(e)}", + "error": f"Failed to get filters: {e!s}", "status": "failed", } @@ -449,7 +449,7 @@ class GNS3PacketFilterTool(BaseTool): return { "action": "clear", "link_id": link_id, - "error": f"Failed to clear filters: {str(e)}", + "error": f"Failed to clear filters: {e!s}", "status": "failed", } diff --git a/gns3server/agent/gns3_copilot/tools_v2/gns3_start_node.py b/gns3server/agent/gns3_copilot/tools_v2/gns3_start_node.py index 4086cde1b..2fb17f8f8 100644 --- a/gns3server/agent/gns3_copilot/tools_v2/gns3_start_node.py +++ b/gns3server/agent/gns3_copilot/tools_v2/gns3_start_node.py @@ -220,7 +220,7 @@ class GNS3StartNodeTool(BaseTool): return {"error": f"Invalid JSON input: {e}"} except Exception as e: logger.error("Failed to start nodes: %s", e) - return {"error": f"Failed to start nodes: {str(e)}"} + return {"error": f"Failed to start nodes: {e!s}"} # Backward-compat alias: the waiting variant was removed; both names now diff --git a/gns3server/agent/gns3_copilot/tools_v2/gns3_stop_node.py b/gns3server/agent/gns3_copilot/tools_v2/gns3_stop_node.py index d6965f19b..b4ef8cfd5 100644 --- a/gns3server/agent/gns3_copilot/tools_v2/gns3_stop_node.py +++ b/gns3server/agent/gns3_copilot/tools_v2/gns3_stop_node.py @@ -198,7 +198,7 @@ class GNS3StopNodeTool(BaseTool): return {"error": f"Invalid JSON input: {e}"} except Exception as e: logger.error("Failed to stop nodes: %s", e) - return {"error": f"Failed to stop nodes: {str(e)}"} + return {"error": f"Failed to stop nodes: {e!s}"} if __name__ == "__main__": diff --git a/gns3server/agent/gns3_copilot/tools_v2/gns3_suspend_node.py b/gns3server/agent/gns3_copilot/tools_v2/gns3_suspend_node.py index 47a0cc4b1..25dda50fd 100644 --- a/gns3server/agent/gns3_copilot/tools_v2/gns3_suspend_node.py +++ b/gns3server/agent/gns3_copilot/tools_v2/gns3_suspend_node.py @@ -209,7 +209,7 @@ class GNS3SuspendNodeTool(BaseTool): return {"error": f"Invalid JSON input: {e}"} except Exception as e: logger.error("Failed to suspend nodes: %s", e) - return {"error": f"Failed to suspend nodes: {str(e)}"} + return {"error": f"Failed to suspend nodes: {e!s}"} if __name__ == "__main__": diff --git a/gns3server/agent/gns3_copilot/tools_v2/gns3_update_node_name.py b/gns3server/agent/gns3_copilot/tools_v2/gns3_update_node_name.py index 7756b33a2..3121bc598 100644 --- a/gns3server/agent/gns3_copilot/tools_v2/gns3_update_node_name.py +++ b/gns3server/agent/gns3_copilot/tools_v2/gns3_update_node_name.py @@ -241,7 +241,7 @@ class GNS3UpdateNodeNameTool(BaseTool): return {"error": f"Invalid JSON input: {e}"} except Exception as e: logger.error("Failed to update node names: %s", e) - return {"error": f"Failed to update node names: {str(e)}"} + return {"error": f"Failed to update node names: {e!s}"} if __name__ == "__main__": diff --git a/gns3server/agent/gns3_copilot/tools_v2/gns3_wait.py b/gns3server/agent/gns3_copilot/tools_v2/gns3_wait.py index 15a9ed24e..ed2f12802 100644 --- a/gns3server/agent/gns3_copilot/tools_v2/gns3_wait.py +++ b/gns3server/agent/gns3_copilot/tools_v2/gns3_wait.py @@ -104,4 +104,4 @@ class GNS3WaitTool(BaseTool): return {"error": f"Invalid JSON input: {e}"} except Exception as e: logger.error("Wait tool failed: %s", e) - return {"error": f"Wait tool failed: {str(e)}"} + return {"error": f"Wait tool failed: {e!s}"} diff --git a/gns3server/agent/gns3_copilot/tools_v2/packet_analysis_tool.py b/gns3server/agent/gns3_copilot/tools_v2/packet_analysis_tool.py index c5f30bf79..5aacb0ed7 100644 --- a/gns3server/agent/gns3_copilot/tools_v2/packet_analysis_tool.py +++ b/gns3server/agent/gns3_copilot/tools_v2/packet_analysis_tool.py @@ -325,7 +325,7 @@ class PacketAnalysisTool(BaseTool): except Exception as e: logger.error(f"PacketAnalysisTool error: {e}", exc_info=True) - return f'{{"error": "Analysis failed: {str(e)}"}}' + return f'{{"error": "Analysis failed: {e!s}"}}' finally: # Clean up temp file @@ -497,7 +497,7 @@ class PacketAnalysisTool(BaseTool): return '{"error": "tshark not installed. Please install tshark: apt install tshark"}' except Exception as e: logger.error(f"tshark execution error: {e}", exc_info=True) - return f'{{"error": "tshark failed: {str(e)}"}}' + return f'{{"error": "tshark failed: {e!s}"}}' if __name__ == "__main__": 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 d9186d2d4..26a512dc5 100644 --- a/gns3server/agent/gns3_copilot/tools_v2/vpcs_tools_netmiko.py +++ b/gns3server/agent/gns3_copilot/tools_v2/vpcs_tools_netmiko.py @@ -227,7 +227,7 @@ class VPCSCommands(BaseTool): except Exception as e: # Overall execution failed logger.error("Error executing commands on all VPCS devices: %s", e) - return [{"status": "failed", "error": f"Execution error: {str(e)}"}] + return [{"status": "failed", "error": f"Execution error: {e!s}"}] logger.debug( "VPCS command execution completed. Results: %s", @@ -262,7 +262,7 @@ class VPCSCommands(BaseTool): ) return Result( host=task.host, - result=f"Command failed (ReadTimeout): {str(e)}", + result=f"Command failed (ReadTimeout): {e!s}", failed=True, ) @@ -289,7 +289,7 @@ class VPCSCommands(BaseTool): ) return Result( host=task.host, - result=f"Command failed: {str(retry_e)}", + result=f"Command failed: {retry_e!s}", failed=True, ) diff --git a/gns3server/agent/gns3_copilot/utils/parse_tool_content.py b/gns3server/agent/gns3_copilot/utils/parse_tool_content.py index 350a6bf50..736d792c3 100644 --- a/gns3server/agent/gns3_copilot/utils/parse_tool_content.py +++ b/gns3server/agent/gns3_copilot/utils/parse_tool_content.py @@ -496,7 +496,7 @@ def _test_parse_tool_content() -> None: for i, (input_data, expected) in enumerate(test_cases): result = parse_tool_content(input_data) status = "✓" if result == expected else "✗" - print(f"Test {i + 1}: {status} Input: {repr(input_data)} -> {result}") + print(f"Test {i + 1}: {status} Input: {input_data!r} -> {result}") print("\nTesting format_tool_response function:") format_tests = [ @@ -518,7 +518,7 @@ def _test_parse_tool_content() -> None: valid = "✓" except Exception: valid = "✗" - print(f"Format Test {i + 1}: {valid} Input: {repr(input_data)} -> {result}") + print(f"Format Test {i + 1}: {valid} Input: {input_data!r} -> {result}") if __name__ == "__main__": diff --git a/gns3server/compute/docker/docker_vm.py b/gns3server/compute/docker/docker_vm.py index 08559b990..4bb9b4344 100644 --- a/gns3server/compute/docker/docker_vm.py +++ b/gns3server/compute/docker/docker_vm.py @@ -1468,7 +1468,7 @@ class DockerVM(BaseNode): pass # Ignore runtime error because when closing the server except RuntimeError as e: - log.debug(f"Docker runtime error when closing: {str(e)}") + log.debug(f"Docker runtime error when closing: {e!s}") return self.status = "stopped" @@ -1571,7 +1571,7 @@ class DockerVM(BaseNode): self.manager.port_manager.release_udp_port(nio.lport, self._project) # Ignore runtime error because when closing the server except (DockerHttp404Error, RuntimeError) as e: - log.debug(f"Docker error when closing: {str(e)}") + log.debug(f"Docker error when closing: {e!s}") return def _get_container_ifname(self, adapter_number): @@ -1775,7 +1775,7 @@ class DockerVM(BaseNode): for index in range(4096): if f"tap-gns3-e{index}" not in psutil.net_if_addrs(): - adapter.host_ifc = f"tap-gns3-e{str(index)}" + adapter.host_ifc = f"tap-gns3-e{index!s}" break if adapter.host_ifc is None: raise DockerError( diff --git a/gns3server/compute/dynamips/nodes/router.py b/gns3server/compute/dynamips/nodes/router.py index 2eedfc2c4..8aabf6ddd 100644 --- a/gns3server/compute/dynamips/nodes/router.py +++ b/gns3server/compute/dynamips/nodes/router.py @@ -97,7 +97,7 @@ class Router(BaseNode): try: os.makedirs(os.path.join(self._working_directory, "configs"), exist_ok=True) except OSError as e: - raise DynamipsError(f"Can't create the dynamips config directory: {str(e)}") + raise DynamipsError(f"Can't create the dynamips config directory: {e!s}") if dynamips_id: self._convert_before_2_0_0_b3(dynamips_id) @@ -153,7 +153,7 @@ class Router(BaseNode): try: shutil.move(path, dst) except OSError as e: - log.error(f"Can't move {path}: {str(e)}") + log.error(f"Can't move {path}: {e!s}") continue for path in glob.glob(os.path.join(glob.escape(dynamips_dir), f"*_i{dynamips_id}_*")): dst = os.path.join(self._working_directory, os.path.basename(path)) @@ -161,7 +161,7 @@ class Router(BaseNode): try: shutil.move(path, dst) except OSError as e: - log.error(f"Can't move {path}: {str(e)}") + log.error(f"Can't move {path}: {e!s}") continue def asdict(self): @@ -1608,7 +1608,7 @@ class Router(BaseNode): try: open(output_file, "w+").close() except OSError as e: - raise DynamipsError(f'Can not write capture to "{output_file}": {str(e)}') + raise DynamipsError(f'Can not write capture to "{output_file}": {e!s}') try: adapter = self._slots[slot_number] diff --git a/gns3server/controller/gns3vm/__init__.py b/gns3server/controller/gns3vm/__init__.py index 0c3c95122..a20a1e81d 100644 --- a/gns3server/controller/gns3vm/__init__.py +++ b/gns3server/controller/gns3vm/__init__.py @@ -334,7 +334,7 @@ class GNS3VM: await engine.start() except Exception as e: await self._controller.delete_compute("vm") - log.error(f"Cannot start the GNS3 VM: {str(e)}") + log.error(f"Cannot start the GNS3 VM: {e!s}") await compute.update(name=f"GNS3 VM ({engine.vmname})") compute.set_last_error(str(e)) raise e diff --git a/gns3server/controller/gns3vm/virtualbox_gns3_vm.py b/gns3server/controller/gns3vm/virtualbox_gns3_vm.py index f3a78f03d..5fe733cd5 100644 --- a/gns3server/controller/gns3vm/virtualbox_gns3_vm.py +++ b/gns3server/controller/gns3vm/virtualbox_gns3_vm.py @@ -260,7 +260,7 @@ class VirtualBoxGNS3VM(BaseGNS3VM): await self._check_requirements() return await self._virtualbox_manager.list_vms() except VirtualBoxError as e: - raise GNS3VMError(f"Could not list VirtualBox VMs: {str(e)}") + raise GNS3VMError(f"Could not list VirtualBox VMs: {e!s}") async def start(self): """ diff --git a/gns3server/controller/gns3vm/vmware_gns3_vm.py b/gns3server/controller/gns3vm/vmware_gns3_vm.py index 5062d8dc9..b19c85ad9 100644 --- a/gns3server/controller/gns3vm/vmware_gns3_vm.py +++ b/gns3server/controller/gns3vm/vmware_gns3_vm.py @@ -116,7 +116,7 @@ class VMwareGNS3VM(BaseGNS3VM): try: return await self._vmware_manager.list_vms() except VMwareError as e: - raise GNS3VMError(f"Could not list VMware VMs: {str(e)}") + raise GNS3VMError(f"Could not list VMware VMs: {e!s}") async def start(self): """ @@ -143,7 +143,7 @@ class VMwareGNS3VM(BaseGNS3VM): try: running = await self._is_running() except VMwareError as e: - raise GNS3VMError(f"Could not list VMware VMs: {str(e)}") + raise GNS3VMError(f"Could not list VMware VMs: {e!s}") if not running: # set the number of vCPUs and amount of RAM if self.allocate_vcpus_ram: @@ -197,7 +197,7 @@ class VMwareGNS3VM(BaseGNS3VM): try: await self._execute("suspend", [self._vmx_path]) except GNS3VMError as e: - log.warning(f"Error when suspending the VM: {str(e)}") + log.warning(f"Error when suspending the VM: {e!s}") log.info("GNS3 VM has been suspended") self.running = False @@ -211,6 +211,6 @@ class VMwareGNS3VM(BaseGNS3VM): try: await self._execute("stop", [self._vmx_path, "soft"]) except GNS3VMError as e: - log.warning(f"Error when stopping the VM: {str(e)}") + log.warning(f"Error when stopping the VM: {e!s}") log.info("GNS3 VM has been stopped") self.running = False diff --git a/gns3server/controller/link.py b/gns3server/controller/link.py index 2a7ec02d8..c2ef20f7a 100644 --- a/gns3server/controller/link.py +++ b/gns3server/controller/link.py @@ -222,7 +222,7 @@ class Link: try: validate_all_filters(new_filters) except FilterValidationError as e: - raise ControllerError(f"Invalid packet filter parameters: {str(e)}") + raise ControllerError(f"Invalid packet filter parameters: {e!s}") if new_filters != self.filters: self._filters = new_filters @@ -483,7 +483,7 @@ class Link: # Re-raise ControllerError to return error to client raise except Exception as e: - error_msg = f"Error starting Web Wireshark: {str(e)}" + error_msg = f"Error starting Web Wireshark: {e!s}" log.error(error_msg) raise ControllerError(error_msg) finally: @@ -532,7 +532,7 @@ class Link: except ControllerError: raise except Exception as e: - error_msg = f"Error restarting Web Wireshark: {str(e)}" + error_msg = f"Error restarting Web Wireshark: {e!s}" log.error(error_msg) raise ControllerError(error_msg) finally: diff --git a/gns3server/controller/node.py b/gns3server/controller/node.py index dac44f60d..6fb64045f 100644 --- a/gns3server/controller/node.py +++ b/gns3server/controller/node.py @@ -1050,7 +1050,7 @@ class Node: with open(image, "rb") as f: await self._compute.post(f"/{self._node_type}/images/{os.path.basename(img)}", data=f, timeout=None) except OSError as e: - raise ControllerError(f"Can't upload {image}: {str(e)}") + raise ControllerError(f"Can't upload {image}: {e!s}") self.project.emit_notification("log.info", {"message": f"Upload finished for {img}"}) return True diff --git a/gns3server/controller/ports/port_factory.py b/gns3server/controller/ports/port_factory.py index c17434578..0568ef788 100644 --- a/gns3server/controller/ports/port_factory.py +++ b/gns3server/controller/ports/port_factory.py @@ -88,7 +88,7 @@ class StandardPortFactory: **cls._generate_replacement(interface_number, segment_number), ) except (IndexError, ValueError, KeyError) as e: - raise ControllerError(f"Invalid port name format {port_name_format}: {str(e)}") + raise ControllerError(f"Invalid port name format {port_name_format}: {e!s}") port_name = custom_adapter_settings.get("port_name", port_name) port = PortFactory(port_name, segment_number, adapter_number, port_number, "ethernet") diff --git a/gns3server/controller/project.py b/gns3server/controller/project.py index ad42e9323..83b95b41f 100644 --- a/gns3server/controller/project.py +++ b/gns3server/controller/project.py @@ -1731,7 +1731,7 @@ class Project: ) shutil.rmtree(self.path) except OSError as e: - raise ControllerError(f"Cannot delete project directory {self.path}: {str(e)}") + raise ControllerError(f"Cannot delete project directory {self.path}: {e!s}") self.emit_controller_notification("project.deleted", self.asdict()) def _get_disconnected_computes(self): @@ -2081,7 +2081,7 @@ class Project: else: log.info("Fast duplication failed, fallback to normal duplication") except Exception as e: - raise ControllerError(f"Cannot duplicate project: {str(e)}") + raise ControllerError(f"Cannot duplicate project: {e!s}") try: begin = time.time() @@ -2119,7 +2119,7 @@ class Project: log.info(f"Project '{project.name}' duplicated in {time.time() - begin:.4f} seconds") except (ValueError, OSError, UnicodeEncodeError) as e: - raise ControllerError(f"Cannot duplicate project: {str(e)}") + raise ControllerError(f"Cannot duplicate project: {e!s}") if previous_status == "closed": await self.close() diff --git a/gns3server/controller/topology.py b/gns3server/controller/topology.py index f2390930a..1e5dd3810 100644 --- a/gns3server/controller/topology.py +++ b/gns3server/controller/topology.py @@ -139,7 +139,7 @@ def load_topology(path): with open(path, encoding="utf-8") as f: topo = json.load(f) except (OSError, UnicodeDecodeError, ValueError) as e: - raise ControllerError(f"Could not load topology {path}: {str(e)}") + raise ControllerError(f"Could not load topology {path}: {e!s}") if topo.get("revision", 0) > GNS3_FILE_FORMAT_REVISION: raise ControllerError( @@ -154,7 +154,7 @@ def load_topology(path): try: shutil.copy(path, path + ".backup{}".format(topo.get("revision", 0))) except OSError as e: - raise ControllerError(f"Can't write backup of the topology {path}: {str(e)}") + raise ControllerError(f"Can't write backup of the topology {path}: {e!s}") changed = True # update the version because we converted the topology topo["version"] = __version__ @@ -210,7 +210,7 @@ def load_topology(path): with open(path, "w+", encoding="utf-8") as f: json.dump(topo, f, indent=4, sort_keys=True) except OSError as e: - raise ControllerError(f"Can't write the topology {path}: {str(e)}") + raise ControllerError(f"Can't write the topology {path}: {e!s}") return topo @@ -326,7 +326,7 @@ def _convert_2_0_0_beta_2(topo, topo_path): for path in glob.glob(os.path.join(glob.escape(dynamips_dir), "configs", f"i{dynamips_id}_*")): shutil.move(path, os.path.join(node_dir, "configs", os.path.basename(path))) except OSError as e: - raise ControllerError(f"Can't convert project {topo_path}: {str(e)}") + raise ControllerError(f"Can't convert project {topo_path}: {e!s}") return topo diff --git a/gns3server/utils/images.py b/gns3server/utils/images.py index 06b4ae9be..60d61ddc0 100644 --- a/gns3server/utils/images.py +++ b/gns3server/utils/images.py @@ -114,7 +114,7 @@ async def list_images(image_type): } ) except OSError as e: - log.warning(f"Can't add image {path}: {str(e)}") + log.warning(f"Can't add image {path}: {e!s}") return images diff --git a/gns3server/utils/packet_filter_validation.py b/gns3server/utils/packet_filter_validation.py index 1b9481ffd..d20ac9f24 100644 --- a/gns3server/utils/packet_filter_validation.py +++ b/gns3server/utils/packet_filter_validation.py @@ -62,7 +62,7 @@ def validate_bpf_syntax(bpf_expression: str) -> Dict[str, Any]: except Exception as e: log.error("Unexpected error during BPF validation: %s", e) - return {"valid": False, "error": f"BPF validation error: {str(e)}"} + return {"valid": False, "error": f"BPF validation error: {e!s}"} def validate_filter_parameters(filter_type: str, values: List[Any]) -> None: diff --git a/tests/stress/benchmark_running_server.py b/tests/stress/benchmark_running_server.py index 6400aebe1..234372100 100644 --- a/tests/stress/benchmark_running_server.py +++ b/tests/stress/benchmark_running_server.py @@ -134,7 +134,7 @@ async def benchmark_get_projects(base_url, headers, project_count, iterations=10 else: print(f" Iteration {i + 1}: ERROR {response.status_code}") except Exception as e: - print(f" Iteration {i + 1}: Exception - {type(e).__name__}: {str(e)}") + print(f" Iteration {i + 1}: Exception - {type(e).__name__}: {e!s}") # Cleanup test projects if project_count > 0: