Skip to content
Snippets Groups Projects
Commit b5e4d2c1 authored by Benjamin Bertrand's avatar Benjamin Bertrand
Browse files

Add interfaces filtering by domain

parent 226f186c
No related branches found
No related tags found
No related merge requests found
......@@ -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)
......
......@@ -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
......
......@@ -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
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment