Merge branch '3.1' into 3.1

This commit is contained in:
Jeremy Grossmann authored and GitHub committed 2026-10-19 18:11:29 +02:00
commit 68b5e89bfa
51 files changed
+3155 -183

No files matched your search

@@ -30,6 +30,7 @@ from gns3server.compute.ubridge.tc_probe import (
probe_iol_tap_support,
probe_tap_support,
probe_tc_capabilities,
probe_vxlan_support,
)
from gns3server.compute.vpcs.vpcs_probe import probe_vpcs_tap
from gns3server.utils.path import get_default_project_directory
@@ -75,6 +76,11 @@ async def get_capabilities(request: Request) -> dict:
# kernel link. None = unknown (probe failed or binary missing).
vpcs_tap = await probe_vpcs_tap()
# VXLAN device creation (the vxlan module): the tunnel a cross-compute
# kernel link rides. None = unknown (probe failed, uBridge too old, or
# the kernel refuses vxlan devices here).
ubridge_vxlan = await probe_vxlan_support()
# record the controller hostname or IP address
if request.client:
request.app.state.controller_host = request.client.host
@@ -91,4 +97,5 @@ async def get_capabilities(request: Request) -> dict:
"ubridge_iol_tap": ubridge_iol_tap,
"ubridge_bridge_tap": ubridge_bridge_tap,
"vpcs_tap": vpcs_tap,
"ubridge_vxlan": ubridge_vxlan,
}
+27 -7
View File
@@ -35,6 +35,7 @@ from fastapi.encoders import jsonable_encoder
from fastapi.responses import FileResponse
from gns3server import schemas
from gns3server.compute.error import NodeError
from gns3server.compute.project import Project
from gns3server.compute.project_manager import ProjectManager
from gns3server.utils.path import is_safe_path
@@ -271,16 +272,35 @@ async def create_batch_nios(
# count (standard == 1, Dynamips == 2) and await the async variant.
sig = inspect.signature(node.manager.create_nio)
dynamips_style = len(sig.parameters) >= 2
failed = []
for entry in entries:
nio_settings = jsonable_encoder(entry.nio, exclude_unset=True)
if dynamips_style:
nio = await node.manager.create_nio(node, nio_settings)
else:
nio = node.manager.create_nio(nio_settings)
await _add_nio_binding(node, entry.adapter_number, entry.port_number, nio)
try:
if dynamips_style:
nio = await node.manager.create_nio(node, nio_settings)
else:
nio = node.manager.create_nio(nio_settings)
await _add_nio_binding(node, entry.adapter_number, entry.port_number, nio)
except NodeError:
# A VXLAN entry that cannot be wired (its VNI already
# registered on the host's shared socket, no route to the
# peer) must not fail the whole project open: report it so
# the controller can degrade that link to the uBridge relay.
# Every other NIO type keeps the fail-the-batch semantics.
if not nio_settings.get("vxlan"):
raise
failed.append(
{
"node_id": entry.node_id,
"adapter_number": entry.adapter_number,
"port_number": entry.port_number,
}
)
return failed
await asyncio.gather(*[_create_one_node(nid, ents) for nid, ents in per_node.items()])
return {"added": len(batch.nios)}
results = await asyncio.gather(*[_create_one_node(nid, ents) for nid, ents in per_node.items()])
failed = [item for node_failed in results for item in node_failed]
return {"added": len(batch.nios) - len(failed), "failed": failed}
@router.put(
@@ -135,6 +135,10 @@ async def update_qemu_node(node_data: schemas.QemuUpdate, node: QemuVM = Depends
"""
data = jsonable_encoder(node_data, exclude_unset=True)
# Reject interface changes before applying any other property or changing live media.
for name in ("cdrom_interface", "cdrom2_interface"):
if name in data:
node.validate_cdrom_interface(name, data[name])
# update the console first to avoid issue if updating console type
node.console = data.pop("console", node.console)
for name, value in data.items():