Problem
When list_towers() is called with both runway_name and a networking filter (ingress_mode or egress_mode), the two filters can be satisfied by different runways on the same tower.
# Intent: find towers where the "prod" runway has internet egress
towers = cwsandbox.list_towers(runway_name="prod", egress_mode="internet")
What actually happens:
- Server returns towers that have a runway named "prod"
- Client fetches ALL runways (unfiltered), aggregates networking modes per tower
- Client checks if the tower has internet egress on ANY runway
If a tower has runway "prod" (no internet egress) and runway "dev" (internet egress), it passes both filters even though "prod" doesn't support internet egress.
Every other filter combination on list_towers uses AND semantics against the same entity. The networking filters break this expectation by checking across all runways on the tower rather than scoping to the runway specified by runway_name.
Expected behavior
When runway_name is specified alongside ingress_mode/egress_mode, the networking check should scope to that runway rather than aggregating across all runways on the tower.
Problem
When
list_towers()is called with bothrunway_nameand a networking filter (ingress_modeoregress_mode), the two filters can be satisfied by different runways on the same tower.What actually happens:
If a tower has runway "prod" (no internet egress) and runway "dev" (internet egress), it passes both filters even though "prod" doesn't support internet egress.
Every other filter combination on
list_towersuses AND semantics against the same entity. The networking filters break this expectation by checking across all runways on the tower rather than scoping to the runway specified byrunway_name.Expected behavior
When
runway_nameis specified alongsideingress_mode/egress_mode, the networking check should scope to that runway rather than aggregating across all runways on the tower.