Fix interface information API endpoint for Cloud/NAT devices

This commit is contained in:
grossmj committed 2025-04-16 15:26:56 +07:00
1 parent f525916195
commit 5019167098
4 files changed
+40 -44

No files matched your search

+14 -18
View File
@@ -24,7 +24,7 @@ import aiohttp
from fastapi import APIRouter, Depends, Request, status
from fastapi.responses import StreamingResponse
from fastapi.encoders import jsonable_encoder
from typing import List
from typing import List, Union
from uuid import UUID
from gns3server.controller import Controller
@@ -289,15 +289,16 @@ async def stream_pcap(request: Request, link: Link = Depends(dep_link)) -> Strea
@router.get(
"/{link_id}/iface",
response_model=dict[str, schemas.UdpPort | schemas.EthernetPort],
response_model=Union[schemas.UDPPortInfo, schemas.EthernetPortInfo],
dependencies=[Depends(has_privilege("Link.Audit"))]
)
async def get_iface(link: Link = Depends(dep_link)) -> dict[str, schemas.UdpPort | schemas.EthernetPort]:
async def get_iface(link: Link = Depends(dep_link)) -> Union[schemas.UDPPortInfo, schemas.EthernetPortInfo]:
"""
Return iface info for links to Cloud or NAT devices.
Required privilege: Link.Audit
"""
ifaces_info = {}
for node_data in link._nodes:
node = node_data["node"]
@@ -305,17 +306,12 @@ async def get_iface(link: Link = Depends(dep_link)) -> dict[str, schemas.UdpPort
continue
port_number = node_data["port_number"]
compute = node.compute
project_id = link.project.id
response = await compute.get(
f"/projects/{project_id}/{node.node_type}/nodes/{node.id}"
)
node_info = response.json
if "ports_mapping" not in node_info:
response = await compute.get(f"/projects/{project_id}/{node.node_type}/nodes/{node.id}")
if "ports_mapping" not in response.json:
continue
ports_mapping = node_info["ports_mapping"]
ports_mapping = response.json["ports_mapping"]
for port in ports_mapping:
port_num = port.get("port_number")
@@ -323,20 +319,20 @@ async def get_iface(link: Link = Depends(dep_link)) -> dict[str, schemas.UdpPort
if port_num and int(port_num) == int(port_number):
port_type = port.get("type", "")
if "udp" in port_type.lower():
ifaces_info[node.id] = {
ifaces_info = {
"node_id": node.id,
"type": f"{port_type}",
"rhost": port["rhost"],
"lport": port["lport"],
"rport": port["rport"],
"rhost": port["rhost"],
"rport": port["rport"]
}
else:
ifaces_info[node.id] = {
ifaces_info = {
"node_id": node.id,
"type": f"{port_type}",
"interface": port["interface"],
}
if not ifaces_info:
raise ControllerError(
"Link not connected to Cloud/NAT"
)
raise ControllerError("Link not connected to Cloud/NAT")
return ifaces_info