Skip to content
Snippets Groups Projects
Commit 7936f4a3 authored by Sam Roberts's avatar Sam Roberts
Browse files

rewritten to provide NREN, and to use caching

parent 05d8b71d
Branches
Tags
1 merge request!3Feature/reporting 311 add msr asn peers
......@@ -362,6 +362,40 @@ DOMAIN_TO_POP_MAPPING = {
"ams.nl": "Amsterdam"
}
# very similar to PEERING_LIST_SCHEMA but
# with a field for NREN, which is required
ASN_PEER_LIST_SCHEMA = {
'$schema': 'http://json-schema.org/draft-07/schema#',
'definitions': {
'peering-instance': {
'type': 'object',
'properties': {
'address': {'type': 'string'},
'description': {'type': 'string'},
'logical-system': {'type': 'string'},
'group': {'type': 'string'},
'hostname': {'type': 'string'},
'remote-asn': {'type': 'integer'},
'local-asn': {'type': 'integer'},
'instance': {'type': 'string'},
'nren': {'type': 'string'}
},
# only vrr peerings have remote-asn
# only group peerings have local-asn or instance
# not all group peerings have 'description'
# and only vrr or vpn-proxy peerings are within a logical system
'required': [
'address',
'group',
'hostname',
'nren'],
'additionalProperties': False
}
},
'type': 'array',
'items': {'$ref': '#/definitions/peering-instance'}
}
@routes.after_request
def after_request(resp):
......@@ -1203,14 +1237,14 @@ def asn_peers(asn):
The response will be formatted according to the following schema:
.. asjson::
inventory_provider.routes.msr.PEERING_LIST_SCHEMA
inventory_provider.routes.msr.ASN_PEER_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):
def _get_filtered_peers_for_asn(asn, nren, group, instance):
peers = json.loads(r.get(f'juniper-peerings:peer-asn:{asn}'))
def _attribute_filter(peer, name, value):
......@@ -1223,12 +1257,12 @@ def asn_peers(asn):
for peer in peers:
if _attribute_filter(peer, "group", group) and \
_attribute_filter(peer, "instance", instance):
peer['nren'] = nren
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)
def _get_filtered_peers(asn_nren_map, group, instance):
for asn, nren in asn_nren_map.items():
asn_peers = _get_filtered_peers_for_asn(asn, nren, group, instance)
for peer in asn_peers:
yield peer
......@@ -1241,10 +1275,26 @@ def asn_peers(asn):
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:
cache_key = f'classifier-cache:msr:asn-peers:{asn}:{group}:{instance}'
response = _ignore_cache_or_retrieve(request, cache_key, r)
if not response:
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)
# set up quick lookup based on ASN
asn_nren_map = {
item['asn']: item['nren'] for item in config['nren-asn-map']
}
if asn is not None:
nren = asn_nren_map.get(asn, None)
peers = list(
_get_filtered_peers_for_asn(asn, nren, group, instance)
)
else:
peers = list(
_get_filtered_peers(asn_nren_map, group, instance)
)
response = json.dumps(peers)
r.set(cache_key, response.encode('utf-8'))
return Response(response, mimetype='application/json')
......@@ -6,7 +6,7 @@ import pytest
from inventory_provider.routes.msr import PEERING_LIST_SCHEMA, \
PEERING_GROUP_LIST_SCHEMA, PEERING_ADDRESS_SERVICES_LIST, \
SYSTEM_CORRELATION_SERVICES_LIST_SCHEMA, _get_services_for_address, \
MDVPN_LIST_SCHEMA, VPN_PROXY_LIST_SCHEMA
MDVPN_LIST_SCHEMA, VPN_PROXY_LIST_SCHEMA, ASN_PEER_LIST_SCHEMA
from inventory_provider.routes.poller import SERVICES_LIST_SCHEMA
from inventory_provider.tasks.common import _get_redis
......@@ -366,7 +366,7 @@ def test_get_asn_peers_get(endpoint_variant, client, mocked_redis):
assert rv.status_code == 200
assert rv.is_json
response_data = json.loads(rv.data.decode('utf-8'))
jsonschema.validate(response_data, PEERING_LIST_SCHEMA)
jsonschema.validate(response_data, ASN_PEER_LIST_SCHEMA)
assert response_data # test data is non-empty
......@@ -389,5 +389,5 @@ def test_get_asn_peers_post(endpoint_variant, post_body, client, mocked_redis):
assert rv.status_code == 200
assert rv.is_json
response_data = json.loads(rv.data.decode('utf-8'))
jsonschema.validate(response_data, PEERING_LIST_SCHEMA)
jsonschema.validate(response_data, ASN_PEER_LIST_SCHEMA)
assert response_data # test data is non-empty
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment