From 68368220f21f01c717ef94b061a43d2aad7ee95c Mon Sep 17 00:00:00 2001 From: Mark Paronyan Date: Mon, 28 Sep 2026 05:00:02 +0000 Subject: [PATCH 1/5] fix(typing): resolve mypy errors in api.server --- gns3server/api/server.py | 6 ++++-- pyproject.toml | 1 - 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/gns3server/api/server.py b/gns3server/api/server.py index 3eaade6e8..7827aec7c 100644 --- a/gns3server/api/server.py +++ b/gns3server/api/server.py @@ -19,6 +19,8 @@ FastAPI app """ +from typing import cast + from fastapi import FastAPI, Request, HTTPException, status from fastapi.middleware.cors import CORSMiddleware from fastapi.responses import JSONResponse @@ -118,7 +120,7 @@ def handle_exit(*args, **kwargs): unicorn_exit_handler(*args, **kwargs) -UvicornServer.handle_exit = handle_exit +UvicornServer.handle_exit = handle_exit # type: ignore[method-assign] # Configure self-hosting JavaScript and CSS for docs @@ -134,7 +136,7 @@ async def custom_swagger_ui_html(): ) -@app.get(app.swagger_ui_oauth2_redirect_url, include_in_schema=False) +@app.get(cast(str, app.swagger_ui_oauth2_redirect_url), include_in_schema=False) async def swagger_ui_redirect(): return get_swagger_ui_oauth2_redirect_html() diff --git a/pyproject.toml b/pyproject.toml index 258447eb6..67ff5fe32 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -355,7 +355,6 @@ module = [ "gns3server.api.routes.controller.snapshots", # 1 "gns3server.api.routes.controller.templates", # 10 "gns3server.api.routes.controller.users", # 14 - "gns3server.api.server", # 2 "gns3server.compute.dynamips.nodes.router", # 2 "gns3server.compute.iou.utils.iou_export", # 2 "gns3server.compute.iou.utils.iou_import", # 2 From 1babf7bccee1e69cf8ada0f9aa5668d8e6dfb4f4 Mon Sep 17 00:00:00 2001 From: Mark Paronyan Date: Mon, 28 Sep 2026 04:45:28 +0000 Subject: [PATCH 2/5] fix(typing): resolve mypy errors in compute.dynamips.nodes.router --- gns3server/compute/dynamips/nodes/router.py | 4 ++-- pyproject.toml | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/gns3server/compute/dynamips/nodes/router.py b/gns3server/compute/dynamips/nodes/router.py index 4bc1f77b5..2eedfc2c4 100644 --- a/gns3server/compute/dynamips/nodes/router.py +++ b/gns3server/compute/dynamips/nodes/router.py @@ -1645,7 +1645,7 @@ class Router(BaseNode): await nio.start_packet_capture(output_file, data_link_type) log.debug( 'Router "{name}" [{id}]: starting packet capture on port {slot_number}/{port_number}'.format( - name=self._name, id=self._id, nio_name=nio.name, slot_number=slot_number, port_number=port_number + name=self._name, id=self._id, slot_number=slot_number, port_number=port_number ) ) @@ -1685,7 +1685,7 @@ class Router(BaseNode): log.debug( 'Router "{name}" [{id}]: stopping packet capture on port {slot_number}/{port_number}'.format( - name=self._name, id=self._id, nio_name=nio.name, slot_number=slot_number, port_number=port_number + name=self._name, id=self._id, slot_number=slot_number, port_number=port_number ) ) diff --git a/pyproject.toml b/pyproject.toml index 67ff5fe32..b6cf0462f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -355,7 +355,6 @@ module = [ "gns3server.api.routes.controller.snapshots", # 1 "gns3server.api.routes.controller.templates", # 10 "gns3server.api.routes.controller.users", # 14 - "gns3server.compute.dynamips.nodes.router", # 2 "gns3server.compute.iou.utils.iou_export", # 2 "gns3server.compute.iou.utils.iou_import", # 2 "gns3server.compute.virtualbox.virtualbox_vm", # 1 From a7350ae0c879ef1ccc39e443a15aa80b6064e442 Mon Sep 17 00:00:00 2001 From: Mark Paronyan Date: Mon, 28 Sep 2026 04:59:25 +0000 Subject: [PATCH 3/5] fix(typing): resolve mypy errors in compute.iou.utils --- gns3server/compute/iou/utils/iou_export.py | 15 +++++------- gns3server/compute/iou/utils/iou_import.py | 28 +++++++++------------- pyproject.toml | 2 -- 3 files changed, 17 insertions(+), 28 deletions(-) diff --git a/gns3server/compute/iou/utils/iou_export.py b/gns3server/compute/iou/utils/iou_export.py index f3b67d039..3ee1d2f5c 100644 --- a/gns3server/compute/iou/utils/iou_export.py +++ b/gns3server/compute/iou/utils/iou_export.py @@ -204,9 +204,8 @@ if __name__ == "__main__": args = parser.parse_args() try: - fd = open(args.nvram, "rb") - nvram = fd.read() - fd.close() + with open(args.nvram, "rb") as fd: + nvram = fd.read() except OSError as err: sys.stderr.write(f"Error reading file: {err}\n") sys.exit(1) @@ -218,16 +217,14 @@ if __name__ == "__main__": sys.exit(3) try: - fd = open(args.startup, "wb") - fd.write(startup) - fd.close() + with open(args.startup, "wb") as out: + out.write(startup) if args.private is not None: if private is None: sys.stderr.write("Warning: No private config\n") else: - fd = open(args.private, "wb") - fd.write(private) - fd.close() + with open(args.private, "wb") as out: + out.write(private) except OSError as err: sys.stderr.write(f"Error writing file: {err}\n") sys.exit(1) diff --git a/gns3server/compute/iou/utils/iou_import.py b/gns3server/compute/iou/utils/iou_import.py index 361ed0c54..1dbcbfba4 100644 --- a/gns3server/compute/iou/utils/iou_import.py +++ b/gns3server/compute/iou/utils/iou_import.py @@ -197,22 +197,17 @@ if __name__ == "__main__": parser.add_argument("private", metavar="private-config", nargs="?", help="private configuration") args = parser.parse_args() + nvram: bytes | None = None + private: bytes | None = None try: if args.create is None: - fd = open(args.nvram, "rb") - nvram = fd.read() - fd.close() - else: - nvram = None - fd = open(args.startup, "rb") - startup = fd.read() - fd.close() - if args.private is None: - private = None - else: - fd = open(args.private, "rb") - private = fd.read() - fd.close() + with open(args.nvram, "rb") as fd: + nvram = fd.read() + with open(args.startup, "rb") as fd: + startup = fd.read() + if args.private is not None: + with open(args.private, "rb") as fd: + private = fd.read() except OSError as err: sys.stderr.write(f"Error reading file: {err}\n") sys.exit(1) @@ -224,9 +219,8 @@ if __name__ == "__main__": sys.exit(3) try: - fd = open(args.nvram, "wb") - fd.write(nvram) - fd.close() + with open(args.nvram, "wb") as out: + out.write(nvram) except OSError as err: sys.stderr.write(f"Error writing file: {err}\n") sys.exit(1) diff --git a/pyproject.toml b/pyproject.toml index b6cf0462f..63d910a26 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -355,8 +355,6 @@ module = [ "gns3server.api.routes.controller.snapshots", # 1 "gns3server.api.routes.controller.templates", # 10 "gns3server.api.routes.controller.users", # 14 - "gns3server.compute.iou.utils.iou_export", # 2 - "gns3server.compute.iou.utils.iou_import", # 2 "gns3server.compute.virtualbox.virtualbox_vm", # 1 "gns3server.compute.vpcs.vpcs_vm", # 2 "gns3server.controller.appliance", # 2 From 2542ad4647bf0742924a01daefba5ee8fb689a47 Mon Sep 17 00:00:00 2001 From: Mark Paronyan Date: Mon, 28 Sep 2026 04:44:03 +0000 Subject: [PATCH 4/5] fix(typing): resolve mypy errors in compute.vpcs.vpcs_vm --- gns3server/compute/vpcs/vpcs_vm.py | 12 ++++++++++-- pyproject.toml | 1 - 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/gns3server/compute/vpcs/vpcs_vm.py b/gns3server/compute/vpcs/vpcs_vm.py index b42c4095a..c72405543 100644 --- a/gns3server/compute/vpcs/vpcs_vm.py +++ b/gns3server/compute/vpcs/vpcs_vm.py @@ -148,7 +148,11 @@ class VPCSVM(BaseNode): vpcs_path = shutil.which(vpcs_path) return vpcs_path - @BaseNode.name.setter + @property + def name(self): + return self._name + + @name.setter def name(self, new_name): """ Sets the name of this VPCS VM. @@ -358,7 +362,11 @@ class VPCSVM(BaseNode): if self.is_running(): await self.reset_wrap_console() - @BaseNode.console_type.setter + @property + def console_type(self): + return self._console_type + + @console_type.setter def console_type(self, new_console_type): """ Sets the console type for this VPCS VM. diff --git a/pyproject.toml b/pyproject.toml index 63d910a26..263226226 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -356,7 +356,6 @@ module = [ "gns3server.api.routes.controller.templates", # 10 "gns3server.api.routes.controller.users", # 14 "gns3server.compute.virtualbox.virtualbox_vm", # 1 - "gns3server.compute.vpcs.vpcs_vm", # 2 "gns3server.controller.appliance", # 2 "gns3server.controller.appliance_manager", # 5 "gns3server.controller.project", # 2 From a7b32ca6dfe1a3571d39e0469bd56ce43bf06b6a Mon Sep 17 00:00:00 2001 From: Mark Paronyan Date: Mon, 28 Sep 2026 04:56:53 +0000 Subject: [PATCH 5/5] fix(typing): resolve mypy errors in controller.appliance --- gns3server/controller/appliance.py | 8 ++++---- pyproject.toml | 1 - 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/gns3server/controller/appliance.py b/gns3server/controller/appliance.py index 10d958983..d62cb3a52 100644 --- a/gns3server/controller/appliance.py +++ b/gns3server/controller/appliance.py @@ -51,6 +51,10 @@ class Appliance: def symbol(self): return self._data.get("symbol") + @symbol.setter + def symbol(self, new_symbol): + self._data["symbol"] = new_symbol + @property def name(self): return self._data.get("name") @@ -63,10 +67,6 @@ class Appliance: def versions(self): return self._data.get("versions") - @symbol.setter - def symbol(self, new_symbol): - self._data["symbol"] = new_symbol - @property def type(self): diff --git a/pyproject.toml b/pyproject.toml index 263226226..2d81451cf 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -356,7 +356,6 @@ module = [ "gns3server.api.routes.controller.templates", # 10 "gns3server.api.routes.controller.users", # 14 "gns3server.compute.virtualbox.virtualbox_vm", # 1 - "gns3server.controller.appliance", # 2 "gns3server.controller.appliance_manager", # 5 "gns3server.controller.project", # 2 "gns3server.controller.topology", # 1