From 076d77f790b305695ba29b404bf8454b8a5b48ab Mon Sep 17 00:00:00 2001 From: Jorge Sasiain <jorge@jorge.dev.gap.geant.org> Date: Tue, 4 Jul 2023 11:26:49 +0000 Subject: [PATCH] Add endpoint to return list of physical interfaces per router --- resource_management/router_interfaces.py | 4 +-- resource_management/routes/interfaces.py | 33 ++++++++++++++++++++++-- 2 files changed, 33 insertions(+), 4 deletions(-) diff --git a/resource_management/router_interfaces.py b/resource_management/router_interfaces.py index 5ef8d6c..c92d22f 100644 --- a/resource_management/router_interfaces.py +++ b/resource_management/router_interfaces.py @@ -29,8 +29,8 @@ def load_new_router_interfaces(fqdn: str): _inverted_aggregate_map[pn] = lag_name def _interface_availability(ifc_name): - if physical[ifc_name]['oper']: - return model.AvalabilityStates.USED.name + #if physical[ifc_name]['oper']: + #return model.AvalabilityStates.USED.name if ifc_name in _inverted_aggregate_map: return model.AvalabilityStates.USED.name if ifc_name in logical: diff --git a/resource_management/routes/interfaces.py b/resource_management/routes/interfaces.py index 019b8be..4dffe80 100644 --- a/resource_management/routes/interfaces.py +++ b/resource_management/routes/interfaces.py @@ -26,6 +26,11 @@ class InterfacesSummary(pydantic.BaseModel): physical: InterfaceCounts +class AvailablePhysicalInterfaces(pydantic.BaseModel): + fqdn: str + names: List[str] + + class NextLAG(pydantic.BaseModel): fqdn: str name: str @@ -65,7 +70,7 @@ async def load_new_router_interfaces(fqdn: str) -> InterfacesSummary: router = session.query(model.Router).filter_by(fqdn=fqdn).one() num_lags = len(router.lags) num_physical = len(router.physical) - num_available_physical = sum(1 for p in router.physical if p.lag) + num_available_physical = sum(1 for ifc in router.physical if ifc.availability == model.AvalabilityStates.AVAILABLE.name) return { 'fqdn': fqdn, @@ -95,6 +100,30 @@ async def get_known_routers() -> ListOfRouters: return {'routers': [{'fqdn': r[0]} for r in rows]} +@router.get('/physical-interfaces') +async def get_physical_interfaces(fqdn: str) -> AvailablePhysicalInterfaces: + + params = config.load() + db.init_db_model(params['db']) + + with db.session_scope() as session: + router = session.query(model.Router).filter_by(fqdn=fqdn).one() + + def _find_available_physical(): + ifaces = [iface.name for iface in router.physical if iface.availability == model.AvalabilityStates.AVAILABLE.name] + if ifaces: + return ifaces + + raise HTTPException( + status_code=404, + detail=f'no available physical ports in "{fqdn}"') + + return { + 'fqdn': fqdn, + 'names': _find_available_physical() + } + + @router.post('/next-lag/{fqdn}') async def reserve_next_lag(fqdn: str) -> NextLAG: """ @@ -137,7 +166,7 @@ async def reserve_next_lag(fqdn: str) -> NextLAG: async def reserve_physical_bundle_member( fqdn: str, lag_name: str) -> NextPhysicalInterface: """ - compute the next available lag name for the given router + compute the next available physical interface name for the given router TODO: _find_available_physical is a placeholder for whatever logic turns out to be right (e.g. speeds, etc) -- GitLab