From 85519da40064c1da83ac053e29beaacc6c8cc0fc Mon Sep 17 00:00:00 2001 From: checktheroads Date: Tue, 14 Jul 2020 00:16:49 -0700 Subject: [PATCH] fix #54 handle empty list of communities --- hyperglass/parsing/juniper.py | 12 +++++++++++- hyperglass/parsing/models/juniper.py | 8 ++++++-- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/hyperglass/parsing/juniper.py b/hyperglass/parsing/juniper.py index 4015b56..ac4ad29 100644 --- a/hyperglass/parsing/juniper.py +++ b/hyperglass/parsing/juniper.py @@ -1,18 +1,24 @@ """Parse Juniper XML Response to Structured Data.""" +# Standard Library +from typing import Dict, Iterable + # Third Party import xmltodict +from pydantic import ValidationError # Project from hyperglass.log import log +from hyperglass.util import validation_error_message from hyperglass.exceptions import ParsingError, ResponseEmpty from hyperglass.configuration import params from hyperglass.parsing.models.juniper import JuniperRoute -def parse_juniper(output): +def parse_juniper(output: Iterable) -> Dict: # noqa: C901 """Parse a Juniper BGP XML response.""" data = {} + for i, response in enumerate(output): try: parsed = xmltodict.parse( @@ -48,4 +54,8 @@ def parse_juniper(output): log.critical(f"'{str(err)}' was not found in the response") raise ParsingError("Error parsing response data") + except ValidationError as err: + log.critical(str(err)) + raise ParsingError(validation_error_message(*err.errors())) + return data diff --git a/hyperglass/parsing/models/juniper.py b/hyperglass/parsing/models/juniper.py index 4d34323..6d2e6a7 100644 --- a/hyperglass/parsing/models/juniper.py +++ b/hyperglass/parsing/models/juniper.py @@ -44,7 +44,7 @@ class JuniperRouteTableEntry(_JuniperBase): peer_as: int source_as: int source_rid: StrictStr - communities: List[StrictStr] + communities: List[StrictStr] = None @root_validator(pre=True) def validate_optional_flags(cls, values): @@ -105,7 +105,11 @@ class JuniperRouteTableEntry(_JuniperBase): @validator("communities", pre=True, always=True) def validate_communities(cls, value): """Flatten community list.""" - return value.get("community", []) + if value is not None: + flat = value.get("community", []) + else: + flat = [] + return flat class JuniperRouteTable(_JuniperBase):