Skip to content
Snippets Groups Projects
Commit 59ffb7be authored by Erik Reid's avatar Erik Reid
Browse files

implemented logical-system-peerings handler, added tests

parent 73692ced
No related branches found
No related tags found
No related merge requests found
import itertools
import json import json
from flask import Blueprint, jsonify, Response from flask import Blueprint, jsonify, Response
...@@ -80,6 +81,7 @@ def access_services(): ...@@ -80,6 +81,7 @@ def access_services():
.. asjson:: .. asjson::
inventory_provider.routes.msr.ACCESS_SERVICES_LIST_SCHEMA inventory_provider.routes.msr.ACCESS_SERVICES_LIST_SCHEMA
:param name:
:return: :return:
""" """
redis = common.get_current_redis() redis = common.get_current_redis()
...@@ -111,40 +113,57 @@ def access_services(): ...@@ -111,40 +113,57 @@ def access_services():
@routes.route("/logical-system-peerings", methods=['GET', 'POST']) @routes.route("/logical-system-peerings", methods=['GET', 'POST'])
@routes.route("/logical-system-peerings/<name>", methods=['GET', 'POST']) @routes.route("/logical-system-peerings/<name>", methods=['GET', 'POST'])
@common.require_accepts_json @common.require_accepts_json
def access_services(): def logical_system_peerings(name=None):
""" """
Handler for `/msr/access-services`. Handler for `/msr/logical-system-peerings
This method is in development, not yet used. This method will return a list of all peerings configured
for the requested logical-system name on any router, or for any
logical system if no parameter is given.
The response will be formatted according to the following schema: The response will be formatted according to the following schema:
.. asjson:: .. asjson::
inventory_provider.routes.msr.ACCESS_SERVICES_LIST_SCHEMA inventory_provider.routes.msr.LOGICAL_SYSTEM_PEERING_LIST_SCHEMA
:return: :return:
""" """
redis = common.get_current_redis()
def _services(): r = common.get_current_redis()
for k in redis.scan_iter('opsdb:access_services:*'):
service = redis.get(k.decode('utf-8')).decode('utf-8')
yield json.loads(service)
cache_key = 'classifier-cache:msr:access-services' def _get_all_ls_keys():
result = redis.get(cache_key) keys = []
for k in r.scan_iter(f'juniper-peerings:logical-system:*', count=1000):
keys.append(k.decode('utf-8'))
return keys
if result: def _load_list_items(key):
result = json.loads(result.decode('utf-8')) value = r.get(key)
else: if value:
result = list(_services()) yield from json.loads(value.decode('utf-8'))
# cache this data for the next call
redis.set(cache_key, json.dumps(result).encode('utf-8'))
if not result: cache_key = 'classifier-cache:msr:logical-system-peerings'
return Response( if name:
response='no access services found', cache_key = f'{cache_key}:name'
status=404,
mimetype="text/html")
return jsonify(result) items = r.get(cache_key)
if items:
items = json.loads(items.decode('utf-8'))
else:
if name:
items = _load_list_items(f'juniper-peerings:logical-system:{name}')
else:
gen_list = list(map(_load_list_items, _get_all_ls_keys()))
items = itertools.chain(*gen_list)
items = list(items)
if not items:
return Response(
response='no peerings found',
status=404,
mimetype="text/html")
r.set(cache_key, json.dumps(items).encode('utf-8'))
return jsonify(items)
import json import json
import jsonschema import jsonschema
from inventory_provider.routes.msr import ACCESS_SERVICES_LIST_SCHEMA
import pytest
from inventory_provider.routes.msr \
import ACCESS_SERVICES_LIST_SCHEMA, LOGICAL_SYSTEM_PEERING_LIST_SCHEMA
DEFAULT_REQUEST_HEADERS = { DEFAULT_REQUEST_HEADERS = {
"Content-type": "application/json", "Content-type": "application/json",
...@@ -18,3 +22,28 @@ def test_access_services(client): ...@@ -18,3 +22,28 @@ def test_access_services(client):
jsonschema.validate(response_data, ACCESS_SERVICES_LIST_SCHEMA) jsonschema.validate(response_data, ACCESS_SERVICES_LIST_SCHEMA)
assert response_data # test data is non-empty assert response_data # test data is non-empty
def test_logical_system_peerings_all(client):
rv = client.get(
'/msr/logical-system-peerings',
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, LOGICAL_SYSTEM_PEERING_LIST_SCHEMA)
assert response_data # test data is non-empty
@pytest.mark.parametrize('name', ['VRR', 'VPN-PROXY'])
def test_logical_system_peerings_specific(client, name):
rv = client.get(
f'/msr/logical-system-peerings/{name}',
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, LOGICAL_SYSTEM_PEERING_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.
Finish editing this message first!
Please register or to comment