"""juniper protocol routing instances parsing from set config """
# ------------------------------------------------------------------------------
from .common import *
from .run import ProtocolObject
# ------------------------------------------------------------------------------
# ------------------------------------------------------------------------------
# parser functions
# ------------------------------------------------------------------------------
#### //// INSTANCE FUNCTIONS //// ####
[docs]
def get_isis_options(instance_dict, spl):
true_attr = {
'backup-spf-options': ('node-link-degradation', 'per-prefix-calculation', 'remote-backup-calculation',
'use-source-packet-routing', ),
'export': ('export-isis-metro-a', 'export-isis-metro-b', 'l2_l1_leak', 'leakl2tol1', 'prefix-sid'),
}
next_attr = {
'graceful-restart': ('restart-duration', )
}
get_nest_attributes(instance_dict, '', spl, true_attr, next_attr=False, unique=False)
get_nest_attributes(instance_dict, '', spl, next_attr, next_attr=True, unique=False)
[docs]
def get_isis_int_options(int_dict, spl):
int_true_attr = {'node-link-protection', 'ldp-synchronization', 'node-link-protection', 'link-protection',
'point-to-point', 'disable', 'passive', 'checksum',
}
int_next_attr = { 'level', 'metric', 'cluster-id', 'family', 'hello-authentication-key-chain',
'ipv4-adjacency-segment', 'label', 'priority',
}
int_nest_next_attr = {
'authentication': ('algorithm', 'key-chain'),
}
get_nest_attributes(int_dict, '', spl, int_true_attr, next_attr=False, unique=False)
get_nest_attributes(int_dict, '', spl, int_next_attr, next_attr=True, unique=True)
get_nest_attributes(int_dict, '', spl, int_nest_next_attr, next_attr=True, unique=False)
[docs]
def get_isis_lvl_options(lvl_dict, spl):
lvl_true_attr = { 'wide-metrics-only', 'disable', }
lvl_next_attr = { 'authentication-key-chain', 'flood-reflector' }
get_nest_attributes(lvl_dict, '', spl, lvl_true_attr, next_attr=False, unique=False)
get_nest_attributes(lvl_dict, '', spl, lvl_next_attr, next_attr=True, unique=False)
# ------------------------------------------------------------------------------
# extractor class
# ------------------------------------------------------------------------------
[docs]
@dataclass
class ISIS(ProtocolObject):
cmd_op: list[str,] = field(default_factory=[])
protocol: str
isis_attr_functions = [
get_isis_options,
]
isis_intf_attr_functions = [
get_isis_int_options,
]
isis_lvl_attr_functions = [
get_isis_lvl_options,
]
isis_nested_attr_functions = {
'interface': isis_intf_attr_functions,
'level': isis_lvl_attr_functions,
}
def __post_init__(self):
super().initialize(self.protocol)
def __call__(self):
self.iterate_logical_systems(hierarchy='protocols')
[docs]
def start(self):
self.protocol_isis_dict = {}
self.get_protocol_isis_instance_lines()
self.iterate_for_isis_instances()
isis_dict = self.iterate_for_isis_instances()
isis_dict = self.remove_parent_vrf_if_standalone(isis_dict)
self.protocol_isis_dict = {self.protocol: isis_dict}
return self.protocol_isis_dict
[docs]
def get_protocol_isis_instance_lines(self):
self.protocol_lines = {}
for vrf in self.jPtObj.VRFs.keys():
VRF = self.jPtObj.VRFs[vrf]
if not VRF.protocol_vrf_lines: continue
VRF.instance_dict = self.get_isis_instances_dict(VRF.protocol_vrf_lines)
self.protocol_lines[vrf] = VRF
[docs]
def get_isis_instances_dict(self, lines):
instance_dict = {}
for line in lines:
spl = line.strip().split(" protocols isis")[-1].split()
vrf = spl[1] if spl[0] == '-instance' else None
vrf_list = add_blanklist_key(instance_dict, vrf)
if vrf: spl = spl[2:]
vrf_list.append(spl)
return instance_dict
[docs]
def iterate_for_isis_instances(self):
protocol_isis_dict = {}
for vrf, VRF in self.protocol_lines.items():
for instance, instance_lines in VRF.instance_dict.items():
if not instance_lines: continue
instance_dict = add_blankdict_key(protocol_isis_dict, instance)
self.iterate_isis_lines(instance_dict, instance_lines)
return protocol_isis_dict
[docs]
def iterate_isis_lines(self, instance_dict, instance_lines):
segments = ( 'interface', 'level', )
for spl in instance_lines:
self.iterate_isis_attr_funcs(instance_dict, spl, segments)
for segment in segments:
self.iterate_isis_intf_attr_funcs(instance_dict, spl, segment)
[docs]
def iterate_isis_attr_funcs(self, instance_dict, spl, segments):
if spl[0] in segments: return
for f in self.isis_attr_functions:
f(instance_dict, spl)
[docs]
def iterate_isis_intf_attr_funcs(self, instance_dict, spl, segment):
if spl[0] != segment: return
spl = spl[spl.index(segment)+1:]
_segment_dict = add_blankdict_key(instance_dict, segment)
segment_dict = add_blankdict_key(_segment_dict, spl[0])
for f in self.isis_nested_attr_functions[segment]:
f(segment_dict, spl)
# ------------------------------------------------------------------------------
# parser calling function
# ------------------------------------------------------------------------------
[docs]
def get_isis_running(cmd_op):
"""parse output of : show configurtain
Args:
command_output (list): command output
Returns:
dict: protocols isis and isis-instance level parsed output dictionary
"""
parent_dict = get_isis_parent_running(cmd_op)
instance_dict = get_isis_instance_running(cmd_op)
merge_dict(parent_dict, instance_dict)
return parent_dict
[docs]
def get_isis_parent_running(cmd_op):
I = ISIS(cmd_op, 'isis')
I()
return I.logical_systems_dict
[docs]
def get_isis_instance_running(cmd_op):
I = ISIS(cmd_op, 'isis-instance')
I()
return I.logical_systems_dict
# ------------------------------------------------------------------------------