def test_learn_config(self): testbed = Testbed() dev = Device(testbed=testbed, name='PE1', os='nxos') dev.custom = {'abstraction': {'order': ['os'], 'context': 'cli'}} golden_output = { 'return_value': ''' R2# show run vrf vni_10100 | sec '^vrf' vrf context vni_10100 vni 10100 rd auto address-family ipv4 unicast route-target both auto route-target both auto mvpn route-target both auto evpn ''' } vrf = Vrf('vni_10100') # Return outputs above as inputs to parser when called dev.execute = Mock(**golden_output) vrf.device_attr[dev] learn = Vrf.learn_config(device=dev) if learn: self.assertEqual(learn[0].device_attr[dev].address_family_attr['ipv4 unicast'].\ route_target_attr['auto'].protocol_attr['mvpn'].rt_mvpn, True)
def test_learn_config(self): Genie.testbed = testbed = Testbed() dev1 = Device(testbed=testbed, name='PE1', os='nxos') dev1.custom = {'abstraction':{'order':['os'], 'context':'cli'}} dev2 = Device(testbed=testbed, name='PE2', os='nxos') golden_output = {'return_value': ''' pinxdt-n9kv-3# show run bgp !Command: show running-config bgp !Time: Wed Jun 28 06:23:27 2017 version 7.0(3)I7(1) feature bgp router bgp 333 dynamic-med-interval 70 shutdown cluster-id 3 no graceful-restart flush-routes isolate disable-policy-batching ipv4 prefix-list s no enforce-first-as event-history objstore size large address-family ipv4 multicast dampening 1 10 30 2 redistribute static route-map PERMIT_ALL_RM address-family ipv6 multicast dampening 1 10 30 2 redistribute static route-map PERMIT_ALL_RM address-family ipv6 unicast dampening 1 10 30 2 redistribute static route-map PERMIT_ALL_RM inject-map ORIGINATE_IPV6 exist-map INJECTED_IPV6 copy-attributes nexthop route-map test address-family vpnv4 unicast dampening route-map PASS-ALL nexthop trigger-delay critical 4 non-critical 5 address-family vpnv6 unicast dampening 1 10 30 2 address-family ipv4 labeled-unicast template peer-session PEER-SESSION ebgp-multihop 3 neighbor fec1::1002 remote-as 333 address-family ipv4 unicast send-community send-community extended route-reflector-client soft-reconfiguration inbound always neighbor fec1::2002 remote-as 888 address-family ipv4 unicast send-community send-community extended soft-reconfiguration inbound always address-family ipv6 multicast send-community send-community extended soft-reconfiguration inbound always address-family ipv6 unicast send-community send-community extended soft-reconfiguration inbound always neighbor 4.4.4.4 capability suppress 4-byte-as address-family vpnv6 unicast send-community send-community extended soft-reconfiguration inbound always maximum-prefix 300000 neighbor 21.0.101.1 remote-as 333 address-family ipv4 multicast send-community send-community extended route-reflector-client soft-reconfiguration inbound always address-family ipv4 unicast send-community send-community extended route-reflector-client soft-reconfiguration inbound always address-family ipv6 multicast send-community send-community extended route-reflector-client soft-reconfiguration inbound always address-family ipv6 unicast send-community send-community extended route-reflector-client soft-reconfiguration inbound always address-family vpnv4 unicast send-community send-community extended route-reflector-client address-family vpnv6 unicast send-community send-community extended route-reflector-client neighbor 21.0.102.1 remote-as 333 update-source loopback0 address-family ipv4 multicast send-community send-community extended route-reflector-client soft-reconfiguration inbound always address-family ipv4 unicast send-community send-community extended route-reflector-client soft-reconfiguration inbound always address-family ipv6 multicast send-community send-community extended route-reflector-client soft-reconfiguration inbound always address-family ipv6 unicast send-community send-community extended route-reflector-client soft-reconfiguration inbound always address-family vpnv4 unicast send-community send-community extended address-family vpnv6 unicast send-community send-community extended route-reflector-client neighbor 21.0.201.1 remote-as 888 address-family ipv4 multicast send-community send-community extended soft-reconfiguration inbound always address-family ipv4 unicast send-community send-community extended soft-reconfiguration inbound always address-family ipv6 multicast send-community send-community extended soft-reconfiguration inbound always address-family ipv6 unicast send-community send-community extended soft-reconfiguration inbound always address-family vpnv4 unicast send-community send-community extended address-family vpnv6 unicast send-community send-community extended vrf ac bestpath always-compare-med address-family ipv4 unicast neighbor 2.2.2.2 bfd local-as 222 description ja remove-private-as disable-connected-check capability suppress 4-byte-as address-family ipv4 unicast allowas-in 3 send-community send-community extended maximum-prefix 2 vrf management neighbor 5.5.5.5 password 3 386c0565965f89de vrf vpn1 address-family ipv4 multicast redistribute static route-map PERMIT_ALL_RM address-family ipv4 unicast dampening 1 10 30 2 redistribute static route-map PERMIT_ALL_RM address-family ipv6 multicast dampening 1 10 30 2 redistribute static route-map PERMIT_ALL_RM address-family ipv6 unicast dampening 1 10 30 2 redistribute static route-map PERMIT_ALL_RM vrf context vpn1 rd 1:100 address-family ipv4 unicast route-target import 100:1 route-target export 100:1 route-target export 400:400 export map PERMIT_ALL_RM import map PERMIT_ALL_RM import vrf default map PERMIT_ALL_RM export vrf default map PERMIT_ALL_RM address-family ipv6 unicast route-target import 1:100 route-target export 1:100 route-target export 600:600 export map PERMIT_ALL_RM import map PERMIT_ALL_RM import vrf default map PERMIT_ALL_RM export vrf default map PERMIT_ALL_RM vrf context vpn2 rd 2:100 address-family ipv4 unicast route-target import 400:400 address-family ipv6 unicast route-target import 600:600 '''} bgp = Bgp(asn=333, bgp_id=333) dev1.execute = Mock(**golden_output) bgp.device_attr[dev1] bgp.device_attr[dev1].enabled = True bgp.device_attr[dev1].vrf_attr[None].cluster_id = '3' af_name = 'ipv6 unicast' bgp.device_attr[dev1].vrf_attr[None].address_family_attr[af_name] bgp.device_attr[dev1].vrf_attr[None].address_family_attr[af_name].\ af_nexthop_route_map = 'test' neighbor_id = '4.4.4.4' bgp.device_attr[dev1].vrf_attr[None].add_neighbor(neighbor_id) bgp.device_attr[dev1].vrf_attr[None].neighbor_attr[neighbor_id].\ nbr_suppress_four_byte_as_capability = True nbr_af_name = 'vpnv6 unicast' bgp.device_attr[dev1].vrf_attr[None].neighbor_attr[neighbor_id].\ address_family_attr[nbr_af_name] bgp.device_attr[dev1].vrf_attr[None].neighbor_attr[neighbor_id].\ address_family_attr[nbr_af_name].\ nbr_af_maximum_prefix_max_prefix_no = 300000 cfgs = bgp.build_config(apply=False) # List of BGP conf objects representing the different instances # For NXOS, it is only one. learn = Bgp.learn_config(device=dev1) # Testing cluster_id self.assertEqual(learn[0].device_attr[dev1].vrf_attr['default'].\ cluster_id,bgp.device_attr[dev1].vrf_attr['default'].cluster_id) # Testing af_nexthop_route_map self.assertEqual(learn[0].device_attr[dev1].vrf_attr['default'].\ address_family_attr['ipv6 unicast'].af_nexthop_route_map, bgp.device_attr[dev1].vrf_attr['default'].address_family_attr\ ['ipv6 unicast'].af_nexthop_route_map) # Testing nbr_suppress_four_byte_as_capability self.assertEqual(learn[0].device_attr[dev1].vrf_attr['default'].\ neighbor_attr['4.4.4.4'].nbr_suppress_four_byte_as_capability, bgp.device_attr[dev1].vrf_attr['default'].neighbor_attr['4.4.4.4']\ .nbr_suppress_four_byte_as_capability) # Testing nbr_af_maximum_prefix_max_prefix_no self.assertEqual(learn[0].device_attr[dev1].vrf_attr['default'].\ neighbor_attr['4.4.4.4'].address_family_attr[nbr_af_name].\ nbr_af_maximum_prefix_max_prefix_no, bgp.device_attr[dev1].\ vrf_attr['default'].neighbor_attr['4.4.4.4'].address_family_attr\ [nbr_af_name].nbr_af_maximum_prefix_max_prefix_no)
def test_learn_config(self): testbed = Testbed() dev = Device(testbed=testbed, name='PE2', os='nxos') dev.custom = {'abstraction': {'order': ['os'], 'context': 'cli'}} dev.mapping = {} dev.mapping['cli'] = 'cli' # Give the device as a connection type # This is done in order to call the parser on the output provided dev.connectionmgr.connections['cli'] = dev golden_output = { 'return_value': ''' N95_2_R2# show run pim !Command: show running-config pim !Time: Wed Aug 15 14:45:52 2018 version 7.0(3)I7(3) feature pim ip pim bsr bsr-candidate loopback0 priority 128 ip pim rp-address 6.6.6.6 group-list 234.0.0.0/8 ip pim rp-address 6.6.6.6 group-list 239.1.1.0/24 bidir ip pim rp-address 26.26.26.26 group-list 237.0.0.0/8 ip pim rp-address 126.126.126.126 group-list 238.0.0.0/8 ip pim bsr rp-candidate loopback0 group-list 235.0.0.0/8 priority 128 ip pim send-rp-announce loopback0 group-list 236.0.0.0/8 ip pim send-rp-discovery loopback0 ip pim ssm range 232.0.0.0/8 ip pim anycast-rp 126.126.126.126 2.2.2.2 ip pim anycast-rp 126.126.126.126 6.6.6.6 ip pim bsr forward listen ip pim register-source loopback0 vrf context VRF1 ip pim bsr bsr-candidate loopback11 priority 128 ip pim rp-address 6.6.6.6 group-list 234.0.0.0/8 ip pim rp-address 6.6.6.6 group-list 239.1.1.0/24 bidir ip pim rp-address 26.26.26.26 group-list 237.0.0.0/8 ip pim rp-address 126.126.126.126 group-list 238.0.0.0/8 ip pim bsr rp-candidate loopback11 group-list 235.0.0.0/8 priority 128 ip pim send-rp-announce loopback11 group-list 236.0.0.0/8 ip pim send-rp-discovery loopback11 ip pim ssm range 232.0.0.0/8 ip pim anycast-rp 126.126.126.126 2.2.2.2 ip pim anycast-rp 126.126.126.126 6.6.6.6 ip pim bsr forward listen ip pim register-source loopback11 interface loopback0 ip pim sparse-mode ''' } golden_output_vrf = ''' N95_2_R2# show run pim | inc vrf vrf context VRF1 ''' golden_output_vrf6 = ''' N95_2_R2# show run pim6 | inc vrf vrf context VRF1 ''' golden_output_feature = ''' N95_2_R2# show run pim | inc feature feature pim ''' golden_output_feature6 = ''' N95_2_R2# show run pim6 | inc feature feature pim6 ''' golden_output_auto_rp = ''' N95_2_R2# show run pim | sec '^i' | inc send-rp-announce ip pim send-rp-announce loopback0 group-list 236.0.0.0/8 ''' golden_output_auto_rp_vrf = ''' N95_2_R2# show run pim | sec VRF1 | inc send-rp-announce ip pim send-rp-announce loopback11 group-list 236.0.0.0/8 ''' pim = Pim() outputs[ 'show running-config pim | inc feature'] = golden_output_feature outputs[ 'show running-config pim6 | inc feature'] = golden_output_feature6 outputs['show running-config pim | inc vrf'] = golden_output_vrf outputs['show running-config pim6 | inc vrf'] = golden_output_vrf6 outputs[ "show running-config pim | sec '^i' | inc send-rp-announce"] = golden_output_auto_rp outputs[ "show running-config pim | sec VRF1 | inc send-rp-announce"] = golden_output_auto_rp_vrf # Return outputs above as inputs to parser when called dev.execute = Mock() dev.execute.side_effect = mapper learn = Pim.learn_config( device=dev, attributes=[ 'pim[vrf_attr][default][address_family_attr][ipv4][send_rp_announce_intf]' ]) self.assertEqual( learn[0].device_attr[dev].vrf_attr['default']. address_family_attr['ipv4'].send_rp_announce_intf, 'loopback0') self.assertEqual( learn[0].device_attr[dev].vrf_attr['default']. address_family_attr['ipv4'].send_rp_announce_group_list, None) learn = Pim.learn_config(device=dev) self.assertEqual( learn[0].device_attr[dev].vrf_attr['default']. address_family_attr['ipv4'].send_rp_announce_intf, 'loopback0') self.assertEqual( learn[0].device_attr[dev].vrf_attr['default']. address_family_attr['ipv4'].send_rp_announce_group_list, '236.0.0.0/8') self.assertEqual( learn[0].device_attr[dev].vrf_attr['VRF1']. address_family_attr['ipv4'].send_rp_announce_intf, 'loopback11') self.assertEqual( learn[0].device_attr[dev].vrf_attr['VRF1']. address_family_attr['ipv4'].send_rp_announce_group_list, '236.0.0.0/8')
def test_learn_config(self): testbed = Testbed() dev = Device(testbed=testbed, name='PE2', os='nxos') dev.custom = {'abstraction': {'order': ['os'], 'context': 'cli'}} dev.mapping = {} dev.mapping['cli'] = 'cli' # Give the device as a connection type # This is done in order to call the parser on the output provided dev.connectionmgr.connections['cli'] = dev golden_output = { 'return_value': ''' N95_2_R2# show run msdp !Command: show running-config msdp !Time: Mon Aug 27 20:17:11 2018 version 7.0(3)I7(3) feature msdp ip msdp description 6.6.6.6 test description ip msdp keepalive 6.6.6.6 50 60 ip msdp reconnect-interval 15 vrf context VRF1 ip msdp description 6.6.6.6 test description on VRF1 ''' } golden_output_vrf = ''' N95_2_R2# show run pim | inc vrf vrf context VRF1 ''' golden_output_reconnect = ''' N95_2_R2# show run msdp | sec '^i' | inc reconnect-interval ip msdp reconnect-interval 15 ''' golden_output_reconnect_vrf = ''' N95_2_R2# show run msdp | sec VRF1 | inc reconnect-interval ''' golden_output_description = ''' N95_2_R2# show run msdp | sec '^i | inc description ip msdp description 6.6.6.6 test description ''' golden_output_description_vrf = ''' N95_2_R2# show run msdp | sec VRF1 | inc description ip msdp description 6.6.6.6 test description on VRF1 ''' golden_output_keepalive = ''' N95_2_R2# show run msdp | sec '^i' | inc keepalive ip msdp keepalive 6.6.6.6 50 60 ''' golden_output_keepalive_vrf = ''' N95_2_R2# show run msdp | sec VRF1 | inc keepalive ''' golden_output_originator_id = ''' N95_2_R2# show run msdp | sec '^i' | inc originator-id ip msdp originator-id loopback0 ''' golden_output_originator_id_vrf = ''' N95_2_R2# show run msdp | sec VRF1 | inc originator-id ip msdp originator-id loopback11 ''' golden_output_connect_source = ''' N95_2_R2# show run msdp | sec '^i' | inc originator-id ip msdp peer 6.6.6.6 connect-source loopback0 ''' golden_output_connect_source_vrf = ''' N95_2_R2# show run msdp | sec VRF1 | inc originator-id ip msdp peer 6.6.6.6 connect-source loopback11 remote-as 234 ''' msdp = Msdp() outputs['show running-config msdp | inc vrf'] = golden_output_vrf outputs[ "show running-config msdp | sec '^i' | inc reconnect-interval"] = golden_output_reconnect outputs[ "show running-config msdp | sec VRF1 | inc reconnect-interval"] = golden_output_reconnect_vrf outputs[ "show running-config msdp | sec '^i' | inc description"] = golden_output_description outputs[ "show running-config msdp | sec VRF1 | inc description"] = golden_output_description_vrf outputs[ "show running-config msdp | sec '^i' | inc keepalive"] = golden_output_keepalive outputs[ "show running-config msdp | sec VRF1 | inc keepalive"] = golden_output_keepalive_vrf outputs[ "show running-config msdp | sec '^i' | inc originator-id"] = golden_output_originator_id outputs[ "show running-config msdp | sec VRF1 | inc originator-id"] = golden_output_originator_id_vrf outputs[ "show running-config msdp | sec '^i' | inc connect-source"] = golden_output_connect_source outputs[ "show running-config msdp | sec VRF1 | inc connect-source"] = golden_output_connect_source_vrf # Return outputs above as inputs to parser when called dev.execute = Mock() dev.execute.side_effect = mapper learn = Msdp.learn_config( device=dev, attributes=[ 'msdp[vrf_attr][default][peer_attr][(.*)][description]' ]) self.assertEqual(learn[0].device_attr[dev].vrf_attr['default']\ .peer_attr['6.6.6.6'].description, 'test description') self.assertEqual(learn[0].device_attr[dev].vrf_attr['default']\ .peer_attr['6.6.6.6'].keepalive_interval, None) learn = Msdp.learn_config(device=dev) self.assertEqual(learn[0].device_attr[dev].vrf_attr['default']\ .peer_attr['6.6.6.6'].keepalive_interval, 50) self.assertEqual(learn[0].device_attr[dev].vrf_attr['default']\ .peer_attr['6.6.6.6'].holdtime_interval, 60) self.assertEqual(learn[0].device_attr[dev].vrf_attr['VRF1']\ .peer_attr['6.6.6.6'].description, 'test description on VRF1') self.assertEqual(learn[0].device_attr[dev].vrf_attr['default']\ .peer_attr['6.6.6.6'].description, 'test description') self.assertEqual(learn[0].device_attr[dev].vrf_attr['default']\ .originating_rp, 'loopback0') self.assertEqual(learn[0].device_attr[dev].vrf_attr['VRF1']\ .originating_rp, 'loopback11') self.assertEqual(learn[0].device_attr[dev].vrf_attr['default']\ .peer_attr['6.6.6.6'].connected_source, 'loopback0') self.assertEqual(learn[0].device_attr[dev].vrf_attr['VRF1']\ .peer_attr['6.6.6.6'].connected_source, 'loopback11') self.assertEqual(learn[0].device_attr[dev].vrf_attr['VRF1']\ .peer_attr['6.6.6.6'].peer_as, '234') self.assertEqual(learn[0].device_attr[dev].vrf_attr['default']\ .global_connect_retry_interval, 15)