Skip to content
Snippets Groups Projects

Feature/reporting 311 add msr asn peers

Merged Sam Roberts requested to merge feature/REPORTING-311-add-msr-asn-peers into develop
All threads resolved!
Files
2
@@ -97,7 +97,7 @@ import threading
from collections import defaultdict
from typing import Dict
from flask import Blueprint, Response, request, current_app
from flask import Blueprint, Response, request, current_app, jsonify
import jsonschema
from inventory_provider.routes import common
@@ -1173,3 +1173,72 @@ def vpn_proxy():
peerings = list(_format_peerings(vpnproxy))
response = json.dumps(peerings)
return Response(response, mimetype='application/json')
@routes.route('/asn-peers', methods=['GET', 'POST'], defaults={'asn': None})
@routes.route('/asn-peers/<asn>', methods=['GET', 'POST'])
@common.require_accepts_json
def asn_peers(asn):
"""
Handler for `/asn-peers`
This method returns a list of all peers filtered by `group` and `instance`,
which can be passed either as URL query parameters or as entries in a
POST request with a JSON body that matches this schema:
`{
"group": "group to filter by",
"instance": "instance to filter by"
}`
Results are returned where all filters given are true, and exact string
matches.
An optional URL parameter can be used to also filter by a specific ASN.
The response will be formatted according to the following schema:
.. asjson::
inventory_provider.routes.msr.PEERING_LIST_SCHEMA
:param asn: specific ASN to get peers for
:return:
"""
r = common.get_current_redis()
def _get_filtered_peers_for_asn(asn, group, instance):
peers = json.loads(r.get(f'juniper-peerings:peer-asn:{asn}'))
def _attribute_filter(peer, name, value):
if value is None:
return True # no filter parameter given in request
if name not in peer:
return False # no value exists, cannot meet condition
return peer[name] == value
for peer in peers:
if _attribute_filter(peer, "group", group) and \
_attribute_filter(peer, "instance", instance):
yield peer
def _get_filtered_peers(nren_asn_map, group, instance):
for pair in nren_asn_map:
asn = pair['asn']
asn_peers = _get_filtered_peers_for_asn(asn, group, instance)
for peer in asn_peers:
yield peer
# handle getting parameters regardless of method of input
if request.method == 'GET':
group = request.args.get('group')
instance = request.args.get('instance')
else:
params = json.loads(request.json)
group = params.get('group', None)
instance = params.get('instance', None)
if asn is not None:
peers = list(_get_filtered_peers_for_asn(asn, group, instance))
else:
config = current_app.config['INVENTORY_PROVIDER_CONFIG']
nren_asn_map = config['nren-asn-map']
peers = list(_get_filtered_peers(nren_asn_map, group, instance))
return jsonify(peers)
Loading