"""juniper bgp protocol routing instances parsing from set config """
# ------------------------------------------------------------------------------
from .common import *
from .run import ProtocolObject
# ------------------------------------------------------------------------------
# ------------------------------------------------------------------------------
# instance parser functions
# ------------------------------------------------------------------------------
[docs]
def get_vrf_rd(vrf_dict, spl):
if spl[3] != 'route-distinguisher': return
vrf_dict['rd'] = spl[-1].strip().split(":")[-1]
[docs]
def get_vrf_rt(vrf_dict, spl):
if spl[3] != 'vrf-target': return
rd = ":".join(spl[-1].split(":")[-2:])
append_attribute(vrf_dict, attribute=f"{spl[4]} target", value=rd)
[docs]
def get_vrf_desc(vrf_dict, spl):
if spl[3] != 'description': return
desc = " ".join(spl[4:]).strip()
if desc[0] == '"': desc = desc[1:]
if desc[-1] == '"': desc = desc[:-1]
vrf_dict['description'] = desc
# ------------------------------------------------------------------------------
# instance extractor class
# ------------------------------------------------------------------------------
[docs]
@dataclass
class Instances(ProtocolObject):
cmd_op: list[str,] = field(default_factory=[])
instance_attr_functions = [
get_vrf_rd,
get_vrf_rt,
get_vrf_desc,
]
def __post_init__(self):
super().initialize('bgp')
def __call__(self):
self.iterate_logical_systems(hierarchy='vrf')
[docs]
def start(self):
self.protocol_instances = {}
self.get_instance_lines()
self.add_protocol_instance_info()
return self.protocol_instances
[docs]
def get_instance_lines(self):
self.instances_line_dict = {}
for l in self.set_cmd_op:
if not l.startswith(f"set routing-instances "): continue
spl = l.strip().split()
vrf_dict = add_blankdict_key(self.instances_line_dict, spl[2])
VRF = self.jPtObj.VRFs[spl[2]]
if l in VRF.bgp_peer_group_lines: continue
if l in VRF.bgp_other_lines: continue
vrf_spl = add_blankset_key(vrf_dict, 'spl')
vrf_spl.add(tuple(spl))
[docs]
def add_protocol_instance_info(self):
for vrf, vrf_dict in self.instances_line_dict.items():
instance_dict = add_blankdict_key(self.protocol_instances, vrf)
for spl in vrf_dict['spl']:
self.iterate_instance_funcs(instance_dict, spl)
[docs]
def iterate_instance_funcs(self, instance_dict, spl):
for f in self.instance_attr_functions:
f(instance_dict, spl)
# ------------------------------------------------------------------------------
# instance parser calling function
# ------------------------------------------------------------------------------
[docs]
def get_instance_running(cmd_op):
"""parse output of : show configurtain
Args:
command_output (list): command output
Returns:
dict: vrf level parsed output dictionary
"""
I = Instances(cmd_op)
I()
return I.logical_systems_dict
# ------------------------------------------------------------------------------