Skip to content
This repository was archived by the owner on Feb 10, 2018. It is now read-only.

Commit 175a0b0

Browse files
authored
Merge pull request #62 from napalm-automation/develop
Release 0.4.1
2 parents 48c06c3 + eb07a56 commit 175a0b0

File tree

3 files changed

+103
-107
lines changed

3 files changed

+103
-107
lines changed

napalm_junos/junos.py

Lines changed: 48 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -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

napalm_junos/utils/junos_views.yml

Lines changed: 52 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,7 @@ junos_lldp_neighbors_detail_view:
222222
### BGP config
223223
###
224224

225+
225226
junos_bgp_config_table:
226227
get: protocols/bgp/group
227228
view: junos_bgp_config_view
@@ -234,64 +235,65 @@ junos_bgp_config_group_table:
234235

235236
junos_bgp_config_view:
236237
fields:
237-
type: type
238-
description: description
239-
apply_groups: apply-groups
240-
local_address: local-address
241-
multihop_ttl: multihop/ttl
242-
local_as: local-as/as-number
243-
remote_as: peer-as
238+
type: {type: unicode}
239+
description: {description: unicode}
240+
apply_groups: {apply-groups: unicode}
241+
local_address: {local-address: unicode}
242+
multihop_ttl: {multihop/ttl: int}
243+
local_as: {local-as/as-number: int}
244+
remote_as: {peer-as: int}
244245
multipath: multipath
245246
remove_private_as: remove-private
246-
import_policy: import
247-
export_policy: export
248-
inet_unicast_limit_prefix_limit: family/inet/unicast/prefix-limit/maximum
249-
inet_unicast_teardown_threshold_prefix_limit: family/inet/unicast/prefix-limit/teardown/limit-threshold
250-
inet_unicast_teardown_timeout_prefix_limit: family/inet/unicast/prefix-limit/teardown/idle-timeout/timeout
251-
inet_unicast_novalidate_prefix_limit: family/inet/unicast/prefix-limit/no-validate
252-
inet_flow_limit_prefix_limit: family/inet/flow/prefix-limit/maximum
253-
inet_flow_teardown_threshold_prefix_limit: family/inet/flow/prefix-limit/teardown/limit-threshold
254-
inet_flow_teardown_timeout_prefix_limit: family/inet/flow/prefix-limit/teardown/idle-timeout/timeout
255-
inet_flow_novalidate_prefix_limit: family/inet/flow/prefix-limit/no-validate
256-
inet6_unicast_limit_prefix_limit: family/inet6/unicast/prefix-limit/maximum
257-
inet6_unicast_teardown_threshold_prefix_limit: family/inet6/unicast/prefix-limit/teardown/limit-threshold
258-
inet6_unicast_teardown_timeout_prefix_limit: family/inet6/unicast/prefix-limit/teardown/idle-timeout/timeout
259-
inet6_unicast_novalidate_prefix_limit: family/inet6/unicast/prefix-limit/no-validate
260-
inet6_flow_limit_prefix_limit: family/inet6/flow/prefix-limit/maximum
261-
inet6_flow_teardown_threshold_prefix_limit: family/inet6/flow/prefix-limit/teardown/limit-threshold
262-
inet6_flow_teardown_timeout_prefix_limit: family/inet6/flow/prefix-limit/teardown/idle-timeout/timeout
263-
inet6_flow_novalidate_prefix_limit: family/inet6/flow/prefix-limit/no-validate
247+
import_policy: {import: unicode}
248+
export_policy: {export: unicode}
249+
neighbors: junos_bgp_config_peers_table
250+
inet_unicast_limit_prefix_limit: {family/inet/unicast/prefix-limit/maximum: int}
251+
inet_unicast_teardown_threshold_prefix_limit: {family/inet/unicast/prefix-limit/teardown/limit-threshold: int}
252+
inet_unicast_teardown_timeout_prefix_limit: {family/inet/unicast/prefix-limit/teardown/idle-timeout/timeout: int}
253+
inet_unicast_novalidate_prefix_limit: {family/inet/unicast/prefix-limit/no-validate: int}
254+
inet_flow_limit_prefix_limit: {family/inet/flow/prefix-limit/maximum: int}
255+
inet_flow_teardown_threshold_prefix_limit: {family/inet/flow/prefix-limit/teardown/limit-threshold: int}
256+
inet_flow_teardown_timeout_prefix_limit: {family/inet/flow/prefix-limit/teardown/idle-timeout/timeout: int}
257+
inet_flow_novalidate_prefix_limit: {family/inet/flow/prefix-limit/no-validate: unicode}
258+
inet6_unicast_limit_prefix_limit: {family/inet6/unicast/prefix-limit/maximum: int}
259+
inet6_unicast_teardown_threshold_prefix_limit: {family/inet6/unicast/prefix-limit/teardown/limit-threshold: int}
260+
inet6_unicast_teardown_timeout_prefix_limit: {family/inet6/unicast/prefix-limit/teardown/idle-timeout/timeout: int}
261+
inet6_unicast_novalidate_prefix_limit: {family/inet6/unicast/prefix-limit/no-validate: int}
262+
inet6_flow_limit_prefix_limit: {family/inet6/flow/prefix-limit/maximum: int}
263+
inet6_flow_teardown_threshold_prefix_limit: {family/inet6/flow/prefix-limit/teardown/limit-threshold: int}
264+
inet6_flow_teardown_timeout_prefix_limit: {family/inet6/flow/prefix-limit/teardown/idle-timeout/timeout: int}
265+
inet6_flow_novalidate_prefix_limit: {family/inet6/flow/prefix-limit/no-validate: unicode}
264266

265267
junos_bgp_config_peers_table:
266-
get: protocols/bgp/group/neighbor
268+
item: neighbor
269+
key: name
267270
view: junos_bgp_config_peers_view
268271

269272
junos_bgp_config_peers_view:
270273
fields:
271-
group: ../name
272-
description: description
273-
import_policy: import
274-
export_policy: export
275-
local_address: neighbor/local-address
276-
local_as: local-as
277-
remote_as: peer-as
278-
authentication_key: authentication_key
279-
inet_unicast_limit_prefix_limit: family/inet/unicast/prefix-limit/maximum
280-
inet_unicast_teardown_threshold_prefix_limit: family/inet/unicast/prefix-limit/teardown/limit-threshold
281-
inet_unicast_teardown_timeout_prefix_limit: family/inet/unicast/prefix-limit/teardown/idle-timeout/timeout
282-
inet_unicast_novalidate_prefix_limit: family/inet/unicast/prefix-limit/no-validate
283-
inet_flow_limit_prefix_limit: family/inet/flow/prefix-limit/maximum
284-
inet_flow_teardown_threshold_prefix_limit: family/inet/flow/prefix-limit/teardown/limit-threshold
285-
inet_flow_teardown_timeout_prefix_limit: family/inet/flow/prefix-limit/teardown/idle-timeout/timeout
286-
inet_flow_novalidate_prefix_limit: family/inet/flow/prefix-limit/no-validate
287-
inet6_unicast_limit_prefix_limit: family/inet6/unicast/prefix-limit/maximum
288-
inet6_unicast_teardown_threshold_prefix_limit: family/inet6/unicast/prefix-limit/teardown/limit-threshold
289-
inet6_unicast_teardown_timeout_prefix_limit: family/inet6/unicast/prefix-limit/teardown/idle-timeout/timeout
290-
inet6_unicast_novalidate_prefix_limit: family/inet6/unicast/prefix-limit/no-validate
291-
inet6_flow_limit_prefix_limit: family/inet6/flow/prefix-limit/maximum
292-
inet6_flow_teardown_threshold_prefix_limit: family/inet6/flow/prefix-limit/teardown/limit-threshold
293-
inet6_flow_teardown_timeout_prefix_limit: family/inet6/flow/prefix-limit/teardown/idle-timeout/timeout
294-
inet6_flow_novalidate_prefix_limit: family/inet6/flow/prefix-limit/no-validate
274+
description: {description: unicode}
275+
import_policy: {import: unicode}
276+
export_policy: {export: unicode}
277+
local_address: {local-address: unicode}
278+
local_as: {ocal-as: int}
279+
remote_as: {peer-as: int}
280+
authentication_key: {authentication_key: unicode}
281+
inet_unicast_limit_prefix_limit: {family/inet/unicast/prefix-limit/maximum: int}
282+
inet_unicast_teardown_threshold_prefix_limit: {family/inet/unicast/prefix-limit/teardown/limit-threshold: int}
283+
inet_unicast_teardown_timeout_prefix_limit: {family/inet/unicast/prefix-limit/teardown/idle-timeout/timeout: int}
284+
inet_unicast_novalidate_prefix_limit: {family/inet/unicast/prefix-limit/no-validate: int}
285+
inet_flow_limit_prefix_limit: {family/inet/flow/prefix-limit/maximum: int}
286+
inet_flow_teardown_threshold_prefix_limit: {family/inet/flow/prefix-limit/teardown/limit-threshold: int}
287+
inet_flow_teardown_timeout_prefix_limit: {family/inet/flow/prefix-limit/teardown/idle-timeout/timeout: int}
288+
inet_flow_novalidate_prefix_limit: {family/inet/flow/prefix-limit/no-validate: unicode}
289+
inet6_unicast_limit_prefix_limit: {family/inet6/unicast/prefix-limit/maximum: int}
290+
inet6_unicast_teardown_threshold_prefix_limit: {family/inet6/unicast/prefix-limit/teardown/limit-threshold: int}
291+
inet6_unicast_teardown_timeout_prefix_limit: {family/inet6/unicast/prefix-limit/teardown/idle-timeout/timeout: int}
292+
inet6_unicast_novalidate_prefix_limit: {family/inet6/unicast/prefix-limit/no-validate: int}
293+
inet6_flow_limit_prefix_limit: {family/inet6/flow/prefix-limit/maximum: int}
294+
inet6_flow_teardown_threshold_prefix_limit: {family/inet6/flow/prefix-limit/teardown/limit-threshold: int}
295+
inet6_flow_teardown_timeout_prefix_limit: {family/inet6/flow/prefix-limit/teardown/idle-timeout/timeout: int}
296+
inet6_flow_novalidate_prefix_limit: {family/inet6/flow/prefix-limit/no-validate: unicode}
295297

296298
####
297299
#### BGP Neighbors and Routing Tables Stats

setup.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,10 @@
1212

1313
setup(
1414
name="napalm-junos",
15-
version="0.4.0",
15+
version="0.4.1",
1616
packages=find_packages(),
17-
author="David Barroso",
18-
author_email="[email protected]",
17+
author="David Barroso, Mircea Ulinic",
18+
1919
description="Network Automation and Programmability Abstraction Layer with Multivendor support",
2020
classifiers=[
2121
'Topic :: Utilities',

0 commit comments

Comments
 (0)