diff --git a/app/api/network.py b/app/api/network.py index 2eb6ba4482ded08c88401e174b3f19166999acd1..b89b1882abd97cd3a2917a9523208a11fc8546a0 100644 --- a/app/api/network.py +++ b/app/api/network.py @@ -108,6 +108,14 @@ def get_interfaces(): ) query = query.order_by(models.Interface.ip) return get_generic_model(model=None, query=query) + network = request.args.get("network", None) + if network is not None: + query = models.Interface.query + query = query.join(models.Interface.network).filter( + models.Network.vlan_name == network + ) + query = query.order_by(models.Interface.ip) + return get_generic_model(model=None, query=query) return get_generic_model(models.Interface, order_by=models.Interface.ip) diff --git a/tests/functional/test_api.py b/tests/functional/test_api.py index 681af8d9e180f224a086e98676696f861f9d46ef..9efc9fcb69cb1858c1fca020b770babb6b45517f 100644 --- a/tests/functional/test_api.py +++ b/tests/functional/test_api.py @@ -914,6 +914,46 @@ def test_get_interfaces_by_domain( check_input_is_subset_of_response(response, (interface3.to_dict(),)) +def test_get_interfaces_by_network( + client, network_factory, interface_factory, readonly_token +): + # Create some interfaces + network1 = network_factory( + vlan_name="MyNetwork1", + address="192.168.1.0/24", + first_ip="192.168.1.10", + last_ip="192.168.1.250", + ) + network2 = network_factory( + vlan_name="MyNetwork2", + address="192.168.2.0/24", + first_ip="192.168.2.10", + last_ip="192.168.2.250", + ) + interface1 = interface_factory(network=network1, ip="192.168.1.10") + interface2 = interface_factory( + network=network1, ip="192.168.1.11", name="interface2" + ) + interface3 = interface_factory(network=network2, ip="192.168.2.10") + + # test filtering by network name + response = get( + client, f"{API_URL}/network/interfaces?network=MyNetwork1", token=readonly_token + ) + assert response.status_code == 200 + assert len(response.json) == 2 + check_input_is_subset_of_response( + response, (interface1.to_dict(), interface2.to_dict()) + ) + + response = get( + client, f"{API_URL}/network/interfaces?network=MyNetwork2", token=readonly_token + ) + assert response.status_code == 200 + assert len(response.json) == 1 + check_input_is_subset_of_response(response, (interface3.to_dict(),)) + + def test_get_interfaces_with_model( client, model_factory, item_factory, host_factory, interface_factory, readonly_token ):