Fix updating packet filters

This commit is contained in:
grossmj 2026-02-21 21:42:22 +08:00
parent 60abbade27
commit 5e3ca29c58
No known key found for this signature in database
GPG Key ID: 1E7DD6DBB53FF3D7
17 changed files with 72 additions and 37 deletions

View File

@ -176,6 +176,7 @@ async def update_cloud_nio(
""" """
nio = node.get_nio(port_number) nio = node.get_nio(port_number)
nio.filters.clear()
if nio_data.filters: if nio_data.filters:
nio.filters = nio_data.filters nio.filters = nio_data.filters
await node.update_nio(port_number, nio) await node.update_nio(port_number, nio)

View File

@ -289,6 +289,7 @@ async def update_docker_node_nio(
""" """
nio = node.get_nio(adapter_number) nio = node.get_nio(adapter_number)
nio.filters.clear()
if nio_data.filters: if nio_data.filters:
nio.filters = nio_data.filters nio.filters = nio_data.filters
await node.adapter_update_nio_binding(adapter_number, nio) await node.adapter_update_nio_binding(adapter_number, nio)

View File

@ -232,6 +232,7 @@ async def update_nio(
""" """
nio = node.get_nio(adapter_number, port_number) nio = node.get_nio(adapter_number, port_number)
nio.filters.clear()
if nio_data.filters: if nio_data.filters:
nio.filters = nio_data.filters nio.filters = nio_data.filters
await node.slot_update_nio_binding(adapter_number, port_number, nio) await node.slot_update_nio_binding(adapter_number, port_number, nio)

View File

@ -250,6 +250,7 @@ async def update_iou_node_nio(
""" """
nio = node.get_nio(adapter_number, port_number) nio = node.get_nio(adapter_number, port_number)
nio.filters.clear()
if nio_data.filters: if nio_data.filters:
nio.filters = nio_data.filters nio.filters = nio_data.filters
await node.adapter_update_nio_binding(adapter_number, port_number, nio) await node.adapter_update_nio_binding(adapter_number, port_number, nio)

View File

@ -171,6 +171,7 @@ async def update_nat_node_nio(
""" """
nio = node.get_nio(port_number) nio = node.get_nio(port_number)
nio.filters.clear()
if nio_data.filters: if nio_data.filters:
nio.filters = nio_data.filters nio.filters = nio_data.filters
await node.update_nio(port_number, nio) await node.update_nio(port_number, nio)

View File

@ -304,10 +304,10 @@ async def update_qemu_node_nio(
""" """
nio = node.get_nio(adapter_number) nio = node.get_nio(adapter_number)
nio.filters.clear()
if nio_data.filters: if nio_data.filters:
nio.filters = 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) await node.adapter_update_nio_binding(adapter_number, nio)
return nio.asdict() return nio.asdict()

View File

@ -268,10 +268,10 @@ async def update_virtualbox_node_nio(
""" """
nio = node.get_nio(adapter_number) nio = node.get_nio(adapter_number)
nio.filters.clear()
if nio_data.filters: if nio_data.filters:
nio.filters = 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) await node.adapter_update_nio_binding(adapter_number, nio)
return nio.asdict() return nio.asdict()

View File

@ -233,6 +233,7 @@ async def update_vmware_node_nio(
""" """
nio = node.get_nio(adapter_number) nio = node.get_nio(adapter_number)
nio.filters.clear()
if nio_data.filters: if nio_data.filters:
nio.filters = nio_data.filters nio.filters = nio_data.filters
await node.adapter_update_nio_binding(adapter_number, nio) await node.adapter_update_nio_binding(adapter_number, nio)

View File

@ -235,6 +235,7 @@ async def update_vpcs_node_nio(
""" """
nio = node.get_nio(port_number) nio = node.get_nio(port_number)
nio.filters.clear()
if nio_data.filters: if nio_data.filters:
nio.filters = nio_data.filters nio.filters = nio_data.filters
await node.port_update_nio_binding(port_number, nio) await node.port_update_nio_binding(port_number, nio)

View File

@ -78,5 +78,7 @@ class NIOUDP(NIO):
"type": "nio_udp", "type": "nio_udp",
"lport": self._lport, "lport": self._lport,
"rport": self._rport, "rport": self._rport,
"rhost": self._rhost "rhost": self._rhost,
"suspend": self._suspended,
"filters": self._filters
} }

View File

@ -34,7 +34,7 @@ class UDPNIO(BaseModel):
lport: int = Field(..., gt=0, le=65535, description="Local port") lport: int = Field(..., gt=0, le=65535, description="Local port")
rhost: str = Field(..., description="Remote host") rhost: str = Field(..., description="Remote host")
rport: int = Field(..., gt=0, le=65535, description="Remote port") 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") filters: Optional[dict] = Field(None, description="Packet filters")

View File

@ -97,19 +97,25 @@ class TestCloudNodesRoutes:
vm: dict vm: dict
) -> None: ) -> None:
params = {"type": "nio_udp", params = {
"lport": 4242, "type": "nio_udp",
"rport": 4343, "lport": 4242,
"rhost": "127.0.0.1"} "rport": 4343,
"rhost": "127.0.0.1",
"filters": {"packet_loss": 10}
}
url = app.url_path_for("compute:create_cloud_nio", url = app.url_path_for(
project_id=vm["project_id"], "compute:create_cloud_nio",
node_id=vm["node_id"], project_id=vm["project_id"],
adapter_number="0", node_id=vm["node_id"],
port_number="0") adapter_number="0",
await compute_client.post(url, json=params) port_number="0")
response = await compute_client.post(url, json=params)
assert response.status_code == status.HTTP_201_CREATED
assert response.json()["filters"] == {"packet_loss": 10}
params["filters"].clear()
params["filters"] = {}
url = app.url_path_for("compute:create_cloud_nio", url = app.url_path_for("compute:create_cloud_nio",
project_id=vm["project_id"], project_id=vm["project_id"],
node_id=vm["node_id"], node_id=vm["node_id"],
@ -118,6 +124,7 @@ class TestCloudNodesRoutes:
response = await compute_client.put(url, json=params) response = await compute_client.put(url, json=params)
assert response.status_code == status.HTTP_201_CREATED assert response.status_code == status.HTTP_201_CREATED
assert response.json()["type"] == "nio_udp" assert response.json()["type"] == "nio_udp"
assert response.json()["filters"] == {}
async def test_cloud_delete_nio( async def test_cloud_delete_nio(

View File

@ -218,7 +218,8 @@ class TestDockerNodesRoutes:
"type": "nio_udp", "type": "nio_udp",
"lport": 4242, "lport": 4242,
"rport": 4343, "rport": 4343,
"rhost": "127.0.0.1" "rhost": "127.0.0.1",
"filters": {"packet_loss": 10}
} }
url = app.url_path_for("compute:create_docker_node_nio", url = app.url_path_for("compute:create_docker_node_nio",
@ -228,6 +229,8 @@ class TestDockerNodesRoutes:
port_number="0") port_number="0")
response = await compute_client.post(url, json=params) response = await compute_client.post(url, json=params)
assert response.status_code == status.HTTP_201_CREATED assert response.status_code == status.HTTP_201_CREATED
assert response.json()["filters"] == {"packet_loss": 10}
params["filters"] = {}
url = app.url_path_for("compute:update_docker_node_nio", url = app.url_path_for("compute:update_docker_node_nio",
project_id=vm["project_id"], project_id=vm["project_id"],
@ -237,7 +240,8 @@ class TestDockerNodesRoutes:
with asyncio_patch("gns3server.compute.docker.docker_vm.DockerVM.adapter_update_nio_binding"): with asyncio_patch("gns3server.compute.docker.docker_vm.DockerVM.adapter_update_nio_binding"):
response = await compute_client.put(url, json=params) response = await compute_client.put(url, json=params)
assert response.status_code == status.HTTP_201_CREATED assert response.status_code == status.HTTP_201_CREATED
assert response.json()["type"] == "nio_udp"
assert response.json()["filters"] == {}
async def test_docker_delete_nio(self, app: FastAPI, compute_client: AsyncClient, vm: dict) -> None: async def test_docker_delete_nio(self, app: FastAPI, compute_client: AsyncClient, vm: dict) -> None:

View File

@ -297,10 +297,13 @@ class TestIOUNodesRoutes:
async def test_iou_nio_update_udp(self, app: FastAPI, compute_client: AsyncClient, vm: dict) -> None: async def test_iou_nio_update_udp(self, app: FastAPI, compute_client: AsyncClient, vm: dict) -> None:
params = {"type": "nio_udp", params = {
"lport": 4242, "type": "nio_udp",
"rport": 4343, "lport": 4242,
"rhost": "127.0.0.1"} "rport": 4343,
"rhost": "127.0.0.1",
"filters": {"packet_loss": 10}
}
url = app.url_path_for("compute:create_iou_node_nio", url = app.url_path_for("compute:create_iou_node_nio",
project_id=vm["project_id"], project_id=vm["project_id"],
@ -308,8 +311,10 @@ class TestIOUNodesRoutes:
adapter_number="1", adapter_number="1",
port_number="0") port_number="0")
await compute_client.post(url, json=params) response = await compute_client.post(url, json=params)
params["filters"] = {} assert response.status_code == status.HTTP_201_CREATED
assert response.json()["filters"] == {"packet_loss": 10}
params["filters"].clear()
url = app.url_path_for("compute:update_iou_node_nio", url = app.url_path_for("compute:update_iou_node_nio",
project_id=vm["project_id"], project_id=vm["project_id"],
@ -319,6 +324,7 @@ class TestIOUNodesRoutes:
response = await compute_client.put(url, json=params) response = await compute_client.put(url, json=params)
assert response.status_code == status.HTTP_201_CREATED assert response.status_code == status.HTTP_201_CREATED
assert response.json()["type"] == "nio_udp" assert response.json()["type"] == "nio_udp"
assert response.json()["filters"] == {}
async def test_iou_nio_create_ethernet( async def test_iou_nio_create_ethernet(

View File

@ -104,7 +104,8 @@ class TestNATNodesRoutes:
"type": "nio_udp", "type": "nio_udp",
"lport": 4242, "lport": 4242,
"rport": 4343, "rport": 4343,
"rhost": "127.0.0.1" "rhost": "127.0.0.1",
"filters": {"packet_loss": 10}
} }
url = app.url_path_for("compute:create_nat_node_nio", url = app.url_path_for("compute:create_nat_node_nio",
@ -113,8 +114,10 @@ class TestNATNodesRoutes:
adapter_number="0", adapter_number="0",
port_number="0") port_number="0")
await compute_client.post(url, json=params) response = await compute_client.post(url, json=params)
params["filters"] = {} assert response.status_code == status.HTTP_201_CREATED
assert response.json()["filters"] == {"packet_loss": 10}
params["filters"].clear()
url = app.url_path_for("compute:update_nat_node_nio", url = app.url_path_for("compute:update_nat_node_nio",
project_id=vm["project_id"], project_id=vm["project_id"],
@ -124,7 +127,7 @@ class TestNATNodesRoutes:
response = await compute_client.put(url, json=params) response = await compute_client.put(url, json=params)
assert response.status_code == status.HTTP_201_CREATED assert response.status_code == status.HTTP_201_CREATED
assert response.json()["type"] == "nio_udp" assert response.json()["type"] == "nio_udp"
assert response.json()["filters"] == {}
async def test_nat_delete_nio(self, app: FastAPI, compute_client: AsyncClient, vm: dict) -> None: async def test_nat_delete_nio(self, app: FastAPI, compute_client: AsyncClient, vm: dict) -> None:

View File

@ -344,7 +344,8 @@ class TestQemuNodesRoutes:
"type": "nio_udp", "type": "nio_udp",
"lport": 4242, "lport": 4242,
"rport": 4343, "rport": 4343,
"rhost": "127.0.0.1" "rhost": "127.0.0.1",
"filters": {"packet_loss": 10}
} }
await compute_client.put( await compute_client.put(
@ -360,8 +361,10 @@ class TestQemuNodesRoutes:
port_number="0" port_number="0"
) )
await compute_client.post(url, json=params) response = await compute_client.post(url, json=params)
params["filters"] = {} assert response.status_code == status.HTTP_201_CREATED
assert response.json()["filters"] == {"packet_loss": 10}
params["filters"].clear()
url = app.url_path_for( url = app.url_path_for(
"compute:update_qemu_node_nio", "compute:update_qemu_node_nio",
@ -373,6 +376,7 @@ class TestQemuNodesRoutes:
response = await compute_client.put(url, json=params) response = await compute_client.put(url, json=params)
assert response.status_code == status.HTTP_201_CREATED assert response.status_code == status.HTTP_201_CREATED
assert response.json()["type"] == "nio_udp" assert response.json()["type"] == "nio_udp"
assert response.json()["filters"] == {}
async def test_qemu_delete_nio(self, app: FastAPI, compute_client: AsyncClient, qemu_vm: dict) -> None: async def test_qemu_delete_nio(self, app: FastAPI, compute_client: AsyncClient, qemu_vm: dict) -> None:

View File

@ -128,7 +128,8 @@ class TestVPCSNodesRoutes:
"type": "nio_udp", "type": "nio_udp",
"lport": 4242, "lport": 4242,
"rport": 4343, "rport": 4343,
"rhost": "127.0.0.1" "rhost": "127.0.0.1",
"filters": {"packet_loss": 10}
} }
url = app.url_path_for("compute:create_vpcs_node_nio", url = app.url_path_for("compute:create_vpcs_node_nio",
@ -140,8 +141,9 @@ class TestVPCSNodesRoutes:
with asyncio_patch("gns3server.compute.vpcs.vpcs_vm.VPCSVM.add_ubridge_udp_connection"): with asyncio_patch("gns3server.compute.vpcs.vpcs_vm.VPCSVM.add_ubridge_udp_connection"):
response = await compute_client.post(url, json=params) response = await compute_client.post(url, json=params)
assert response.status_code == status.HTTP_201_CREATED assert response.status_code == status.HTTP_201_CREATED
assert response.json()["filters"] == {"packet_loss": 10}
params["filters"].clear()
params["filters"] = {}
url = app.url_path_for("compute:update_vpcs_node_nio", url = app.url_path_for("compute:update_vpcs_node_nio",
project_id=vm["project_id"], project_id=vm["project_id"],
node_id=vm["node_id"], node_id=vm["node_id"],
@ -150,7 +152,7 @@ class TestVPCSNodesRoutes:
response = await compute_client.put(url, json=params) response = await compute_client.put(url, json=params)
assert response.status_code == status.HTTP_201_CREATED assert response.status_code == status.HTTP_201_CREATED
assert response.json()["type"] == "nio_udp" assert response.json()["type"] == "nio_udp"
assert response.json()["filters"] == {}
async def test_vpcs_delete_nio(self, app: FastAPI, compute_client: AsyncClient, vm: dict) -> None: async def test_vpcs_delete_nio(self, app: FastAPI, compute_client: AsyncClient, vm: dict) -> None: