Skip to content
Snippets Groups Projects
Commit 076d77f7 authored by Jorge Sasiain's avatar Jorge Sasiain
Browse files

Add endpoint to return list of physical interfaces per router

parent e5436ef8
Branches
Tags
No related merge requests found
...@@ -29,8 +29,8 @@ def load_new_router_interfaces(fqdn: str): ...@@ -29,8 +29,8 @@ def load_new_router_interfaces(fqdn: str):
_inverted_aggregate_map[pn] = lag_name _inverted_aggregate_map[pn] = lag_name
def _interface_availability(ifc_name): def _interface_availability(ifc_name):
if physical[ifc_name]['oper']: #if physical[ifc_name]['oper']:
return model.AvalabilityStates.USED.name #return model.AvalabilityStates.USED.name
if ifc_name in _inverted_aggregate_map: if ifc_name in _inverted_aggregate_map:
return model.AvalabilityStates.USED.name return model.AvalabilityStates.USED.name
if ifc_name in logical: if ifc_name in logical:
......
...@@ -26,6 +26,11 @@ class InterfacesSummary(pydantic.BaseModel): ...@@ -26,6 +26,11 @@ class InterfacesSummary(pydantic.BaseModel):
physical: InterfaceCounts physical: InterfaceCounts
class AvailablePhysicalInterfaces(pydantic.BaseModel):
fqdn: str
names: List[str]
class NextLAG(pydantic.BaseModel): class NextLAG(pydantic.BaseModel):
fqdn: str fqdn: str
name: str name: str
...@@ -65,7 +70,7 @@ async def load_new_router_interfaces(fqdn: str) -> InterfacesSummary: ...@@ -65,7 +70,7 @@ async def load_new_router_interfaces(fqdn: str) -> InterfacesSummary:
router = session.query(model.Router).filter_by(fqdn=fqdn).one() router = session.query(model.Router).filter_by(fqdn=fqdn).one()
num_lags = len(router.lags) num_lags = len(router.lags)
num_physical = len(router.physical) 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 { return {
'fqdn': fqdn, 'fqdn': fqdn,
...@@ -95,6 +100,30 @@ async def get_known_routers() -> ListOfRouters: ...@@ -95,6 +100,30 @@ async def get_known_routers() -> ListOfRouters:
return {'routers': [{'fqdn': r[0]} for r in rows]} 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}') @router.post('/next-lag/{fqdn}')
async def reserve_next_lag(fqdn: str) -> NextLAG: async def reserve_next_lag(fqdn: str) -> NextLAG:
""" """
...@@ -137,7 +166,7 @@ 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( async def reserve_physical_bundle_member(
fqdn: str, lag_name: str) -> NextPhysicalInterface: 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 TODO: _find_available_physical is a placeholder for
whatever logic turns out to be right (e.g. speeds, etc) whatever logic turns out to be right (e.g. speeds, etc)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment