diff --git a/resource_management/router_interfaces.py b/resource_management/router_interfaces.py index 5ef8d6c16ca43c67a92d721f91faaa55bef70347..c92d22f10310f59e2e9fbbb6dafe72201a6d3d7e 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 019b8be12bc9296b3dbd5914cd2f7dfa8ebbded6..4dffe80563414be3e3b0f41d77166d28e9eb13ce 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)