1
0
mirror of https://github.com/checktheroads/hyperglass synced 2024-05-11 05:55:08 +00:00

58 lines
1.6 KiB
Python
Raw Normal View History

"""Parse Arista JSON Response to Structured Data."""
# Standard Library
import json
from typing import Dict, Sequence
# Third Party
from pydantic import ValidationError
# Project
from hyperglass.log import log
from hyperglass.exceptions.private import ParsingError
from hyperglass.models.parsing.arista_eos import AristaRoute
def parse_arista(output: Sequence[str]) -> Dict: # noqa: C901
"""Parse a Arista BGP JSON response."""
data = {}
for i, response in enumerate(output):
try:
data: Dict = json.loads(response)
log.debug("Pre-parsed data: {}", data)
vrf = list(data["vrfs"].keys())[0]
routes = data["vrfs"][vrf]
log.debug("Pre-validated data: {}", routes)
validated = AristaRoute(**routes)
serialized = validated.serialize().export_dict()
if i == 0:
data.update(serialized)
else:
data["routes"].extend(serialized["routes"])
except json.JSONDecodeError as err:
log.critical("Error decoding JSON: {}", str(err))
raise ParsingError("Error parsing response data") from err
except KeyError as err:
log.critical("'{}' was not found in the response", str(err))
raise ParsingError("Error parsing response data") from err
except IndexError as err:
log.critical(str(err))
raise ParsingError("Error parsing response data") from err
except ValidationError as err:
log.critical(str(err))
raise ParsingError(err.errors()) from err
log.debug("Serialized: {}", data)
return data