mirror of
https://github.com/GNS3/gns3-server.git
synced 2026-11-03 05:51:15 +02:00
feat(ubridge): probe iol_bridge's TAP-port support
Whether an IOU port can terminate on a persistent TAP (iol_bridge add_nio_tap) is a capability of its own: the tap module and that command land independently, so a build may have one without the other. Probed on a scratch IOL bridge with a scratch TAP — one add/delete cycle, no iol_bridge start needed (attaching a NIO works on a stopped bridge) — cached by binary identity, with the scratch bridge id above the per-node id space the fabric locks (513..1024) so a probe cannot collide with a running node. Any failure, including an old build's "Unknown command", means unknown: IOU stays on the relay datapath. Reported through /capabilities as ubridge_iol_tap, next to ubridge_tap.
This commit is contained in:
7 files changed
+178
-4
No files matched your search
@@ -29,7 +29,7 @@ pytestmark = pytest.mark.asyncio
|
||||
|
||||
|
||||
async def _no_tap_probe():
|
||||
"""The tap probe spawns uBridge — stub it out for payload assertions."""
|
||||
"""The probes spawn uBridge — stub them out for payload assertions."""
|
||||
|
||||
return None
|
||||
|
||||
@@ -42,6 +42,7 @@ class TestCapabilitiesRoutes:
|
||||
|
||||
monkeypatch.setattr("gns3server.api.routes.compute.capabilities.probe_tc_capabilities", no_probe)
|
||||
monkeypatch.setattr("gns3server.api.routes.compute.capabilities.probe_tap_support", _no_tap_probe)
|
||||
monkeypatch.setattr("gns3server.api.routes.compute.capabilities.probe_iol_tap_support", _no_tap_probe)
|
||||
response = await compute_client.get(app.url_path_for("compute:get_capabilities"))
|
||||
assert response.status_code == status.HTTP_200_OK
|
||||
assert response.json() == {
|
||||
@@ -67,6 +68,7 @@ class TestCapabilitiesRoutes:
|
||||
"disk_size": psutil.disk_usage(get_default_project_directory()).total,
|
||||
"ubridge_tc": None,
|
||||
"ubridge_tap": None,
|
||||
"ubridge_iol_tap": None,
|
||||
}
|
||||
|
||||
async def test_get_on_gns3vm(self, app: FastAPI, compute_client: AsyncClient, on_gns3vm, monkeypatch) -> None:
|
||||
@@ -76,6 +78,7 @@ class TestCapabilitiesRoutes:
|
||||
|
||||
monkeypatch.setattr("gns3server.api.routes.compute.capabilities.probe_tc_capabilities", no_probe)
|
||||
monkeypatch.setattr("gns3server.api.routes.compute.capabilities.probe_tap_support", _no_tap_probe)
|
||||
monkeypatch.setattr("gns3server.api.routes.compute.capabilities.probe_iol_tap_support", _no_tap_probe)
|
||||
response = await compute_client.get(app.url_path_for("compute:get_capabilities"))
|
||||
assert response.status_code == status.HTTP_200_OK
|
||||
assert response.json() == {
|
||||
@@ -101,6 +104,7 @@ class TestCapabilitiesRoutes:
|
||||
"disk_size": psutil.disk_usage(get_default_project_directory()).total,
|
||||
"ubridge_tc": None,
|
||||
"ubridge_tap": None,
|
||||
"ubridge_iol_tap": None,
|
||||
}
|
||||
|
||||
async def test_get_reports_ubridge_tc(self, app: FastAPI, compute_client: AsyncClient, monkeypatch) -> None:
|
||||
@@ -110,6 +114,7 @@ class TestCapabilitiesRoutes:
|
||||
|
||||
monkeypatch.setattr("gns3server.api.routes.compute.capabilities.probe_tc_capabilities", fake_probe)
|
||||
monkeypatch.setattr("gns3server.api.routes.compute.capabilities.probe_tap_support", _no_tap_probe)
|
||||
monkeypatch.setattr("gns3server.api.routes.compute.capabilities.probe_iol_tap_support", _no_tap_probe)
|
||||
response = await compute_client.get(app.url_path_for("compute:get_capabilities"))
|
||||
assert response.status_code == status.HTTP_200_OK
|
||||
assert response.json()["ubridge_tc"] == {
|
||||
@@ -129,6 +134,22 @@ class TestCapabilitiesRoutes:
|
||||
return True
|
||||
|
||||
monkeypatch.setattr("gns3server.api.routes.compute.capabilities.probe_tap_support", fake_tap_probe)
|
||||
monkeypatch.setattr("gns3server.api.routes.compute.capabilities.probe_iol_tap_support", _no_tap_probe)
|
||||
response = await compute_client.get(app.url_path_for("compute:get_capabilities"))
|
||||
assert response.status_code == status.HTTP_200_OK
|
||||
assert response.json()["ubridge_tap"] is True
|
||||
|
||||
async def test_get_reports_ubridge_iol_tap(self, app: FastAPI, compute_client: AsyncClient, monkeypatch) -> None:
|
||||
"""
|
||||
The IOL-port TAP capability is what makes an IOU node kernel-eligible,
|
||||
so it travels with the other compute capabilities.
|
||||
"""
|
||||
|
||||
async def fake_iol_tap_probe():
|
||||
return True
|
||||
|
||||
monkeypatch.setattr("gns3server.api.routes.compute.capabilities.probe_iol_tap_support", fake_iol_tap_probe)
|
||||
monkeypatch.setattr("gns3server.api.routes.compute.capabilities.probe_tap_support", _no_tap_probe)
|
||||
response = await compute_client.get(app.url_path_for("compute:get_capabilities"))
|
||||
assert response.status_code == status.HTTP_200_OK
|
||||
assert response.json()["ubridge_iol_tap"] is True
|
||||
Reference in new issue
Block a user