Merge branch 'GNS3:3.0' into 3.0

This commit is contained in:
Guobin Yue authored and GitHub committed 2026-02-23 01:37:05 +08:00
commit 66f32cecf2
25 files changed
+117 -64

No files matched your search

@@ -176,6 +176,7 @@ async def update_cloud_nio(
"""
nio = node.get_nio(port_number)
nio.filters.clear()
if nio_data.filters:
nio.filters = nio_data.filters
await node.update_nio(port_number, nio)
@@ -289,6 +289,7 @@ async def update_docker_node_nio(
"""
nio = node.get_nio(adapter_number)
nio.filters.clear()
if nio_data.filters:
nio.filters = nio_data.filters
await node.adapter_update_nio_binding(adapter_number, nio)
@@ -232,6 +232,7 @@ async def update_nio(
"""
nio = node.get_nio(adapter_number, port_number)
nio.filters.clear()
if nio_data.filters:
nio.filters = nio_data.filters
await node.slot_update_nio_binding(adapter_number, port_number, nio)
@@ -250,6 +250,7 @@ async def update_iou_node_nio(
"""
nio = node.get_nio(adapter_number, port_number)
nio.filters.clear()
if nio_data.filters:
nio.filters = nio_data.filters
await node.adapter_update_nio_binding(adapter_number, port_number, nio)
@@ -171,6 +171,7 @@ async def update_nat_node_nio(
"""
nio = node.get_nio(port_number)
nio.filters.clear()
if nio_data.filters:
nio.filters = nio_data.filters
await node.update_nio(port_number, nio)
+2 -2
View File
@@ -304,10 +304,10 @@ async def update_qemu_node_nio(
"""
nio = node.get_nio(adapter_number)
nio.filters.clear()
if nio_data.filters:
nio.filters = nio_data.filters
if nio_data.suspend:
nio.suspend = nio_data.suspend
nio.suspend = nio_data.suspend
await node.adapter_update_nio_binding(adapter_number, nio)
return nio.asdict()
@@ -268,10 +268,10 @@ async def update_virtualbox_node_nio(
"""
nio = node.get_nio(adapter_number)
nio.filters.clear()
if nio_data.filters:
nio.filters = nio_data.filters
if nio_data.suspend:
nio.suspend = nio_data.suspend
nio.suspend = nio_data.suspend
await node.adapter_update_nio_binding(adapter_number, nio)
return nio.asdict()
@@ -233,6 +233,7 @@ async def update_vmware_node_nio(
"""
nio = node.get_nio(adapter_number)
nio.filters.clear()
if nio_data.filters:
nio.filters = nio_data.filters
await node.adapter_update_nio_binding(adapter_number, nio)
@@ -235,6 +235,7 @@ async def update_vpcs_node_nio(
"""
nio = node.get_nio(port_number)
nio.filters.clear()
if nio_data.filters:
nio.filters = nio_data.filters
await node.port_update_nio_binding(port_number, nio)
+4 -1
View File
@@ -113,6 +113,7 @@ async def get_projects(
)
async def create_project(
project_data: schemas.ProjectCreate,
current_user: schemas.User = Depends(get_current_active_user),
) -> schemas.Project:
"""
Create a new project.
@@ -121,7 +122,9 @@ async def create_project(
"""
controller = Controller.instance()
project = await controller.add_project(**jsonable_encoder(project_data, exclude_unset=True))
project_dict = jsonable_encoder(project_data, exclude_unset=True)
project_dict["created_by"] = current_user.username
project = await controller.add_project(**project_dict)
return project.asdict()
+3 -1
View File
@@ -78,5 +78,7 @@ class NIOUDP(NIO):
"type": "nio_udp",
"lport": self._lport,
"rport": self._rport,
"rhost": self._rhost
"rhost": self._rhost,
"suspend": self._suspended,
"filters": self._filters
}
+6 -24
View File
@@ -2438,31 +2438,13 @@ class QemuVM(BaseNode):
) # we do not want any user networking back-end if no adapter is connected.
# Each 32 PCI device we need to add a PCI bridge with max 9 bridges
# Count PCI devices: 4 default + disks (virtio/sata/nvme/scsi) + network adapters
pci_disk_devices = 0
for drive in ["a", "b", "c", "d"]:
# config disk replaces hdd when enabled
if drive == "d" and self._create_config_disk:
continue
if getattr(self, "_hd{}_disk_image".format(drive)):
interface = getattr(self, "_hd{}_disk_interface".format(drive))
# virtio, sata, nvme, and scsi each consume 1 PCI slot; ide and none don't
if interface not in ("none", "ide"):
pci_disk_devices += 1
# config disk (replaces hdd) also consumes a PCI slot if created
if self._create_config_disk and self.config_disk_image:
interface = self.hdd_disk_interface if self.hdd_disk_interface != "none" else self.hda_disk_interface
if interface not in ("none", "ide"):
pci_disk_devices += 1
pci_devices = 4 + pci_disk_devices + len(self._ethernet_adapters)
pci_bridges = math.floor(pci_devices / 32)
# Reserve 32 devices on root pci_bridge,
# since the number of devices used by templates may differ significantly
# and pci_bridges also consume IDs.
# Move network devices to their own bridge
pci_devices_reserved = 32
pci_bridges_created = 0
if pci_bridges >= 1:
if self._qemu_version and parse_version(self._qemu_version) < parse_version("2.4.0"):
raise QemuError("Qemu version 2.4 or later is required to run this VM with a large number of network adapters")
pci_device_id = 4 + pci_bridges + pci_disk_devices # Bridges and disks consume PCI ports
pci_device_id = pci_devices_reserved
for adapter_number, adapter in enumerate(self._ethernet_adapters):
mac = int_to_macaddress(macaddress_to_int(self._mac_address) + adapter_number)
+18
View File
@@ -97,6 +97,7 @@ class Project:
show_interface_labels=False,
variables=None,
supplier=None,
created_by=None,
):
self._controller = controller
@@ -117,6 +118,7 @@ class Project:
self._show_interface_labels = show_interface_labels
self._variables = variables
self._supplier = supplier
self._created_by = created_by
self._loading = False
self._closing = False
@@ -380,6 +382,21 @@ class Project:
"""
self._supplier = supplier
@property
def created_by(self):
"""
Username of the user who created the project
:return: str or None
"""
return self._created_by
@created_by.setter
def created_by(self, created_by):
"""
Setter for the username of the user who created the project
"""
self._created_by = created_by
@property
def auto_start(self):
"""
@@ -1327,6 +1344,7 @@ class Project:
"show_interface_labels": self._show_interface_labels,
"supplier": self._supplier,
"variables": self._variables,
"created_by": self._created_by,
}
def __repr__(self):
+1
View File
@@ -87,6 +87,7 @@ def project_to_topology(project):
"show_interface_labels": project.show_interface_labels,
"variables": project.variables,
"supplier": project.supplier,
"created_by": project.created_by,
"topology": {"nodes": [], "links": [], "computes": [], "drawings": []},
"type": "topology",
"revision": GNS3_FILE_FORMAT_REVISION,
+1 -1
View File
@@ -34,7 +34,7 @@ class UDPNIO(BaseModel):
lport: int = Field(..., gt=0, le=65535, description="Local port")
rhost: str = Field(..., description="Remote host")
rport: int = Field(..., gt=0, le=65535, description="Remote port")
suspend: Optional[int] = Field(None, description="Suspend the NIO")
suspend: Optional[bool] = Field(None, description="Suspend the NIO")
filters: Optional[dict] = Field(None, description="Packet filters")
@@ -96,6 +96,7 @@ class Project(ProjectBase):
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")
class ProjectFile(BaseModel):
@@ -66,6 +66,7 @@ class Topology(BaseModel):
show_interface_labels: Optional[bool] = Field(None, description="Show interface labels on the drawing area")
supplier: Optional[Supplier] = Field(None, description="Supplier of the project")
variables: Optional[List[Variable]] = Field(None, description="Variables required to run the project")
created_by: Optional[str] = Field(None, description="Username of the user who created the project")
def main():