@@ -556,7 +556,6 @@ def build_prefix_limit(**args):
556556 }
557557
558558 _PEER_FIELDS_DATATYPE_MAP_ = {
559- 'group' : unicode ,
560559 'authentication_key' : unicode ,
561560 'route_reflector_client' : bool ,
562561 'nhs' : bool
@@ -594,55 +593,8 @@ def build_prefix_limit(**args):
594593 neighbor = '' # if no group is set, no neighbor should be set either
595594 bgp_items = bgp .items ()
596595
597- peers = junos_views .junos_bgp_config_peers_table (self .device )
598- peers .get () # unfortunately cannot add filters for group name of neighbor address
599- peers_items = peers .items ()
600-
601- bgp_neighbors = {}
602-
603- for bgp_group_neighbor in peers_items :
604- bgp_peer_address = napalm_base .helpers .ip (bgp_group_neighbor [0 ])
605- if neighbor and bgp_peer_address != neighbor :
606- continue # if filters applied, jump over all other neighbors
607- bgp_group_details = bgp_group_neighbor [1 ]
608- bgp_peer_details = {
609- field : _DATATYPE_DEFAULT_ .get (datatype )
610- for field , datatype in _PEER_FIELDS_DATATYPE_MAP_ .iteritems ()
611- if '_prefix_limit' not in field
612- }
613- for elem in bgp_group_details :
614- if not ('_prefix_limit' not in elem [0 ] and elem [1 ] is not None ):
615- continue
616- datatype = _PEER_FIELDS_DATATYPE_MAP_ .get (elem [0 ])
617- default = _DATATYPE_DEFAULT_ .get (datatype )
618- key = elem [0 ]
619- value = elem [1 ]
620- if key in ['export_policy' , 'import_policy' ]:
621- if isinstance (value , list ):
622- value = ' ' .join (value )
623- if key == 'local_address' :
624- value = napalm_base .helpers .convert (
625- napalm_base .helpers .ip , value , value )
626- bgp_peer_details .update ({
627- key : napalm_base .helpers .convert (datatype , value , default )
628- })
629- prefix_limit_fields = {}
630- for elem in bgp_group_details :
631- if '_prefix_limit' in elem [0 ] and elem [1 ] is not None :
632- datatype = _PEER_FIELDS_DATATYPE_MAP_ .get (elem [0 ])
633- default = _DATATYPE_DEFAULT_ .get (datatype )
634- prefix_limit_fields .update ({
635- elem [0 ].replace ('_prefix_limit' , '' ): napalm_base .helpers .convert (datatype ,
636- elem [1 ],
637- default )
638- })
639- bgp_peer_details ['prefix_limit' ] = build_prefix_limit (** prefix_limit_fields )
640- group = bgp_peer_details .pop ('group' )
641- if group not in bgp_neighbors .keys ():
642- bgp_neighbors [group ] = {}
643- bgp_neighbors [group ][bgp_peer_address ] = bgp_peer_details
644- if neighbor and bgp_peer_address == neighbor :
645- break # found the desired neighbor
596+ if neighbor :
597+ neighbor_ip = napalm_base .helpers .ip (neighbor )
646598
647599 for bgp_group in bgp_items :
648600 bgp_group_name = bgp_group [0 ]
@@ -665,6 +617,9 @@ def build_prefix_limit(**args):
665617 if key == 'local_address' :
666618 value = napalm_base .helpers .convert (
667619 napalm_base .helpers .ip , value , value )
620+ if key == 'neighbors' :
621+ bgp_group_peers = value
622+ continue
668623 bgp_config [bgp_group_name ].update ({
669624 key : napalm_base .helpers .convert (datatype , value , default )
670625 })
@@ -674,12 +629,51 @@ def build_prefix_limit(**args):
674629 datatype = _GROUP_FIELDS_DATATYPE_MAP_ .get (elem [0 ])
675630 default = _DATATYPE_DEFAULT_ .get (datatype )
676631 prefix_limit_fields .update ({
677- elem [0 ].replace ('_prefix_limit' , '' ): napalm_base .helpers .convert (datatype ,
678- elem [1 ],
679- default )
632+ elem [0 ].replace ('_prefix_limit' , '' ):
633+ napalm_base .helpers .convert (datatype , elem [1 ], default )
680634 })
681635 bgp_config [bgp_group_name ]['prefix_limit' ] = build_prefix_limit (** prefix_limit_fields )
682- bgp_config [bgp_group_name ]['neighbors' ] = bgp_neighbors .get (bgp_group_name , {})
636+
637+ bgp_config [bgp_group_name ]['neighbors' ] = {}
638+ for bgp_group_neighbor in bgp_group_peers .items ():
639+ bgp_peer_address = napalm_base .helpers .ip (bgp_group_neighbor [0 ])
640+ if neighbor and bgp_peer_address != neighbor :
641+ continue # if filters applied, jump over all other neighbors
642+ bgp_group_details = bgp_group_neighbor [1 ]
643+ bgp_peer_details = {
644+ field : _DATATYPE_DEFAULT_ .get (datatype )
645+ for field , datatype in _PEER_FIELDS_DATATYPE_MAP_ .iteritems ()
646+ if '_prefix_limit' not in field
647+ }
648+ for elem in bgp_group_details :
649+ if not ('_prefix_limit' not in elem [0 ] and elem [1 ] is not None ):
650+ continue
651+ datatype = _PEER_FIELDS_DATATYPE_MAP_ .get (elem [0 ])
652+ default = _DATATYPE_DEFAULT_ .get (datatype )
653+ key = elem [0 ]
654+ value = elem [1 ]
655+ if key in ['export_policy' , 'import_policy' ]:
656+ if isinstance (value , list ):
657+ value = ' ' .join (value )
658+ if key == 'local_address' :
659+ value = napalm_base .helpers .convert (
660+ napalm_base .helpers .ip , value , value )
661+ bgp_peer_details .update ({
662+ key : napalm_base .helpers .convert (datatype , value , default )
663+ })
664+ prefix_limit_fields = {}
665+ for elem in bgp_group_details :
666+ if '_prefix_limit' in elem [0 ] and elem [1 ] is not None :
667+ datatype = _PEER_FIELDS_DATATYPE_MAP_ .get (elem [0 ])
668+ default = _DATATYPE_DEFAULT_ .get (datatype )
669+ prefix_limit_fields .update ({
670+ elem [0 ].replace ('_prefix_limit' , '' ):
671+ napalm_base .helpers .convert (datatype , elem [1 ], default )
672+ })
673+ bgp_peer_details ['prefix_limit' ] = build_prefix_limit (** prefix_limit_fields )
674+ bgp_config [bgp_group_name ]['neighbors' ][bgp_peer_address ] = bgp_peer_details
675+ if neighbor and bgp_peer_address == neighbor_ip :
676+ break # found the desired neighbor
683677
684678 return bgp_config
685679
0 commit comments