Skip to content
Snippets Groups Projects

Add classifier endpoint for router info

Merged Pelle Koster requested to merge router-info-endpoint into develop
5 files
+ 142
7
Compare changes
  • Side-by-side
  • Inline
Files
5
@@ -39,6 +39,8 @@ These endpoints are intended for use by Dashboard V3.
.. autofunction:: inventory_provider.routes.classifier.get_mtc_interface_info
"""
import functools
import ipaddress
import json
import logging
@@ -50,7 +52,7 @@ from flask import Blueprint, Response, request
from redis import Redis
from inventory_provider.routes import common
from inventory_provider.routes.common import _ignore_cache_or_retrieve
from inventory_provider.routes.common import _ignore_cache_or_retrieve, cache_result
routes = Blueprint("inventory-data-classifier-support-routes", __name__)
@@ -1120,3 +1122,46 @@ def _get_coriant_info(
r.set(cache_key, result.encode('utf-8'))
return Response(result, mimetype="application/json")
@routes.route("/router-info/<equipment_name>", methods=["GET"])
@common.require_accepts_json
def get_router_info(equipment_name: str) -> Response:
redis = common.get_current_redis()
equipment_name = get_ims_equipment_name(equipment_name, redis)
cache_key = f"classifier-cache:router:{equipment_name}"
result = cache_result(
cache_key,
func=functools.partial(_get_router_info, equipment_name, redis),
redis=redis,
)
return Response(result, mimetype="application/json")
def _get_router_info(ims_source_equipment, redis):
def _format_service(service: dict):
keys = {"name", "status", "service_type", "sid"}
return {k: v for k, v in service.items() if k in keys}
related_services = {}
contacts = set()
for key in redis.scan_iter(f"ims:interface_services:{ims_source_equipment}:*"):
raw_services = redis.get(key.decode())
if not raw_services:
continue
services = json.loads(raw_services)
for service in services:
related_services.update({r["id"]: r for r in service["related-services"]})
contacts.update(service.get("contacts", []))
return {
"related-services": sorted(
map(_format_service, related_services.values()), key=lambda s: s["name"]
),
"contacts": sorted(contacts),
"location": _location_from_equipment(ims_source_equipment, redis),
}
Loading