From 046f5d9094e70dc4bdc00d388c3969c153799623 Mon Sep 17 00:00:00 2001 From: Benjamin Bertrand <benjamin.bertrand@esss.se> Date: Thu, 19 Jul 2018 22:07:08 +0200 Subject: [PATCH] Allow retrieving interfaces by network name JIRA INFRA-424 --- app/api/network.py | 8 ++++++++ tests/functional/test_api.py | 40 ++++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/app/api/network.py b/app/api/network.py index 2eb6ba4..b89b188 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 681af8d..9efc9fc 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 ): -- GitLab