From 898205a33bf0d87c3df4c117111fdcbaf0bf40f5 Mon Sep 17 00:00:00 2001 From: Mark Paronyan Date: Mon, 28 Sep 2026 05:08:30 +0000 Subject: [PATCH 1/7] fix(typing): resolve mypy errors in schemas.compute.vmware_nodes --- gns3server/schemas/compute/vmware_nodes.py | 17 ++++++++++------- pyproject.toml | 1 - 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/gns3server/schemas/compute/vmware_nodes.py b/gns3server/schemas/compute/vmware_nodes.py index ee670a2bc..f838419a3 100644 --- a/gns3server/schemas/compute/vmware_nodes.py +++ b/gns3server/schemas/compute/vmware_nodes.py @@ -62,9 +62,9 @@ class VMwareBase(BaseModel): Common VMware node properties. """ - name: str - vmx_path: str = Field(..., description="Path to the vmx file") - linked_clone: bool = Field(..., description="Whether the VM is a linked clone or not") + name: Optional[str] = None + vmx_path: Optional[str] = None + linked_clone: Optional[bool] = None node_id: Optional[UUID] = None usage: Optional[str] = Field(None, description="How to use the node") console: Optional[int] = Field(None, gt=0, le=65535, description="Console TCP port") @@ -83,7 +83,9 @@ class VMwareCreate(VMwareBase): Properties to create a VMware node. """ - pass + name: str + vmx_path: str = Field(..., description="Path to the vmx file") + linked_clone: bool = Field(..., description="Whether the VM is a linked clone or not") class VMwareUpdate(VMwareBase): @@ -91,12 +93,13 @@ class VMwareUpdate(VMwareBase): Properties to update a VMware node. """ - name: Optional[str] = None - vmx_path: Optional[str] = None - linked_clone: Optional[bool] = None + pass class VMware(VMwareBase): + name: str + vmx_path: str = Field(..., description="Path to the vmx file") + linked_clone: bool = Field(..., description="Whether the VM is a linked clone or not") project_id: UUID = Field(..., description="Project ID") node_directory: Optional[str] = Field(None, description="Path to the node working directory (read only)") status: NodeStatus = Field(..., description="Container status (read only)") diff --git a/pyproject.toml b/pyproject.toml index 258447eb6..bbcbfa968 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -383,7 +383,6 @@ module = [ "gns3server.schemas.compute.nat_nodes", # 1 "gns3server.schemas.compute.qemu_nodes", # 1 "gns3server.schemas.compute.virtualbox_nodes", # 2 - "gns3server.schemas.compute.vmware_nodes", # 3 "gns3server.schemas.compute.vpcs_nodes", # 1 "gns3server.schemas.controller.appliances", # 1 "gns3server.schemas.controller.computes", # 6 From d027146fb95e37ada84130e47f1b569cbf6b67e1 Mon Sep 17 00:00:00 2001 From: Mark Paronyan Date: Mon, 28 Sep 2026 04:46:34 +0000 Subject: [PATCH 2/7] fix(typing): resolve mypy errors in schemas.compute.vpcs_nodes --- gns3server/schemas/compute/vpcs_nodes.py | 7 ++++--- pyproject.toml | 1 - 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/gns3server/schemas/compute/vpcs_nodes.py b/gns3server/schemas/compute/vpcs_nodes.py index 30cd40960..fda0634c4 100644 --- a/gns3server/schemas/compute/vpcs_nodes.py +++ b/gns3server/schemas/compute/vpcs_nodes.py @@ -37,7 +37,7 @@ class VPCSBase(BaseModel): Common VPCS node properties. """ - name: str + name: Optional[str] = None node_id: Optional[UUID] = None usage: Optional[str] = Field(None, description="How to use the node") console: Optional[int] = Field(None, gt=0, le=65535, description="Console TCP port") @@ -50,7 +50,7 @@ class VPCSCreate(VPCSBase): Properties to create a VPCS node. """ - pass + name: str class VPCSUpdate(VPCSBase): @@ -58,10 +58,11 @@ class VPCSUpdate(VPCSBase): Properties to update a VPCS node. """ - name: Optional[str] = None + pass class VPCS(VPCSBase): + name: str project_id: UUID = Field(..., description="Project ID") node_directory: str = Field(..., description="Path to the node working directory (read only)") status: NodeStatus = Field(..., description="Container status (read only)") diff --git a/pyproject.toml b/pyproject.toml index bbcbfa968..7ed8113e2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -383,7 +383,6 @@ module = [ "gns3server.schemas.compute.nat_nodes", # 1 "gns3server.schemas.compute.qemu_nodes", # 1 "gns3server.schemas.compute.virtualbox_nodes", # 2 - "gns3server.schemas.compute.vpcs_nodes", # 1 "gns3server.schemas.controller.appliances", # 1 "gns3server.schemas.controller.computes", # 6 "gns3server.schemas.controller.nodes", # 3 From 7439e91f5ac9cb8f1940385260fbae77603d5fcf Mon Sep 17 00:00:00 2001 From: Mark Paronyan Date: Mon, 28 Sep 2026 04:53:44 +0000 Subject: [PATCH 3/7] fix(typing): resolve mypy errors in schemas.controller.appliances --- gns3server/schemas/controller/appliances.py | 2 +- pyproject.toml | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/gns3server/schemas/controller/appliances.py b/gns3server/schemas/controller/appliances.py index a4aecaa94..3660067b8 100644 --- a/gns3server/schemas/controller/appliances.py +++ b/gns3server/schemas/controller/appliances.py @@ -782,7 +782,7 @@ Appliance = ApplianceUnion # Create a validator wrapper for convenience from pydantic import TypeAdapter -_appliance_validator = TypeAdapter(ApplianceUnion) +_appliance_validator: TypeAdapter[Union[ApplianceV1_6, ApplianceV8]] = TypeAdapter(ApplianceUnion) class ApplianceModel: diff --git a/pyproject.toml b/pyproject.toml index 7ed8113e2..c4806fbe4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -383,7 +383,6 @@ module = [ "gns3server.schemas.compute.nat_nodes", # 1 "gns3server.schemas.compute.qemu_nodes", # 1 "gns3server.schemas.compute.virtualbox_nodes", # 2 - "gns3server.schemas.controller.appliances", # 1 "gns3server.schemas.controller.computes", # 6 "gns3server.schemas.controller.nodes", # 3 "gns3server.schemas.controller.projects", # 2 From a68e57dd2e4a4e70472daac4800cc850305b6677 Mon Sep 17 00:00:00 2001 From: Mark Paronyan Date: Mon, 28 Sep 2026 05:08:39 +0000 Subject: [PATCH 4/7] fix(typing): resolve mypy errors in schemas.controller.nodes --- gns3server/schemas/controller/nodes.py | 16 ++++++++++------ pyproject.toml | 1 - 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/gns3server/schemas/controller/nodes.py b/gns3server/schemas/controller/nodes.py index 43d8ca5b4..9faf260d3 100644 --- a/gns3server/schemas/controller/nodes.py +++ b/gns3server/schemas/controller/nodes.py @@ -114,9 +114,9 @@ class NodeBase(BaseModel): Node data. """ - compute_id: Union[UUID, str] - name: str - node_type: NodeType + compute_id: Optional[Union[UUID, str]] = None + name: Optional[str] = None + node_type: Optional[NodeType] = None node_id: Optional[UUID] = None @@ -162,6 +162,9 @@ class NodeBase(BaseModel): class NodeCreate(NodeBase): + compute_id: Union[UUID, str] + name: str + node_type: NodeType node_id: UUID = Field(default_factory=uuid4) @@ -170,12 +173,13 @@ class NodeUpdate(NodeBase): Data to update a node. """ - compute_id: Optional[Union[UUID, str]] = None - name: Optional[str] = None - node_type: Optional[NodeType] = None + pass class Node(NodeBase): + compute_id: Union[UUID, str] + name: str + node_type: NodeType template_id: Optional[UUID] = Field( None, description="Template UUID from which the node has been created. Read only" ) diff --git a/pyproject.toml b/pyproject.toml index c4806fbe4..16afd963b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -384,7 +384,6 @@ module = [ "gns3server.schemas.compute.qemu_nodes", # 1 "gns3server.schemas.compute.virtualbox_nodes", # 2 "gns3server.schemas.controller.computes", # 6 - "gns3server.schemas.controller.nodes", # 3 "gns3server.schemas.controller.projects", # 2 "gns3server.schemas.controller.settings", # 3 "gns3server.schemas.controller.templates.docker_templates", # 1 From 01dd09495c80b562bd7fc6c5a601a081a7f90aba Mon Sep 17 00:00:00 2001 From: Mark Paronyan Date: Mon, 28 Sep 2026 04:54:19 +0000 Subject: [PATCH 5/7] fix(typing): resolve mypy errors in schemas.controller.projects --- gns3server/schemas/controller/projects.py | 8 ++++---- pyproject.toml | 1 - 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/gns3server/schemas/controller/projects.py b/gns3server/schemas/controller/projects.py index ddfbde02e..e1210f99f 100644 --- a/gns3server/schemas/controller/projects.py +++ b/gns3server/schemas/controller/projects.py @@ -45,7 +45,7 @@ class ProjectBase(BaseModel): Common properties for projects. """ - name: str + name: Optional[str] = None project_id: Optional[UUID] = None path: Optional[str] = Field(None, description="Project directory") auto_close: Optional[bool] = Field(None, description="Close project when last client leaves") @@ -69,7 +69,7 @@ class ProjectCreate(ProjectBase): Properties for project creation. """ - pass + name: str class ProjectDuplicate(ProjectBase): @@ -77,6 +77,7 @@ class ProjectDuplicate(ProjectBase): Properties for project duplication. """ + name: str reset_mac_addresses: Optional[bool] = Field(False, description="Reset MAC addresses for this project") @@ -85,12 +86,11 @@ class ProjectUpdate(ProjectBase): Properties for project update. """ - name: Optional[str] = None + pass class Project(ProjectBase): project_id: UUID - name: Optional[str] = None status: Optional[ProjectStatus] = None filename: Optional[str] = None created_by: Optional[str] = Field(None, description="Username of the user who created the project") diff --git a/pyproject.toml b/pyproject.toml index 16afd963b..c79072b7c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -384,7 +384,6 @@ module = [ "gns3server.schemas.compute.qemu_nodes", # 1 "gns3server.schemas.compute.virtualbox_nodes", # 2 "gns3server.schemas.controller.computes", # 6 - "gns3server.schemas.controller.projects", # 2 "gns3server.schemas.controller.settings", # 3 "gns3server.schemas.controller.templates.docker_templates", # 1 "gns3server.schemas.controller.templates.iou_templates", # 1 From 07dc9b4d7d0103c9ee5e0c5f001ae3c5136e09e9 Mon Sep 17 00:00:00 2001 From: Mark Paronyan Date: Mon, 28 Sep 2026 05:09:17 +0000 Subject: [PATCH 6/7] fix(typing): resolve mypy errors in schemas.controller.settings --- gns3server/schemas/controller/settings.py | 9 ++++++--- pyproject.toml | 1 - 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/gns3server/schemas/controller/settings.py b/gns3server/schemas/controller/settings.py index d64d029e1..9925c403c 100644 --- a/gns3server/schemas/controller/settings.py +++ b/gns3server/schemas/controller/settings.py @@ -25,6 +25,7 @@ says, so exposing or writing it via the API would be useless at best and a secret leak at worst. """ +from pathlib import Path from typing import List, Optional from pydantic import ConfigDict, BaseModel, Field @@ -49,9 +50,11 @@ SECRET_MASK = "**********" class ServerSettingsResponse(ServerSettings): # plain strings instead of FilePath/DirectoryPath: paths are validated when # the settings are loaded or updated, not when echoed back to the client - secrets_dir: Optional[str] = Field(None, description="Directory where secrets are stored (e.g. the JWT secret key)") - certfile: Optional[str] = Field(None, description="SSL certificate file, requires enable_ssl") - certkey: Optional[str] = Field(None, description="SSL key file, requires enable_ssl") + secrets_dir: Optional[Path] = Field( + None, description="Directory where secrets are stored (e.g. the JWT secret key)" + ) + certfile: Optional[Path] = Field(None, description="SSL certificate file, requires enable_ssl") + certkey: Optional[Path] = Field(None, description="SSL key file, requires enable_ssl") # Optional overrides: typed as plain "str = None" in the config schema, # which fails re-validation when the value actually is None resources_path: Optional[str] = Field( diff --git a/pyproject.toml b/pyproject.toml index c79072b7c..2506a25e7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -384,7 +384,6 @@ module = [ "gns3server.schemas.compute.qemu_nodes", # 1 "gns3server.schemas.compute.virtualbox_nodes", # 2 "gns3server.schemas.controller.computes", # 6 - "gns3server.schemas.controller.settings", # 3 "gns3server.schemas.controller.templates.docker_templates", # 1 "gns3server.schemas.controller.templates.iou_templates", # 1 "gns3server.schemas.controller.templates.virtualbox_templates", # 1 From 3abed4070735711a5927f8efc0a7d4a3f2eaff7e Mon Sep 17 00:00:00 2001 From: Mark Paronyan Date: Mon, 28 Sep 2026 04:49:50 +0000 Subject: [PATCH 7/7] fix(typing): resolve mypy errors in schemas.controller.templates.docker_templates --- .../schemas/controller/templates/docker_templates.py | 12 ++++++++---- pyproject.toml | 1 - 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/gns3server/schemas/controller/templates/docker_templates.py b/gns3server/schemas/controller/templates/docker_templates.py index 1c7a320e3..4123630e8 100644 --- a/gns3server/schemas/controller/templates/docker_templates.py +++ b/gns3server/schemas/controller/templates/docker_templates.py @@ -22,11 +22,11 @@ from pydantic import Field from typing import Optional, List -class DockerTemplate(TemplateBase): +class DockerTemplateBase(TemplateBase): category: Optional[Category] = Category.guest default_name_format: Optional[str] = "{name}-{0}" symbol: Optional[str] = "docker_guest" - image: str = Field(..., description="Docker image name") + image: Optional[str] = Field(None, description="Docker image name") adapters: Optional[int] = Field(1, ge=0, le=100, description="Number of adapters") mac_address: Optional[str] = Field( "", description="Base MAC address", pattern="^([0-9a-fA-F]{2}[:]){5}([0-9a-fA-F]{2})$|^$" @@ -58,5 +58,9 @@ class DockerTemplate(TemplateBase): custom_adapters: Optional[List[CustomAdapter]] = Field(default_factory=list, description="Custom adapters") -class DockerTemplateUpdate(DockerTemplate): - image: Optional[str] = Field(None, description="Docker image name") +class DockerTemplate(DockerTemplateBase): + image: str = Field(..., description="Docker image name") + + +class DockerTemplateUpdate(DockerTemplateBase): + pass diff --git a/pyproject.toml b/pyproject.toml index 2506a25e7..c02000879 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -384,7 +384,6 @@ module = [ "gns3server.schemas.compute.qemu_nodes", # 1 "gns3server.schemas.compute.virtualbox_nodes", # 2 "gns3server.schemas.controller.computes", # 6 - "gns3server.schemas.controller.templates.docker_templates", # 1 "gns3server.schemas.controller.templates.iou_templates", # 1 "gns3server.schemas.controller.templates.virtualbox_templates", # 1 "gns3server.schemas.controller.templates.vmware_templates", # 1