diff --git a/app/api/network.py b/app/api/network.py index 104a4cb7847d6f7197c01cf787cfac8884491c52..24be880c364144ccf8bc2717677b64204d8bd13c 100644 --- a/app/api/network.py +++ b/app/api/network.py @@ -9,7 +9,7 @@ This module implements the network API. :license: BSD 2-Clause, see LICENSE for more details. """ -from flask import Blueprint +from flask import Blueprint, request from flask_jwt_extended import jwt_required from .. import models from ..decorators import jwt_groups_accepted @@ -89,6 +89,14 @@ def get_interfaces(): .. :quickref: Network; Get interfaces """ + domain = request.args.get('domain', None) + if domain is not None: + query = models.Interface.query + query = query.join(models.Interface.network).join( + models.Network.domain).filter( + models.Domain.name == domain) + 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/app/api/utils.py b/app/api/utils.py index 168b2669d7fff43d3fe6d33061816032d2794b7b..f4369e4804c00def9633e03acaa4affdfac2bc8a 100644 --- a/app/api/utils.py +++ b/app/api/utils.py @@ -59,20 +59,23 @@ def build_pagination_header(pagination, base_url, **kwargs): return header -def get_generic_model(model, order_by=None): +def get_generic_model(model, order_by=None, query=None): """Return data from model as json :param model: model class :param order_by: column to order the result by + :param query: optional query to use (for more complex queries) :returns: data from model as json """ kwargs = request.args.to_dict() page = int(kwargs.pop('page', 1)) per_page = int(kwargs.pop('per_page', 20)) - query = utils.get_query(model.query, **kwargs) - if order_by is None: - order_by = getattr(model, 'name') - pagination = query.order_by(order_by).paginate(page, per_page) + if query is None: + query = utils.get_query(model.query, **kwargs) + if order_by is None: + order_by = getattr(model, 'name') + query = query.order_by(order_by) + pagination = query.paginate(page, per_page) data = [item.to_dict() for item in pagination.items] header = build_pagination_header(pagination, request.base_url, **kwargs) return jsonify(data), 200, header diff --git a/tests/functional/test_api.py b/tests/functional/test_api.py index a74754fe09ead2c3e8b426a738751ab6facfcd63..ecc181385ade27e7a49cc2ea5b0f64b36efcbc94 100644 --- a/tests/functional/test_api.py +++ b/tests/functional/test_api.py @@ -598,6 +598,28 @@ def test_get_interfaces(client, network_factory, interface_factory, readonly_tok check_input_is_subset_of_response(response, (interface3.to_dict(),)) +def test_get_interfaces_by_domain(client, domain_factory, network_factory, interface_factory, readonly_token): + # Create some interfaces + domain1 = domain_factory(name='tn.esss.lu.se') + domain2 = domain_factory(name='ics.esss.lu.se') + network1 = network_factory(address='192.168.1.0/24', first_ip='192.168.1.10', last_ip='192.168.1.250', domain=domain1) + network2 = network_factory(address='192.168.2.0/24', first_ip='192.168.2.10', last_ip='192.168.2.250', domain=domain2) + 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 domain + response = get(client, f'{API_URL}/network/interfaces?domain=tn.esss.lu.se', 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?domain=ics.esss.lu.se', 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_create_interface(client, network_factory, user_token): network = network_factory(address='192.168.1.0/24', first_ip='192.168.1.10', last_ip='192.168.1.250') # check that network_id and ip are mandatory