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