Skip to content

Commit 83e471c

Browse files
committed
fix(network): add request param filter function (#60)
1 parent 11cc9d6 commit 83e471c

File tree

2 files changed

+53
-11
lines changed

2 files changed

+53
-11
lines changed

src/openstack_mcp_server/tools/network_tools.py

Lines changed: 52 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -75,12 +75,21 @@ def get_networks(
7575
if shared_only:
7676
filters["shared"] = True
7777

78-
networks = conn.network.networks(**filters)
78+
server_filters = self._sanitize_server_filters(filters)
79+
networks = conn.network.networks(**server_filters)
7980

80-
return [
81+
results = [
8182
self._convert_to_network_model(network) for network in networks
8283
]
8384

85+
if status_filter:
86+
status_upper = status_filter.upper()
87+
results = [
88+
n for n in results if (n.status or "").upper() == status_upper
89+
]
90+
91+
return results
92+
8493
def create_network(
8594
self,
8695
name: str,
@@ -454,8 +463,17 @@ def get_ports(
454463
filters["device_id"] = device_id
455464
if network_id:
456465
filters["network_id"] = network_id
457-
ports = conn.network.ports(**filters)
458-
return [self._convert_to_port_model(port) for port in ports]
466+
467+
server_filters = self._sanitize_server_filters(filters)
468+
ports = conn.network.ports(**server_filters)
469+
470+
results = [self._convert_to_port_model(port) for port in ports]
471+
if status_filter:
472+
status_upper = status_filter.upper()
473+
results = [
474+
p for p in results if (p.status or "").upper() == status_upper
475+
]
476+
return results
459477

460478
def get_port_allowed_address_pairs(self, port_id: str) -> list[dict]:
461479
"""
@@ -896,8 +914,19 @@ def get_routers(
896914
filters["project_id"] = project_id
897915
if is_admin_state_up is not None:
898916
filters["admin_state_up"] = is_admin_state_up
899-
routers = conn.network.routers(**filters)
900-
return [self._convert_to_router_model(r) for r in routers]
917+
# Do not pass unsupported filters (e.g., status) to the server.
918+
server_filters = self._sanitize_server_filters(filters)
919+
routers = conn.network.routers(**server_filters)
920+
921+
router_models = [self._convert_to_router_model(r) for r in routers]
922+
if status_filter:
923+
status_upper = status_filter.upper()
924+
router_models = [
925+
r
926+
for r in router_models
927+
if (r.status or "").upper() == status_upper
928+
]
929+
return router_models
901930

902931
def create_router(
903932
self,
@@ -1047,3 +1076,20 @@ def _convert_to_router_model(self, openstack_router) -> Router:
10471076
is_ha=getattr(openstack_router, "is_ha", None),
10481077
routes=getattr(openstack_router, "routes", None),
10491078
)
1079+
1080+
def _sanitize_server_filters(self, filters: dict) -> dict:
1081+
"""
1082+
Remove unsupported query params before sending to Neutron.
1083+
1084+
Currently removed keys:
1085+
- "status": not universally supported for server-side filtering
1086+
1087+
:param filters: original filter dict
1088+
:return: cleaned filter dict safe for server query
1089+
"""
1090+
if not filters:
1091+
return {}
1092+
attrs = dict(filters)
1093+
# Remove client-only or unsupported filters
1094+
attrs.pop("status", None)
1095+
return attrs

tests/tools/test_network_tools.py

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -155,9 +155,7 @@ def test_get_networks_with_status_filter(
155155
assert result[0].id == "net-active"
156156
assert result[0].status == "ACTIVE"
157157

158-
mock_conn.network.networks.assert_called_once_with(
159-
status="ACTIVE",
160-
)
158+
mock_conn.network.networks.assert_called_once_with()
161159

162160
def test_get_networks_shared_only(
163161
self,
@@ -519,7 +517,6 @@ def test_get_ports_with_filters(self, mock_openstack_connect_network):
519517
]
520518

521519
mock_conn.network.ports.assert_called_once_with(
522-
status="ACTIVE",
523520
device_id="device-1",
524521
network_id="net-1",
525522
)
@@ -1350,7 +1347,6 @@ def test_get_routers_with_filters(self, mock_openstack_connect_network):
13501347
]
13511348

13521349
mock_conn.network.routers.assert_called_once_with(
1353-
status="ACTIVE",
13541350
project_id="proj-1",
13551351
admin_state_up=True,
13561352
)

0 commit comments

Comments
 (0)