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

add docstring, return schema and test

parent c4cc14ce
No related branches found
No related tags found
1 merge request!2Feature/reporting 307 msr vpn proxy endpoint
...@@ -64,12 +64,19 @@ These endpoints are intended for use by MSR. ...@@ -64,12 +64,19 @@ These endpoints are intended for use by MSR.
.. autofunction:: inventory_provider.routes.msr.mdvpn .. autofunction:: inventory_provider.routes.msr.mdvpn
/msr/services /msr/services
-------------------------------------------- --------------------------------------------
.. autofunction:: inventory_provider.routes.msr.get_system_correlation_services .. autofunction:: inventory_provider.routes.msr.get_system_correlation_services
/msr/vpn-proxy
--------------------------------------------
.. autofunction:: inventory_provider.routes.msr.vpn-proxy
helpers helpers
------------------------------------- -------------------------------------
...@@ -327,7 +334,10 @@ VPN_PROXY_LIST_SCHEMA = { ...@@ -327,7 +334,10 @@ VPN_PROXY_LIST_SCHEMA = {
'vpn_proxy_peering': { 'vpn_proxy_peering': {
'type': 'object', 'type': 'object',
'properties': { 'properties': {
# TODO: THIS 'pop': {'type': 'string'},
'nren': {'type': 'string'},
'group': {'type': 'string'},
'v4': {'type': 'string'}
}, },
'additionalProperties': False 'additionalProperties': False
} }
...@@ -1086,17 +1096,42 @@ def mdvpn(): ...@@ -1086,17 +1096,42 @@ def mdvpn():
@routes.route('/vpn-proxy', methods=['GET', 'POST']) @routes.route('/vpn-proxy', methods=['GET', 'POST'])
@common.require_accepts_json @common.require_accepts_json
def vpn_proxy(): def vpn_proxy():
"""
Handler for `/vpn-proxy`
This method returns a list of all L3VPN related VPN proxy peerings.
The response will be formatted according to the following schema:
.. asjson::
inventory_provider.routes.msr.VPN_PROXY_LIST_SCHEMA
:return:
"""
def _is_relevant(item): def _is_relevant(item):
"""
Determine if a given peering in the VPN-PROXY logical system is
relevant to this endpoint (whether it's related to L3VPN)
:param item: peering dict
:return: True if the peering is L3VPN relevant, False otherwise
"""
desc = item.get("description") desc = item.get("description")
if desc is None: if desc is None:
return False return False
return "L3VPN" in desc return "L3VPN" in desc
def _look_up_city_from_hostname(hostname): def _look_up_city_from_hostname(hostname):
"""
Get the city name for a peering from a partial hostname match.
This uses a hardcoded lookup table.
:param hostname: hostname for the peering
:return: city name if found, "Unknown" otherwise
"""
for snippet in DOMAIN_TO_POP_MAPPING: for snippet in DOMAIN_TO_POP_MAPPING:
if snippet in hostname: if snippet in hostname:
return DOMAIN_TO_POP_MAPPING[snippet] return DOMAIN_TO_POP_MAPPING[snippet]
return "Unknown"
def _extract_nren_from_description(desc, group): def _extract_nren_from_description(desc, group):
""" """
...@@ -1116,6 +1151,12 @@ def vpn_proxy(): ...@@ -1116,6 +1151,12 @@ def vpn_proxy():
return 'CESNet' return 'CESNet'
def _format_peerings(vpnproxy): def _format_peerings(vpnproxy):
"""
Generator that iterates through a list of peering dicts, yielding
appropriately reformatted peerings if they are relevant to L3VPN.
:param vpnproxy: list of peering dicts taken from current redis
:return: generator of reformated peerings
"""
for peering in vpnproxy: for peering in vpnproxy:
if _is_relevant(peering): if _is_relevant(peering):
desc = peering["description"] desc = peering["description"]
...@@ -1135,7 +1176,8 @@ def vpn_proxy(): ...@@ -1135,7 +1176,8 @@ def vpn_proxy():
cache_key = 'classifier-cache:msr:vpn-proxy' cache_key = 'classifier-cache:msr:vpn-proxy'
response = _ignore_cache_or_retrieve(request, cache_key, r) response = _ignore_cache_or_retrieve(request, cache_key, r)
if not response: if not response:
vpnproxy = json.loads(r.get('juniper-peerings:logical-system:VPN-PROXY').decode('utf-8')) vpnproxy = json.loads(
r.get('juniper-peerings:logical-system:VPN-PROXY').decode('utf-8'))
peerings = list(filter(None, _format_peerings(vpnproxy))) peerings = list(filter(None, _format_peerings(vpnproxy)))
response = json.dumps(peerings) response = json.dumps(peerings)
return Response(response, mimetype='application/json') return Response(response, mimetype='application/json')
...@@ -6,7 +6,7 @@ import pytest ...@@ -6,7 +6,7 @@ import pytest
from inventory_provider.routes.msr import PEERING_LIST_SCHEMA, \ from inventory_provider.routes.msr import PEERING_LIST_SCHEMA, \
PEERING_GROUP_LIST_SCHEMA, PEERING_ADDRESS_SERVICES_LIST, \ PEERING_GROUP_LIST_SCHEMA, PEERING_ADDRESS_SERVICES_LIST, \
SYSTEM_CORRELATION_SERVICES_LIST_SCHEMA, _get_services_for_address, \ SYSTEM_CORRELATION_SERVICES_LIST_SCHEMA, _get_services_for_address, \
MDVPN_LIST_SCHEMA MDVPN_LIST_SCHEMA, VPN_PROXY_LIST_SCHEMA
from inventory_provider.routes.poller import SERVICES_LIST_SCHEMA from inventory_provider.routes.poller import SERVICES_LIST_SCHEMA
from inventory_provider.tasks.common import _get_redis from inventory_provider.tasks.common import _get_redis
...@@ -334,3 +334,15 @@ def test_get_mdvpn_peerings(client, mocked_redis): ...@@ -334,3 +334,15 @@ def test_get_mdvpn_peerings(client, mocked_redis):
response_data = json.loads(rv.data.decode('utf-8')) response_data = json.loads(rv.data.decode('utf-8'))
jsonschema.validate(response_data, MDVPN_LIST_SCHEMA) jsonschema.validate(response_data, MDVPN_LIST_SCHEMA)
assert response_data # test data is non-empty assert response_data # test data is non-empty
def test_get_vpn_proxy_peerings(client, mocked_redis):
rv = client.get(
'/msr/vpn-proxy',
headers=DEFAULT_REQUEST_HEADERS
)
assert rv.status_code == 200
assert rv.is_json
response_data = json.loads(rv.data.decode('utf-8'))
jsonschema.validate(response_data, VPN_PROXY_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