ldpd: adding topotests for the LDP IGP Sync feature

Signed-off-by: Lynne Morrison <lynne@voltanet.io>
Signed-off-by: Karen Schoener <karen@voltanet.io>
This commit is contained in:
Karen Schoener 2020-07-22 12:18:29 -04:00 committed by lynne
parent e1894ff70f
commit 1fe192228b
121 changed files with 4229 additions and 0 deletions

View File

@ -0,0 +1,12 @@
log file zebra.log
!
hostname ce1
!
interface ce1-eth0
ip address 172.16.1.1/24
no link-detect
!
ip forwarding
!
line vty
!

View File

@ -0,0 +1,12 @@
log file zebra.log
!
hostname ce2
!
interface ce2-eth0
ip address 172.16.1.2/24
no link-detect
!
ip forwarding
!
line vty
!

View File

@ -0,0 +1,12 @@
log file zebra.log
!
hostname ce3
!
interface ce3-eth0
ip address 172.16.1.3/24
no link-detect
!
ip forwarding
!
line vty
!

View File

@ -0,0 +1,26 @@
hostname r1
log file isisd.log
debug isis adj-packets
debug isis events
debug isis update-packets
debug isis ldp-sync
!
router isis 1
net 10.0000.0000.0000.0000.0000.0000.0000.0000.0001.00
metric-style wide
redistribute ipv4 connected level-1
redistribute ipv6 connected level-1
mpls ldp-sync
!
interface r1-eth1
ip router isis 1
ipv6 router isis 1
isis network point-to-point
isis circuit-type level-1
!
interface r1-eth2
ip router isis 1
ipv6 router isis 1
isis network point-to-point
isis circuit-type level-1
!

View File

@ -0,0 +1,33 @@
hostname r1
log file ldpd.log
!
debug mpls ldp zebra
debug mpls ldp event
debug mpls ldp errors
debug mpls ldp sync
!
mpls ldp
router-id 1.1.1.1
!
address-family ipv4
discovery transport-address 1.1.1.1
label local allocate host-routes
!
ttl-security disable
!
interface r1-eth1
!
interface r1-eth2
!
!
!
l2vpn CUST_A type vpls
member interface r1-eth0
!
member pseudowire r1-mpw0
neighbor lsr-id 2.2.2.2
pw-id 100
!
!
line vty
!

View File

@ -0,0 +1,143 @@
{
"1.1.1.1\/32":[
{
"prefix":"1.1.1.1\/32",
"protocol":"connected",
"selected":true,
"nexthops":[
{
"fib":true,
"directlyConnected":true,
"interfaceIndex":1,
"interfaceName":"lo",
"active":true
}
]
}
],
"2.2.2.2\/32":[
{
"prefix":"2.2.2.2\/32",
"protocol":"isis",
"selected":true,
"distance":115,
"metric":10,
"nexthops":[
{
"fib":true,
"ip":"10.0.1.2",
"afi":"ipv4",
"interfaceIndex":3,
"interfaceName":"r1-eth1",
"active":true
}
]
}
],
"3.3.3.3\/32":[
{
"prefix":"3.3.3.3\/32",
"protocol":"isis",
"selected":true,
"distance":115,
"metric":10,
"nexthops":[
{
"fib":true,
"ip":"10.0.2.3",
"afi":"ipv4",
"interfaceIndex":4,
"interfaceName":"r1-eth2",
"active":true
}
]
}
],
"10.0.1.0\/24":[
{
"prefix":"10.0.1.0\/24",
"protocol":"isis",
"distance":115,
"metric":10,
"nexthops":[
{
"ip":"10.0.1.2",
"afi":"ipv4",
"interfaceIndex":3,
"interfaceName":"r1-eth1"
}
]
},
{
"prefix":"10.0.1.0\/24",
"protocol":"connected",
"selected":true,
"nexthops":[
{
"fib":true,
"directlyConnected":true,
"interfaceIndex":3,
"interfaceName":"r1-eth1",
"active":true
}
]
}
],
"10.0.2.0\/24":[
{
"prefix":"10.0.2.0\/24",
"protocol":"isis",
"distance":115,
"metric":10,
"nexthops":[
{
"ip":"10.0.2.3",
"afi":"ipv4",
"interfaceIndex":4,
"interfaceName":"r1-eth2"
}
]
},
{
"prefix":"10.0.2.0\/24",
"protocol":"connected",
"selected":true,
"nexthops":[
{
"fib":true,
"directlyConnected":true,
"interfaceIndex":4,
"interfaceName":"r1-eth2",
"active":true
}
]
}
],
"10.0.3.0\/24":[
{
"prefix":"10.0.3.0\/24",
"protocol":"isis",
"selected":true,
"distance":115,
"metric":10,
"nexthops":[
{
"fib":true,
"ip":"10.0.1.2",
"afi":"ipv4",
"interfaceIndex":3,
"interfaceName":"r1-eth1",
"active":true
},
{
"fib":true,
"ip":"10.0.2.3",
"afi":"ipv4",
"interfaceIndex":4,
"interfaceName":"r1-eth2",
"active":true
}
]
}
]
}

View File

@ -0,0 +1,16 @@
{
"1": {
"r1-eth1": [
{
"level": "Level-1",
"metric": "10"
}
],
"r1-eth2": [
{
"level": "Level-1",
"metric": "10"
}
]
}
}

View File

@ -0,0 +1,16 @@
{
"1": {
"r1-eth1": [
{
"level": "Level-1",
"metric": "16777214"
}
],
"r1-eth2": [
{
"level": "Level-1",
"metric": "10"
}
]
}
}

View File

@ -0,0 +1,16 @@
{
"1": {
"r1-eth1": [
{
"level": "Level-1",
"metric": "16777214"
}
],
"r1-eth2": [
{
"level": "Level-1",
"metric": "10"
}
]
}
}

View File

@ -0,0 +1,13 @@
{
"r1-eth1":{
"ldpIgpSyncEnabled":true,
"holdDownTimeInSec":0,
"ldpIgpSyncState":"Sync achieved"
},
"r1-eth2":{
"ldpIgpSyncEnabled":true,
"holdDownTimeInSec":0,
"ldpIgpSyncState":"Sync achieved"
}
}

View File

@ -0,0 +1,13 @@
{
"r1-eth1":{
"ldpIgpSyncEnabled":true,
"holdDownTimeInSec":0,
"ldpIgpSyncState":"Sync not achieved"
},
"r1-eth2":{
"ldpIgpSyncEnabled":true,
"holdDownTimeInSec":0,
"ldpIgpSyncState":"Sync achieved"
}
}

View File

@ -0,0 +1,13 @@
{
"r1-eth1":{
"ldpIgpSyncEnabled":true,
"holdDownTimeInSec":0,
"ldpIgpSyncState":"Sync not achieved"
},
"r1-eth2":{
"ldpIgpSyncEnabled":true,
"holdDownTimeInSec":0,
"ldpIgpSyncState":"Sync achieved"
}
}

View File

@ -0,0 +1,16 @@
{
"2.2.2.2: 100":{
"destination":"2.2.2.2",
"vcId":100,
"localLabel":16,
"localControlWord":1,
"localVcType":"Ethernet",
"localGroupID":0,
"localIfMtu":1500,
"remoteLabel":16,
"remoteControlWord":1,
"remoteVcType":"Ethernet",
"remoteGroupID":0,
"remoteIfMtu":1500
}
}

View File

@ -0,0 +1,8 @@
{
"r1-mpw0":{
"peerId":"2.2.2.2",
"vcId":100,
"VpnName":"CUST_A",
"status":"up"
}
}

View File

@ -0,0 +1,44 @@
{
"bindings":[
{
"addressFamily":"ipv4",
"prefix":"1.1.1.1/32",
"neighborId":"2.2.2.2",
"localLabel":"imp-null",
"inUse":0
},
{
"addressFamily":"ipv4",
"prefix":"1.1.1.1/32",
"neighborId":"3.3.3.3",
"localLabel":"imp-null",
"inUse":0
},
{
"addressFamily":"ipv4",
"prefix":"2.2.2.2/32",
"neighborId":"2.2.2.2",
"remoteLabel":"imp-null",
"inUse":1
},
{
"addressFamily":"ipv4",
"prefix":"2.2.2.2/32",
"neighborId":"3.3.3.3",
"inUse":0
},
{
"addressFamily":"ipv4",
"prefix":"3.3.3.3/32",
"neighborId":"2.2.2.2",
"inUse":0
},
{
"addressFamily":"ipv4",
"prefix":"3.3.3.3/32",
"neighborId":"3.3.3.3",
"remoteLabel":"imp-null",
"inUse":1
}
]
}

View File

@ -0,0 +1,25 @@
{
"adjacencies":[
{
"addressFamily":"ipv4",
"neighborId":"2.2.2.2",
"type":"link",
"interface":"r1-eth1",
"helloHoldtime":15
},
{
"addressFamily":"ipv4",
"neighborId":"2.2.2.2",
"type":"targeted",
"peer":"2.2.2.2",
"helloHoldtime":45
},
{
"addressFamily":"ipv4",
"neighborId":"3.3.3.3",
"type":"link",
"interface":"r1-eth2",
"helloHoldtime":15
}
]
}

View File

@ -0,0 +1,16 @@
{
"r1-eth1":{
"state":"labelExchangeComplete",
"waitTime":10,
"waitTimeRemaining":0,
"timerRunning":false,
"peerLdpId":"2.2.2.2"
},
"r1-eth2":{
"state":"labelExchangeComplete",
"waitTime":10,
"waitTimeRemaining":0,
"timerRunning":false,
"peerLdpId":"3.3.3.3"
}
}

View File

@ -0,0 +1,16 @@
{
"r1-eth1":{
"state":"labelExchangeNotComplete",
"waitTime":10,
"waitTimeRemaining":0,
"timerRunning":false,
"peerLdpId":""
},
"r1-eth2":{
"state":"labelExchangeComplete",
"waitTime":10,
"waitTimeRemaining":0,
"timerRunning":false,
"peerLdpId":"3.3.3.3"
}
}

View File

@ -0,0 +1,16 @@
{
"neighbors":[
{
"addressFamily":"ipv4",
"neighborId":"2.2.2.2",
"state":"OPERATIONAL",
"transportAddress":"2.2.2.2"
},
{
"addressFamily":"ipv4",
"neighborId":"3.3.3.3",
"state":"OPERATIONAL",
"transportAddress":"3.3.3.3"
}
]
}

View File

@ -0,0 +1,42 @@
{
"frr-interface:lib": {
"interface": [
{
"name": "r1-eth1",
"vrf": "default",
"state": {
"frr-isisd:isis": {
"adjacencies": {
"adjacency": [
{
"neighbor-sys-type": "level-1",
"neighbor-sysid": "0000.0000.0002",
"neighbor-extended-circuit-id": 0,
"state": "up"
}
]
}
}
}
},
{
"name": "r1-eth2",
"vrf": "default",
"state": {
"frr-isisd:isis": {
"adjacencies": {
"adjacency": [
{
"neighbor-sys-type": "level-1",
"neighbor-sysid": "0000.0000.0003",
"neighbor-extended-circuit-id": 0,
"state": "up"
}
]
}
}
}
}
]
}
}

View File

@ -0,0 +1,29 @@
log file zebra.log
!
hostname r1
!
debug zebra kernel
debug zebra rib detailed
debug zebra dplane detailed
debug zebra nht
debug zebra pseudowires
debug zebra mpls
!
interface lo
ip address 1.1.1.1/32
!
interface r1-eth0
description to s1
!
interface r1-eth1
description to s4
ip address 10.0.1.1/24
!
interface r1-eth2
description to s5
ip address 10.0.2.1/24
!
ip forwarding
!
line vty
!

View File

@ -0,0 +1,27 @@
hostname r2
log file isisd.log
debug isis adj-packets
debug isis events
debug isis update-packets
debug isis ldp-sync
!
router isis 1
net 10.0000.0000.0000.0000.0000.0000.0000.0000.0002.00
metric-style wide
redistribute ipv4 connected level-1
redistribute ipv6 connected level-1
mpls ldp-sync
!
interface r2-eth1
ip router isis 1
ipv6 router isis 1
isis network point-to-point
isis circuit-type level-1
!
interface r2-eth2
ip router isis 1
ipv6 router isis 1
isis network point-to-point
isis circuit-type level-1
no isis mpls ldp-sync
!

View File

@ -0,0 +1,33 @@
hostname r2
log file ldpd.log
!
debug mpls ldp zebra
debug mpls ldp event
debug mpls ldp errors
debug mpls ldp sync
!
mpls ldp
router-id 2.2.2.2
!
address-family ipv4
discovery transport-address 2.2.2.2
label local allocate host-routes
!
ttl-security disable
!
interface r2-eth1
!
interface r2-eth2
!
!
!
l2vpn CUST_A type vpls
member interface r2-eth0
!
member pseudowire r2-mpw0
neighbor lsr-id 1.1.1.1
pw-id 100
!
!
line vty
!

View File

@ -0,0 +1,19 @@
hostname r2
log file ospfd.log
debug ospf zebra interface
debug ospf ldp-sync
!
router ospf
router-id 2.2.2.2
network 0.0.0.0/0 area 0
mpls ldp-sync
mpls ldp-sync holddown 50
!
interface r2-eth1
ip ospf network point-to-point
ip ospf mpls ldp-sync holddown 300
!
interface r2-eth2
ip ospf network point-to-point
no ip ospf mpls ldp-sync
!

View File

@ -0,0 +1,143 @@
{
"1.1.1.1\/32":[
{
"prefix":"1.1.1.1\/32",
"protocol":"isis",
"selected":true,
"distance":115,
"metric":10,
"nexthops":[
{
"fib":true,
"ip":"10.0.1.1",
"afi":"ipv4",
"interfaceIndex":3,
"interfaceName":"r2-eth1",
"active":true
}
]
}
],
"2.2.2.2\/32":[
{
"prefix":"2.2.2.2\/32",
"protocol":"connected",
"selected":true,
"nexthops":[
{
"fib":true,
"directlyConnected":true,
"interfaceIndex":1,
"interfaceName":"lo",
"active":true
}
]
}
],
"3.3.3.3\/32":[
{
"prefix":"3.3.3.3\/32",
"protocol":"isis",
"selected":true,
"distance":115,
"metric":10,
"nexthops":[
{
"fib":true,
"ip":"10.0.3.3",
"afi":"ipv4",
"interfaceIndex":4,
"interfaceName":"r2-eth2",
"active":true
}
]
}
],
"10.0.1.0\/24":[
{
"prefix":"10.0.1.0\/24",
"protocol":"isis",
"distance":115,
"metric":10,
"nexthops":[
{
"ip":"10.0.1.1",
"afi":"ipv4",
"interfaceIndex":3,
"interfaceName":"r2-eth1"
}
]
},
{
"prefix":"10.0.1.0\/24",
"protocol":"connected",
"selected":true,
"nexthops":[
{
"fib":true,
"directlyConnected":true,
"interfaceIndex":3,
"interfaceName":"r2-eth1",
"active":true
}
]
}
],
"10.0.2.0\/24":[
{
"prefix":"10.0.2.0\/24",
"protocol":"isis",
"selected":true,
"distance":115,
"metric":10,
"nexthops":[
{
"fib":true,
"ip":"10.0.1.1",
"afi":"ipv4",
"interfaceIndex":3,
"interfaceName":"r2-eth1",
"active":true
},
{
"fib":true,
"ip":"10.0.3.3",
"afi":"ipv4",
"interfaceIndex":4,
"interfaceName":"r2-eth2",
"active":true
}
]
}
],
"10.0.3.0\/24":[
{
"prefix":"10.0.3.0\/24",
"protocol":"isis",
"distance":115,
"metric":10,
"nexthops":[
{
"ip":"10.0.3.3",
"afi":"ipv4",
"interfaceIndex":4,
"interfaceName":"r2-eth2"
}
]
},
{
"prefix":"10.0.3.0\/24",
"protocol":"connected",
"selected":true,
"nexthops":[
{
"fib":true,
"directlyConnected":true,
"interfaceIndex":4,
"interfaceName":"r2-eth2",
"active":true
}
]
}
]
}

View File

@ -0,0 +1,16 @@
{
"1": {
"r2-eth1": [
{
"level": "Level-1",
"metric": "10"
}
],
"r2-eth2": [
{
"level": "Level-1",
"metric": "10"
}
]
}
}

View File

@ -0,0 +1,16 @@
{
"1": {
"r2-eth1": [
{
"level": "Level-1",
"metric": "16777214"
}
],
"r2-eth2": [
{
"level": "Level-1",
"metric": "10"
}
]
}
}

View File

@ -0,0 +1,16 @@
{
"1": {
"r2-eth1": [
{
"level": "Level-1",
"metric": "16777214"
}
],
"r2-eth2": [
{
"level": "Level-1",
"metric": "10"
}
]
}
}

View File

@ -0,0 +1,13 @@
{
"r2-eth1":{
"ldpIgpSyncEnabled":true,
"holdDownTimeInSec":0,
"ldpIgpSyncState":"Sync achieved"
},
"r2-eth2":{
"ldpIgpSyncEnabled":false,
"holdDownTimeInSec":0,
"ldpIgpSyncState":"Sync not required"
}
}

View File

@ -0,0 +1,13 @@
{
"r2-eth1":{
"ldpIgpSyncEnabled":true,
"holdDownTimeInSec":0,
"ldpIgpSyncState":"Sync not achieved"
},
"r2-eth2":{
"ldpIgpSyncEnabled":false,
"holdDownTimeInSec":0,
"ldpIgpSyncState":"Sync not required"
}
}

View File

@ -0,0 +1,13 @@
{
"r2-eth1":{
"ldpIgpSyncEnabled":true,
"holdDownTimeInSec":0,
"ldpIgpSyncState":"Sync not achieved"
},
"r2-eth2":{
"ldpIgpSyncEnabled":false,
"holdDownTimeInSec":0,
"ldpIgpSyncState":"Sync not required"
}
}

View File

@ -0,0 +1,16 @@
{
"1.1.1.1: 100":{
"destination":"1.1.1.1",
"vcId":100,
"localLabel":16,
"localControlWord":1,
"localVcType":"Ethernet",
"localGroupID":0,
"localIfMtu":1500,
"remoteLabel":16,
"remoteControlWord":1,
"remoteVcType":"Ethernet",
"remoteGroupID":0,
"remoteIfMtu":1500
}
}

View File

@ -0,0 +1,8 @@
{
"r2-mpw0":{
"peerId":"1.1.1.1",
"vcId":100,
"VpnName":"CUST_A",
"status":"up"
}
}

View File

@ -0,0 +1,44 @@
{
"bindings":[
{
"addressFamily":"ipv4",
"prefix":"1.1.1.1/32",
"neighborId":"1.1.1.1",
"remoteLabel":"imp-null",
"inUse":1
},
{
"addressFamily":"ipv4",
"prefix":"1.1.1.1/32",
"neighborId":"3.3.3.3",
"inUse":0
},
{
"addressFamily":"ipv4",
"prefix":"2.2.2.2/32",
"neighborId":"1.1.1.1",
"localLabel":"imp-null",
"inUse":0
},
{
"addressFamily":"ipv4",
"prefix":"2.2.2.2/32",
"neighborId":"3.3.3.3",
"localLabel":"imp-null",
"inUse":0
},
{
"addressFamily":"ipv4",
"prefix":"3.3.3.3/32",
"neighborId":"1.1.1.1",
"inUse":0
},
{
"addressFamily":"ipv4",
"prefix":"3.3.3.3/32",
"neighborId":"3.3.3.3",
"remoteLabel":"imp-null",
"inUse":1
}
]
}

View File

@ -0,0 +1,25 @@
{
"adjacencies":[
{
"addressFamily":"ipv4",
"neighborId":"1.1.1.1",
"type":"link",
"interface":"r2-eth1",
"helloHoldtime":15
},
{
"addressFamily":"ipv4",
"neighborId":"1.1.1.1",
"type":"targeted",
"peer":"1.1.1.1",
"helloHoldtime":45
},
{
"addressFamily":"ipv4",
"neighborId":"3.3.3.3",
"type":"link",
"interface":"r2-eth2",
"helloHoldtime":15
}
]
}

View File

@ -0,0 +1,16 @@
{
"r2-eth1":{
"state":"labelExchangeComplete",
"waitTime":10,
"waitTimeRemaining":0,
"timerRunning":false,
"peerLdpId":"1.1.1.1"
},
"r2-eth2":{
"state":"labelExchangeComplete",
"waitTime":10,
"waitTimeRemaining":0,
"timerRunning":false,
"peerLdpId":"3.3.3.3"
}
}

View File

@ -0,0 +1,16 @@
{
"r2-eth1":{
"state":"labelExchangeNotComplete",
"waitTime":10,
"waitTimeRemaining":0,
"timerRunning":false,
"peerLdpId":""
},
"r2-eth2":{
"state":"labelExchangeComplete",
"waitTime":10,
"waitTimeRemaining":0,
"timerRunning":false,
"peerLdpId":"3.3.3.3"
}
}

View File

@ -0,0 +1,16 @@
{
"r2-eth1":{
"state":"labelExchangeComplete",
"waitTime":10,
"waitTimeRemaining":0,
"timerRunning":false,
"peerLdpId":"1.1.1.1"
},
"r2-eth2":{
"state":"labelExchangeComplete",
"waitTime":10,
"waitTimeRemaining":0,
"timerRunning":false,
"peerLdpId":"3.3.3.3"
}
}

View File

@ -0,0 +1,16 @@
{
"neighbors":[
{
"addressFamily":"ipv4",
"neighborId":"1.1.1.1",
"state":"OPERATIONAL",
"transportAddress":"1.1.1.1"
},
{
"addressFamily":"ipv4",
"neighborId":"3.3.3.3",
"state":"OPERATIONAL",
"transportAddress":"3.3.3.3"
}
]
}

View File

@ -0,0 +1,42 @@
{
"frr-interface:lib": {
"interface": [
{
"name": "r2-eth1",
"vrf": "default",
"state": {
"frr-isisd:isis": {
"adjacencies": {
"adjacency": [
{
"neighbor-sys-type": "level-1",
"neighbor-sysid": "0000.0000.0001",
"neighbor-extended-circuit-id": 0,
"state": "up"
}
]
}
}
}
},
{
"name": "r2-eth2",
"vrf": "default",
"state": {
"frr-isisd:isis": {
"adjacencies": {
"adjacency": [
{
"neighbor-sys-type": "level-1",
"neighbor-sysid": "0000.0000.0003",
"neighbor-extended-circuit-id": 0,
"state": "up"
}
]
}
}
}
}
]
}
}

View File

@ -0,0 +1,28 @@
log file zebra.log
!
hostname r2
!
debug zebra rib detailed
debug zebra dplane detailed
debug zebra kernel
debug zebra nht
debug zebra pseudowires
!
interface lo
ip address 2.2.2.2/32
!
interface r2-eth0
description to s2
!
interface r2-eth1
description to s4
ip address 10.0.1.2/24
!
interface r2-eth2
description to s6
ip address 10.0.3.2/24
!
ip forwarding
!
line vty
!

View File

@ -0,0 +1,28 @@
hostname r3
log file isisd.log
debug isis adj-packets
debug isis events
debug isis update-packets
debug isis ldp-sync
!
router isis 1
net 10.0000.0000.0000.0000.0000.0000.0000.0000.0003.00
metric-style wide
redistribute ipv4 connected level-1
redistribute ipv6 connected level-1
mpls ldp-sync
mpls ldp-sync holddown 50
!
interface r3-eth1
ip router isis 1
ipv6 router isis 1
isis network point-to-point
isis circuit-type level-1
no isis mpls ldp-sync
!
interface r3-eth2
ip router isis 1
ipv6 router isis 1
isis network point-to-point
isis circuit-type level-1
!

View File

@ -0,0 +1,25 @@
hostname r3
log file ldpd.log
!
debug mpls ldp zebra
debug mpls ldp event
debug mpls ldp errors
debug mpls ldp sync
!
mpls ldp
router-id 3.3.3.3
!
address-family ipv4
discovery transport-address 3.3.3.3
label local allocate host-routes
!
ttl-security disable
!
interface r3-eth1
!
interface r3-eth2
!
!
!
line vty
!

View File

@ -0,0 +1,143 @@
{
"1.1.1.1\/32":[
{
"prefix":"1.1.1.1\/32",
"protocol":"isis",
"selected":true,
"distance":115,
"metric":10,
"nexthops":[
{
"fib":true,
"ip":"10.0.2.1",
"afi":"ipv4",
"interfaceIndex":3,
"interfaceName":"r3-eth1",
"active":true
}
]
}
],
"2.2.2.2\/32":[
{
"prefix":"2.2.2.2\/32",
"protocol":"isis",
"selected":true,
"distance":115,
"metric":10,
"nexthops":[
{
"fib":true,
"ip":"10.0.3.2",
"afi":"ipv4",
"interfaceIndex":4,
"interfaceName":"r3-eth2",
"active":true
}
]
}
],
"3.3.3.3\/32":[
{
"prefix":"3.3.3.3\/32",
"protocol":"connected",
"selected":true,
"nexthops":[
{
"fib":true,
"directlyConnected":true,
"interfaceIndex":1,
"interfaceName":"lo",
"active":true
}
]
}
],
"10.0.1.0\/24":[
{
"prefix":"10.0.1.0\/24",
"protocol":"isis",
"selected":true,
"distance":115,
"metric":10,
"nexthops":[
{
"fib":true,
"ip":"10.0.2.1",
"afi":"ipv4",
"interfaceIndex":3,
"interfaceName":"r3-eth1",
"active":true
},
{
"fib":true,
"ip":"10.0.3.2",
"afi":"ipv4",
"interfaceIndex":4,
"interfaceName":"r3-eth2",
"active":true
}
]
}
],
"10.0.2.0\/24":[
{
"prefix":"10.0.2.0\/24",
"protocol":"isis",
"distance":115,
"metric":10,
"nexthops":[
{
"ip":"10.0.2.1",
"afi":"ipv4",
"interfaceIndex":3,
"interfaceName":"r3-eth1"
}
]
},
{
"prefix":"10.0.2.0\/24",
"protocol":"connected",
"selected":true,
"nexthops":[
{
"fib":true,
"directlyConnected":true,
"interfaceIndex":3,
"interfaceName":"r3-eth1",
"active":true
}
]
}
],
"10.0.3.0\/24":[
{
"prefix":"10.0.3.0\/24",
"protocol":"isis",
"distance":115,
"metric":10,
"nexthops":[
{
"ip":"10.0.3.2",
"afi":"ipv4",
"interfaceIndex":4,
"interfaceName":"r3-eth2"
}
]
},
{
"prefix":"10.0.3.0\/24",
"protocol":"connected",
"selected":true,
"nexthops":[
{
"fib":true,
"directlyConnected":true,
"interfaceIndex":4,
"interfaceName":"r3-eth2",
"active":true
}
]
}
]
}

View File

@ -0,0 +1,16 @@
{
"1": {
"r3-eth1": [
{
"level": "Level-1",
"metric": "10"
}
],
"r3-eth2": [
{
"level": "Level-1",
"metric": "10"
}
]
}
}

View File

@ -0,0 +1,16 @@
{
"1": {
"r3-eth1": [
{
"level": "Level-1",
"metric": "10"
}
],
"r3-eth2": [
{
"level": "Level-1",
"metric": "10"
}
]
}
}

View File

@ -0,0 +1,16 @@
{
"1": {
"r3-eth1": [
{
"level": "Level-1",
"metric": "10"
}
],
"r3-eth2": [
{
"level": "Level-1",
"metric": "10"
}
]
}
}

View File

@ -0,0 +1,13 @@
{
"r3-eth1":{
"ldpIgpSyncEnabled":false,
"holdDownTimeInSec":50,
"ldpIgpSyncState":"Sync not required"
},
"r3-eth2":{
"ldpIgpSyncEnabled":true,
"holdDownTimeInSec":50,
"ldpIgpSyncState":"Sync achieved"
}
}

View File

@ -0,0 +1,13 @@
{
"r3-eth1":{
"ldpIgpSyncEnabled":false,
"holdDownTimeInSec":50,
"ldpIgpSyncState":"Sync not required"
},
"r3-eth2":{
"ldpIgpSyncEnabled":true,
"holdDownTimeInSec":50,
"ldpIgpSyncState":"Sync achieved"
}
}

View File

@ -0,0 +1,13 @@
{
"r3-eth1":{
"ldpIgpSyncEnabled":false,
"holdDownTimeInSec":50,
"ldpIgpSyncState":"Sync not required"
},
"r3-eth2":{
"ldpIgpSyncEnabled":true,
"holdDownTimeInSec":50,
"ldpIgpSyncState":"Sync achieved"
}
}

View File

@ -0,0 +1,2 @@
{
}

View File

@ -0,0 +1,2 @@
{
}

View File

@ -0,0 +1,44 @@
{
"bindings":[
{
"addressFamily":"ipv4",
"prefix":"1.1.1.1/32",
"neighborId":"1.1.1.1",
"remoteLabel":"imp-null",
"inUse":1
},
{
"addressFamily":"ipv4",
"prefix":"1.1.1.1/32",
"neighborId":"2.2.2.2",
"inUse":0
},
{
"addressFamily":"ipv4",
"prefix":"2.2.2.2/32",
"neighborId":"1.1.1.1",
"inUse":0
},
{
"addressFamily":"ipv4",
"prefix":"2.2.2.2/32",
"neighborId":"2.2.2.2",
"remoteLabel":"imp-null",
"inUse":1
},
{
"addressFamily":"ipv4",
"prefix":"3.3.3.3/32",
"neighborId":"1.1.1.1",
"localLabel":"imp-null",
"inUse":0
},
{
"addressFamily":"ipv4",
"prefix":"3.3.3.3/32",
"neighborId":"2.2.2.2",
"localLabel":"imp-null",
"inUse":0
}
]
}

View File

@ -0,0 +1,18 @@
{
"adjacencies":[
{
"addressFamily":"ipv4",
"neighborId":"1.1.1.1",
"type":"link",
"interface":"r3-eth1",
"helloHoldtime":15
},
{
"addressFamily":"ipv4",
"neighborId":"2.2.2.2",
"type":"link",
"interface":"r3-eth2",
"helloHoldtime":15
}
]
}

View File

@ -0,0 +1,16 @@
{
"r3-eth1":{
"state":"labelExchangeComplete",
"waitTime":10,
"waitTimeRemaining":0,
"timerRunning":false,
"peerLdpId":"1.1.1.1"
},
"r3-eth2":{
"state":"labelExchangeComplete",
"waitTime":10,
"waitTimeRemaining":0,
"timerRunning":false,
"peerLdpId":"2.2.2.2"
}
}

View File

@ -0,0 +1,16 @@
{
"r3-eth1":{
"state":"labelExchangeComplete",
"waitTime":10,
"waitTimeRemaining":0,
"timerRunning":false,
"peerLdpId":"1.1.1.1"
},
"r3-eth2":{
"state":"labelExchangeComplete",
"waitTime":10,
"waitTimeRemaining":0,
"timerRunning":false,
"peerLdpId":"2.2.2.2"
}
}

View File

@ -0,0 +1,16 @@
{
"neighbors":[
{
"addressFamily":"ipv4",
"neighborId":"1.1.1.1",
"state":"OPERATIONAL",
"transportAddress":"1.1.1.1"
},
{
"addressFamily":"ipv4",
"neighborId":"2.2.2.2",
"state":"OPERATIONAL",
"transportAddress":"2.2.2.2"
}
]
}

View File

@ -0,0 +1,42 @@
{
"frr-interface:lib": {
"interface": [
{
"name": "r3-eth1",
"vrf": "default",
"state": {
"frr-isisd:isis": {
"adjacencies": {
"adjacency": [
{
"neighbor-sys-type": "level-1",
"neighbor-sysid": "0000.0000.0001",
"neighbor-extended-circuit-id": 0,
"state": "up"
}
]
}
}
}
},
{
"name": "r3-eth2",
"vrf": "default",
"state": {
"frr-isisd:isis": {
"adjacencies": {
"adjacency": [
{
"neighbor-sys-type": "level-1",
"neighbor-sysid": "0000.0000.0002",
"neighbor-extended-circuit-id": 0,
"state": "up"
}
]
}
}
}
}
]
}
}

View File

@ -0,0 +1,32 @@
log file zebra.log
!
hostname r3
!
debug zebra rib detailed
debug zebra dplane detailed
debug zebra kernel
debug zebra nht
debug zebra pseudowires
!
interface lo
ip address 3.3.3.3/32
!
interface r3-eth0
description to s3
!
interface r3-eth1
description to s5
ip address 10.0.2.3/24
!
interface r3-eth2
description to s6
ip address 10.0.3.3/24
!
!!interface r3-eth3
!! description to s4
!! ip address 10.0.1.3/24
!
ip forwarding
!
line vty
!

View File

@ -0,0 +1,111 @@
## Color coding:
#########################
## Main FRR: #f08080 red
## Switches: #d0e0d0 gray
## RIP: #19e3d9 Cyan
## RIPng: #fcb314 dark yellow
## OSPFv2: #32b835 Green
## OSPFv3: #19e3d9 Cyan
## ISIS IPv4 #fcb314 dark yellow
## ISIS IPv6 #9a81ec purple
## BGP IPv4 #eee3d3 beige
## BGP IPv6 #fdff00 yellow
##### Colors (see http://www.color-hex.com/)
graph template {
label="Test Topology - LDP-VPLS 1";
# Routers
ce1 [
shape=doubleoctagon,
label="ce1",
fillcolor="#f08080",
style=filled,
];
ce2 [
shape=doubleoctagon
label="ce2",
fillcolor="#f08080",
style=filled,
];
ce3 [
shape=doubleoctagon
label="ce3",
fillcolor="#f08080",
style=filled,
];
r1 [
shape=doubleoctagon,
label="r1",
fillcolor="#f08080",
style=filled,
];
r2 [
shape=doubleoctagon
label="r2",
fillcolor="#f08080",
style=filled,
];
r3 [
shape=doubleoctagon
label="r3",
fillcolor="#f08080",
style=filled,
];
# Switches
s1 [
shape=oval,
label="VPLS\n172.16.1.0/24",
fillcolor="#d0e0d0",
style=filled,
];
s2 [
shape=oval,
label="VPLS\n172.16.1.0/24",
fillcolor="#d0e0d0",
style=filled,
];
s3 [
shape=oval,
label="VPLS\n172.16.1.0/24",
fillcolor="#d0e0d0",
style=filled,
];
s4 [
shape=oval,
label="s4\n10.0.1.0/24",
fillcolor="#d0e0d0",
style=filled,
];
s5 [
shape=oval,
label="s5\n10.0.2.0/24",
fillcolor="#d0e0d0",
style=filled,
];
s6 [
shape=oval,
label="s6\n10.0.3.0/24",
fillcolor="#d0e0d0",
style=filled,
];
# Connections
ce1 -- s1 [label="eth0\n.1"];
ce2 -- s2 [label="eth0\n.2"];
ce3 -- s3 [label="eth0\n.3"];
r1 -- s1 [label="eth0"];
r1 -- s4 [label="eth1\n.1"];
r1 -- s5 [label="eth2\n.1"];
r2 -- s2 [label="eth0"];
r2 -- s4 [label="eth1\n.2"];
r2 -- s6 [label="eth2\n.2"];
r3 -- s3 [label="eth0"];
r3 -- s5 [label="eth1\n.3"];
r3 -- s6 [label="eth2\n.3"];
}

View File

@ -0,0 +1,625 @@
#!/usr/bin/env python
#
# test_ldp_isis_topo1.py
# Part of NetDEF Topology Tests
#
# Copyright (c) 2020 by Volta Networks
#
# Permission to use, copy, modify, and/or distribute this software
# for any purpose with or without fee is hereby granted, provided
# that the above copyright notice and this permission notice appear
# in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND NETDEF DISCLAIMS ALL WARRANTIES
# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NETDEF BE LIABLE FOR
# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY
# DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
# WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
# ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
# OF THIS SOFTWARE.
#
"""
test_ldp_vpls_topo1.py:
+---------+ +---------+
| | | |
| CE1 | | CE2 |
| | | |
+---------+ +---------+
ce1-eth0 (172.16.1.1/24)| |ce2-eth0 (172.16.1.2/24)
| |
| |
rt1-eth0| |rt2-eth0
+---------+ 10.0.1.0/24 +---------+
| |rt1-eth1 | |
| RT1 +----------------+ RT2 |
| 1.1.1.1 | rt2-eth1| 2.2.2.2 |
| | | |
+---------+ +---------+
rt1-eth2| |rt2-eth2
| |
| |
10.0.2.0/24| +---------+ |10.0.3.0/24
| | | |
| | RT3 | |
+--------+ 3.3.3.3 +-------+
rt3-eth2| |rt3-eth1
+---------+
|rt3-eth0
|
|
ce3-eth0 (172.16.1.3/24)|
+---------+
| |
| CE3 |
| |
+---------+
"""
import os
import re
import sys
import pytest
import json
from time import sleep
from functools import partial
# Save the Current Working Directory to find configuration files.
CWD = os.path.dirname(os.path.realpath(__file__))
sys.path.append(os.path.join(CWD, "../"))
# pylint: disable=C0413
# Import topogen and topotest helpers
from lib import topotest
from lib.topogen import Topogen, TopoRouter, get_topogen
from lib.topolog import logger
# Required to instantiate the topology builder class.
from mininet.topo import Topo
class TemplateTopo(Topo):
"Test topology builder"
def build(self, *_args, **_opts):
"Build function"
tgen = get_topogen(self)
#
# Define FRR Routers
#
for router in ["ce1", "ce2", "ce3", "r1", "r2", "r3"]:
tgen.add_router(router)
#
# Define connections
#
switch = tgen.add_switch("s1")
switch.add_link(tgen.gears["ce1"])
switch.add_link(tgen.gears["r1"])
switch = tgen.add_switch("s2")
switch.add_link(tgen.gears["ce2"])
switch.add_link(tgen.gears["r2"])
switch = tgen.add_switch("s3")
switch.add_link(tgen.gears["ce3"])
switch.add_link(tgen.gears["r3"])
switch = tgen.add_switch("s4")
switch.add_link(tgen.gears["r1"])
switch.add_link(tgen.gears["r2"])
switch = tgen.add_switch("s5")
switch.add_link(tgen.gears["r1"])
switch.add_link(tgen.gears["r3"])
switch = tgen.add_switch("s6")
switch.add_link(tgen.gears["r2"])
switch.add_link(tgen.gears["r3"])
def setup_module(mod):
"Sets up the pytest environment"
tgen = Topogen(TemplateTopo, mod.__name__)
tgen.start_topology()
router_list = tgen.routers()
# For all registered routers, load the zebra configuration file
for rname, router in router_list.iteritems():
router.load_config(
TopoRouter.RD_ZEBRA, os.path.join(CWD, "{}/zebra.conf".format(rname))
)
# Don't start isisd and ldpd in the CE nodes
if router.name[0] == "r":
router.load_config(
TopoRouter.RD_ISIS, os.path.join(CWD, "{}/isisd.conf".format(rname))
)
router.load_config(
TopoRouter.RD_LDP, os.path.join(CWD, "{}/ldpd.conf".format(rname))
)
tgen.start_router()
def teardown_module(mod):
"Teardown the pytest environment"
tgen = get_topogen()
# This function tears down the whole topology.
tgen.stop_topology()
def router_compare_json_output(rname, command, reference):
"Compare router JSON output"
logger.info('Comparing router "%s" "%s" output', rname, command)
tgen = get_topogen()
filename = "{}/{}/{}".format(CWD, rname, reference)
expected = json.loads(open(filename).read())
# Run test function until we get an result. Wait at most 80 seconds.
test_func = partial(topotest.router_json_cmp, tgen.gears[rname], command, expected)
_, diff = topotest.run_and_expect(test_func, None, count=160, wait=0.5)
assertmsg = '"{}" JSON output mismatches the expected result'.format(rname)
assert diff is None, assertmsg
def test_isis_convergence():
logger.info("Test: check ISIS adjacencies")
tgen = get_topogen()
# Skip if previous fatal error condition is raised
if tgen.routers_have_failure():
pytest.skip(tgen.errors)
for rname in ["r1", "r2", "r3"]:
router_compare_json_output(
rname,
"show yang operational-data /frr-interface:lib isisd",
"show_yang_interface_isis_adjacencies.ref")
def test_rib():
logger.info("Test: verify RIB")
tgen = get_topogen()
# Skip if previous fatal error condition is raised
if tgen.routers_have_failure():
pytest.skip(tgen.errors)
for rname in ["r1", "r2", "r3"]:
router_compare_json_output(rname, "show ip route json", "show_ip_route.ref")
def test_ldp_adjacencies():
logger.info("Test: verify LDP adjacencies")
tgen = get_topogen()
# Skip if previous fatal error condition is raised
if tgen.routers_have_failure():
pytest.skip(tgen.errors)
for rname in ["r1", "r2", "r3"]:
router_compare_json_output(
rname, "show mpls ldp discovery json", "show_ldp_discovery.ref"
)
def test_ldp_neighbors():
logger.info("Test: verify LDP neighbors")
tgen = get_topogen()
# Skip if previous fatal error condition is raised
if tgen.routers_have_failure():
pytest.skip(tgen.errors)
for rname in ["r1", "r2", "r3"]:
router_compare_json_output(
rname, "show mpls ldp neighbor json", "show_ldp_neighbor.ref"
)
def test_ldp_bindings():
logger.info("Test: verify LDP bindings")
tgen = get_topogen()
# Skip if previous fatal error condition is raised
if tgen.routers_have_failure():
pytest.skip(tgen.errors)
for rname in ["r1", "r2", "r3"]:
router_compare_json_output(
rname, "show mpls ldp binding json", "show_ldp_binding.ref"
)
def test_ldp_pwid_bindings():
logger.info("Test: verify LDP PW-ID bindings")
tgen = get_topogen()
# Skip if previous fatal error condition is raised
if tgen.routers_have_failure():
pytest.skip(tgen.errors)
for rname in ["r1", "r2", "r3"]:
router_compare_json_output(
rname, "show l2vpn atom binding json", "show_l2vpn_binding.ref"
)
def test_ldp_pseudowires():
logger.info("Test: verify LDP pseudowires")
tgen = get_topogen()
# Skip if previous fatal error condition is raised
if tgen.routers_have_failure():
pytest.skip(tgen.errors)
for rname in ["r1", "r2", "r3"]:
router_compare_json_output(
rname, "show l2vpn atom vc json", "show_l2vpn_vc.ref"
)
def test_ldp_igp_sync():
logger.info("Test: verify LDP igp-sync")
tgen = get_topogen()
# Skip if previous fatal error condition is raised
if tgen.routers_have_failure():
pytest.skip(tgen.errors)
for rname in ["r1", "r2", "r3"]:
router_compare_json_output(
rname, "show mpls ldp igp-sync json", "show_ldp_igp_sync.ref"
)
def test_isis_ldp_sync():
logger.info("Test: verify ISIS igp-sync")
tgen = get_topogen()
# Skip if previous fatal error condition is raised
if tgen.routers_have_failure():
pytest.skip(tgen.errors)
for rname in ["r1", "r2", "r3"]:
(result, diff) = validate_show_isis_ldp_sync(
rname, "show_isis_ldp_sync.ref"
)
assert result, "ISIS did not converge on {}:\n{}".format(rname, diff)
for rname in ["r1", "r2", "r3"]:
(result, diff) = validate_show_isis_interface_detail(
rname, "show_isis_interface_detail.ref"
)
assert result, "ISIS interface did not converge on {}:\n{}".format(rname, diff)
def test_r1_eth1_shutdown():
logger.info("Test: verify behaviour after r1-eth1 is shutdown")
tgen = get_topogen()
# Skip if previous fatal error condition is raised
if tgen.routers_have_failure():
pytest.skip(tgen.errors)
# Shut down r1-r2 link */
tgen = get_topogen()
tgen.gears["r1"].peer_link_enable("r1-eth1", False)
topotest.sleep(5, "Waiting for the network to reconverge")
# check if the pseudowire is still up (using an alternate path for nexthop resolution)
for rname in ["r1", "r2", "r3"]:
router_compare_json_output(
rname, "show l2vpn atom vc json", "show_l2vpn_vc.ref"
)
for rname in ["r1", "r2", "r3"]:
router_compare_json_output(
rname, "show mpls ldp igp-sync json", "show_ldp_igp_sync_r1_eth1_shutdown.ref"
)
for rname in ["r1", "r2", "r3"]:
(result, diff) = validate_show_isis_ldp_sync(
rname, "show_isis_ldp_sync_r1_eth1_shutdown.ref"
)
assert result, "ISIS did not converge on {}:\n{}".format(rname, diff)
for rname in ["r1", "r2", "r3"]:
(result, diff) = validate_show_isis_interface_detail(
rname, "show_isis_interface_detail_r1_eth1_shutdown.ref"
)
assert result, "ISIS interface did not converge on {}:\n{}".format(rname, diff)
def test_r1_eth1_no_shutdown():
logger.info("Test: verify behaviour after r1-eth1 is no shutdown")
tgen = get_topogen()
# Skip if previous fatal error condition is raised
if tgen.routers_have_failure():
pytest.skip(tgen.errors)
# Run no shutdown on r1-eth1 interface */
tgen = get_topogen()
tgen.gears["r1"].peer_link_enable("r1-eth1", True)
topotest.sleep(5, "Waiting for the network to reconverge")
for rname in ["r1", "r2", "r3"]:
router_compare_json_output(
rname, "show mpls ldp igp-sync json", "show_ldp_igp_sync.ref"
)
for rname in ["r1", "r2", "r3"]:
(result, diff) = validate_show_isis_ldp_sync(
rname, "show_isis_ldp_sync.ref"
)
assert result, "ISIS did not converge on {}:\n{}".format(rname, diff)
for rname in ["r1", "r2", "r3"]:
(result, diff) = validate_show_isis_interface_detail(
rname, "show_isis_interface_detail.ref"
)
assert result, "ISIS interface did not converge on {}:\n{}".format(rname, diff)
def test_r2_eth1_shutdown():
logger.info("Test: verify behaviour after r2-eth1 is shutdown")
tgen = get_topogen()
# Skip if previous fatal error condition is raised
if tgen.routers_have_failure():
pytest.skip(tgen.errors)
# Shut down r1-r2 link */
tgen = get_topogen()
tgen.gears["r2"].peer_link_enable("r2-eth1", False)
topotest.sleep(5, "Waiting for the network to reconverge")
for rname in ["r1", "r2", "r3"]:
router_compare_json_output(
rname, "show mpls ldp igp-sync json", "show_ldp_igp_sync_r1_eth1_shutdown.ref"
)
for rname in ["r1", "r2", "r3"]:
(result, diff) = validate_show_isis_ldp_sync(
rname, "show_isis_ldp_sync_r2_eth1_shutdown.ref"
)
assert result, "ISIS did not converge on {}:\n{}".format(rname, diff)
for rname in ["r1", "r2", "r3"]:
(result, diff) = validate_show_isis_interface_detail(
rname, "show_isis_interface_detail_r2_eth1_shutdown.ref"
)
assert result, "ISIS interface did not converge on {}:\n{}".format(rname, diff)
def test_r2_eth1_no_shutdown():
logger.info("Test: verify behaviour after r2-eth1 is no shutdown")
tgen = get_topogen()
# Skip if previous fatal error condition is raised
if tgen.routers_have_failure():
pytest.skip(tgen.errors)
# Run no shutdown on r2-eth1 interface */
tgen = get_topogen()
tgen.gears["r2"].peer_link_enable("r2-eth1", True)
topotest.sleep(5, "Waiting for the network to reconverge")
for rname in ["r1", "r2", "r3"]:
router_compare_json_output(
rname, "show mpls ldp igp-sync json", "show_ldp_igp_sync.ref"
)
for rname in ["r1", "r2", "r3"]:
(result, diff) = validate_show_isis_ldp_sync(
rname, "show_isis_ldp_sync.ref"
)
assert result, "ISIS did not converge on {}:\n{}".format(rname, diff)
for rname in ["r1", "r2", "r3"]:
(result, diff) = validate_show_isis_interface_detail(
rname, "show_isis_interface_detail.ref"
)
assert result, "ISIS interface did not converge on {}:\n{}".format(rname, diff)
# Memory leak test template
def test_memory_leak():
"Run the memory leak test and report results."
tgen = get_topogen()
if not tgen.is_memleak_enabled():
pytest.skip("Memory leak test/report is disabled")
tgen.report_memory_leaks()
if __name__ == "__main__":
args = ["-s"] + sys.argv[1:]
sys.exit(pytest.main(args))
#
# Auxiliary functions
#
def parse_show_isis_ldp_sync(lines, rname):
"""
Parse the output of 'show isis mpls ldp sync' into a Python dict.
"""
interfaces = {}
it = iter(lines)
while True:
try:
interface = {}
interface_name = None
line = it.next();
if line.startswith(rname + "-eth"):
interface_name = line
line = it.next();
if line.startswith(" LDP-IGP Synchronization enabled: "):
interface["ldpIgpSyncEnabled"] = line.endswith("yes")
line = it.next();
if line.startswith(" holddown timer in seconds: "):
interface["holdDownTimeInSec"] = int(line.split(": ")[-1])
line = it.next();
if line.startswith(" State: "):
interface["ldpIgpSyncState"] = line.split(": ")[-1]
interfaces[interface_name] = interface
except StopIteration:
break
return interfaces
def show_isis_ldp_sync(router, rname):
"""
Get the show isis mpls ldp-sync info in a dictionary format.
"""
out = topotest.normalize_text(
router.vtysh_cmd("show isis mpls ldp-sync")
).splitlines()
parsed = parse_show_isis_ldp_sync(out, rname)
return parsed
def validate_show_isis_ldp_sync(rname, fname):
tgen = get_topogen()
filename = "{0}/{1}/{2}".format(CWD, rname, fname)
expected = json.loads(open(filename).read())
router = tgen.gears[rname]
def compare_isis_ldp_sync(router, expected):
"Helper function to test show isis mpls ldp-sync"
actual = show_isis_ldp_sync(router, rname)
return topotest.json_cmp(actual, expected)
test_func = partial(compare_isis_ldp_sync, router, expected)
(result, diff) = topotest.run_and_expect(test_func, None, wait=0.5, count=160)
return (result, diff)
def parse_show_isis_interface_detail(lines, rname):
"""
Parse the output of 'show isis interface detail' into a Python dict.
"""
areas = {}
area_id = None
it = iter(lines)
while True:
try:
line = it.next();
area_match = re.match(r"Area (.+):", line)
if not area_match:
continue
area_id = area_match.group(1)
area = {}
line = it.next();
while line.startswith(" Interface: "):
interface_name = re.split(':|,', line)[1].lstrip()
area[interface_name]= []
# Look for keyword: Level-1 or Level-2
while not line.startswith(" Level-"):
line = it.next();
while line.startswith(" Level-"):
level = {}
level_name = line.split()[0]
level['level'] = level_name
line = it.next();
if line.startswith(" Metric:"):
level['metric'] = re.split(':|,', line)[1].lstrip()
area[interface_name].append(level)
# Look for keyword: Level-1 or Level-2 or Interface:
while not line.startswith(" Level-") and not line.startswith(" Interface: "):
line = it.next();
if line.startswith(" Level-"):
continue
if line.startswith(" Interface: "):
break
areas[area_id] = area
except StopIteration:
areas[area_id] = area
break
return areas
def show_isis_interface_detail(router, rname):
"""
Get the show isis mpls ldp-sync info in a dictionary format.
"""
out = topotest.normalize_text(
router.vtysh_cmd("show isis interface detail")
).splitlines()
logger.warning(out)
parsed = parse_show_isis_interface_detail(out, rname)
logger.warning(parsed)
return parsed
def validate_show_isis_interface_detail(rname, fname):
tgen = get_topogen()
filename = "{0}/{1}/{2}".format(CWD, rname, fname)
expected = json.loads(open(filename).read())
router = tgen.gears[rname]
def compare_isis_interface_detail(router, expected):
"Helper function to test show isis interface detail"
actual = show_isis_interface_detail(router, rname)
return topotest.json_cmp(actual, expected)
test_func = partial(compare_isis_interface_detail, router, expected)
(result, diff) = topotest.run_and_expect(test_func, None, wait=0.5, count=160)
return (result, diff)

View File

@ -0,0 +1,12 @@
log file zebra.log
!
hostname ce1
!
interface ce1-eth0
ip address 172.16.1.1/24
no link-detect
!
ip forwarding
!
line vty
!

View File

@ -0,0 +1,12 @@
log file zebra.log
!
hostname ce2
!
interface ce2-eth0
ip address 172.16.1.2/24
no link-detect
!
ip forwarding
!
line vty
!

View File

@ -0,0 +1,12 @@
log file zebra.log
!
hostname ce3
!
interface ce3-eth0
ip address 172.16.1.3/24
no link-detect
!
ip forwarding
!
line vty
!

View File

@ -0,0 +1,33 @@
hostname r1
log file ldpd.log
!
debug mpls ldp zebra
debug mpls ldp event
debug mpls ldp errors
debug mpls ldp sync
!
mpls ldp
router-id 1.1.1.1
!
address-family ipv4
discovery transport-address 1.1.1.1
label local allocate host-routes
!
ttl-security disable
!
interface r1-eth1
!
interface r1-eth2
!
!
!
l2vpn CUST_A type vpls
member interface r1-eth0
!
member pseudowire r1-mpw0
neighbor lsr-id 2.2.2.2
pw-id 100
!
!
line vty
!

View File

@ -0,0 +1,20 @@
hostname r1
log file ospfd.log
debug ospf zebra interface
debug ospf ldp-sync
!
router ospf
router-id 1.1.1.1
network 10.0.1.1/24 area 0
network 10.0.2.1/24 area 0
network 1.1.1.1/32 area 0
mpls ldp-sync
! mpls ldp-sync holddown 50
!
interface r1-eth1
ip ospf network point-to-point
! ip ospf mpls ldp-sync holddown 40
!
interface r1-eth2
ip ospf network point-to-point
!

View File

@ -0,0 +1,11 @@
{
"interfaces":{
"r1-eth1":{
"cost":10
},
"r1-eth2":{
"cost":10
}
}
}

View File

@ -0,0 +1,8 @@
{
"interfaces":{
"r1-eth2":{
"cost":10
}
}
}

View File

@ -0,0 +1,11 @@
{
"interfaces":{
"r1-eth1":{
"cost":65535
},
"r1-eth2":{
"cost":10
}
}
}

View File

@ -0,0 +1,26 @@
{
"neighbors": {
"2.2.2.2": [
{
"dbSummaryCounter": 0,
"retransmitCounter": 0,
"priority": 1,
"state": "Full/DROther",
"address": "10.0.1.2",
"ifaceName": "r1-eth1:10.0.1.1",
"requestCounter": 0
}
],
"3.3.3.3": [
{
"dbSummaryCounter": 0,
"retransmitCounter": 0,
"priority": 1,
"state": "Full/DROther",
"address": "10.0.2.3",
"ifaceName": "r1-eth2:10.0.2.1",
"requestCounter": 0
}
]
}
}

View File

@ -0,0 +1,157 @@
{
"1.1.1.1/32":[
{
"prefix":"1.1.1.1/32",
"protocol":"ospf",
"distance":110,
"metric":0,
"nexthops":[
{
"directlyConnected":true,
"interfaceIndex":1,
"interfaceName":"lo",
"active":true
}
]
},
{
"prefix":"1.1.1.1/32",
"protocol":"connected",
"selected":true,
"nexthops":[
{
"fib":true,
"directlyConnected":true,
"interfaceIndex":1,
"interfaceName":"lo",
"active":true
}
]
}
],
"2.2.2.2/32":[
{
"prefix":"2.2.2.2/32",
"protocol":"ospf",
"selected":true,
"distance":110,
"metric":10,
"nexthops":[
{
"fib":true,
"ip":"10.0.1.2",
"afi":"ipv4",
"interfaceIndex":3,
"interfaceName":"r1-eth1",
"active":true
}
]
}
],
"3.3.3.3/32":[
{
"prefix":"3.3.3.3/32",
"protocol":"ospf",
"selected":true,
"distance":110,
"metric":10,
"nexthops":[
{
"fib":true,
"ip":"10.0.2.3",
"afi":"ipv4",
"interfaceIndex":4,
"interfaceName":"r1-eth2",
"active":true
}
]
}
],
"10.0.1.0/24":[
{
"prefix":"10.0.1.0/24",
"protocol":"ospf",
"distance":110,
"metric":10,
"nexthops":[
{
"directlyConnected":true,
"interfaceIndex":3,
"interfaceName":"r1-eth1",
"active":true
}
]
},
{
"prefix":"10.0.1.0/24",
"protocol":"connected",
"selected":true,
"nexthops":[
{
"fib":true,
"directlyConnected":true,
"interfaceIndex":3,
"interfaceName":"r1-eth1",
"active":true
}
]
}
],
"10.0.2.0/24":[
{
"prefix":"10.0.2.0/24",
"protocol":"ospf",
"distance":110,
"metric":10,
"nexthops":[
{
"directlyConnected":true,
"interfaceIndex":4,
"interfaceName":"r1-eth2",
"active":true
}
]
},
{
"prefix":"10.0.2.0/24",
"protocol":"connected",
"selected":true,
"nexthops":[
{
"fib":true,
"directlyConnected":true,
"interfaceIndex":4,
"interfaceName":"r1-eth2",
"active":true
}
]
}
],
"10.0.3.0/24":[
{
"prefix":"10.0.3.0/24",
"protocol":"ospf",
"selected":true,
"distance":110,
"metric":20,
"nexthops":[
{
"fib":true,
"ip":"10.0.1.2",
"afi":"ipv4",
"interfaceIndex":3,
"interfaceName":"r1-eth1",
"active":true
},
{
"fib":true,
"ip":"10.0.2.3",
"afi":"ipv4",
"interfaceIndex":4,
"interfaceName":"r1-eth2",
"active":true
}
]
}
]
}

View File

@ -0,0 +1,16 @@
{
"2.2.2.2: 100":{
"destination":"2.2.2.2",
"vcId":100,
"localLabel":16,
"localControlWord":1,
"localVcType":"Ethernet",
"localGroupID":0,
"localIfMtu":1500,
"remoteLabel":16,
"remoteControlWord":1,
"remoteVcType":"Ethernet",
"remoteGroupID":0,
"remoteIfMtu":1500
}
}

View File

@ -0,0 +1,8 @@
{
"r1-mpw0":{
"peerId":"2.2.2.2",
"vcId":100,
"VpnName":"CUST_A",
"status":"up"
}
}

View File

@ -0,0 +1,44 @@
{
"bindings":[
{
"addressFamily":"ipv4",
"prefix":"1.1.1.1/32",
"neighborId":"2.2.2.2",
"localLabel":"imp-null",
"inUse":0
},
{
"addressFamily":"ipv4",
"prefix":"1.1.1.1/32",
"neighborId":"3.3.3.3",
"localLabel":"imp-null",
"inUse":0
},
{
"addressFamily":"ipv4",
"prefix":"2.2.2.2/32",
"neighborId":"2.2.2.2",
"remoteLabel":"imp-null",
"inUse":1
},
{
"addressFamily":"ipv4",
"prefix":"2.2.2.2/32",
"neighborId":"3.3.3.3",
"inUse":0
},
{
"addressFamily":"ipv4",
"prefix":"3.3.3.3/32",
"neighborId":"2.2.2.2",
"inUse":0
},
{
"addressFamily":"ipv4",
"prefix":"3.3.3.3/32",
"neighborId":"3.3.3.3",
"remoteLabel":"imp-null",
"inUse":1
}
]
}

View File

@ -0,0 +1,25 @@
{
"adjacencies":[
{
"addressFamily":"ipv4",
"neighborId":"2.2.2.2",
"type":"link",
"interface":"r1-eth1",
"helloHoldtime":15
},
{
"addressFamily":"ipv4",
"neighborId":"2.2.2.2",
"type":"targeted",
"peer":"2.2.2.2",
"helloHoldtime":45
},
{
"addressFamily":"ipv4",
"neighborId":"3.3.3.3",
"type":"link",
"interface":"r1-eth2",
"helloHoldtime":15
}
]
}

View File

@ -0,0 +1,16 @@
{
"r1-eth1":{
"state":"labelExchangeComplete",
"waitTime":10,
"waitTimeRemaining":0,
"timerRunning":false,
"peerLdpId":"2.2.2.2"
},
"r1-eth2":{
"state":"labelExchangeComplete",
"waitTime":10,
"waitTimeRemaining":0,
"timerRunning":false,
"peerLdpId":"3.3.3.3"
}
}

View File

@ -0,0 +1,16 @@
{
"r1-eth1":{
"state":"labelExchangeNotComplete",
"waitTime":10,
"waitTimeRemaining":0,
"timerRunning":false,
"peerLdpId":""
},
"r1-eth2":{
"state":"labelExchangeComplete",
"waitTime":10,
"waitTimeRemaining":0,
"timerRunning":false,
"peerLdpId":"3.3.3.3"
}
}

View File

@ -0,0 +1,16 @@
{
"neighbors":[
{
"addressFamily":"ipv4",
"neighborId":"2.2.2.2",
"state":"OPERATIONAL",
"transportAddress":"2.2.2.2"
},
{
"addressFamily":"ipv4",
"neighborId":"3.3.3.3",
"state":"OPERATIONAL",
"transportAddress":"3.3.3.3"
}
]
}

View File

@ -0,0 +1,12 @@
{
"r1-eth1":{
"ldpIgpSyncEnabled":true,
"holdDownTimeInSec":0,
"ldpIgpSyncState":"Sync achieved"
},
"r1-eth2":{
"ldpIgpSyncEnabled":true,
"holdDownTimeInSec":0,
"ldpIgpSyncState":"Sync achieved"
}
}

View File

@ -0,0 +1,7 @@
{
"r1-eth2":{
"ldpIgpSyncEnabled":true,
"holdDownTimeInSec":0,
"ldpIgpSyncState":"Sync achieved"
}
}

View File

@ -0,0 +1,12 @@
{
"r1-eth1":{
"ldpIgpSyncEnabled":true,
"holdDownTimeInSec":0,
"ldpIgpSyncState":"Sync not achieved"
},
"r1-eth2":{
"ldpIgpSyncEnabled":true,
"holdDownTimeInSec":0,
"ldpIgpSyncState":"Sync achieved"
}
}

View File

@ -0,0 +1,29 @@
log file zebra.log
!
hostname r1
!
debug zebra kernel
debug zebra rib detailed
debug zebra dplane detailed
debug zebra nht
debug zebra pseudowires
debug zebra mpls
!
interface lo
ip address 1.1.1.1/32
!
interface r1-eth0
description to s1
!
interface r1-eth1
description to s4
ip address 10.0.1.1/24
!
interface r1-eth2
description to s5
ip address 10.0.2.1/24
!
ip forwarding
!
line vty
!

View File

@ -0,0 +1,33 @@
hostname r2
log file ldpd.log
!
debug mpls ldp zebra
debug mpls ldp event
debug mpls ldp errors
debug mpls ldp sync
!
mpls ldp
router-id 2.2.2.2
!
address-family ipv4
discovery transport-address 2.2.2.2
label local allocate host-routes
!
ttl-security disable
!
interface r2-eth1
!
interface r2-eth2
!
!
!
l2vpn CUST_A type vpls
member interface r2-eth0
!
member pseudowire r2-mpw0
neighbor lsr-id 1.1.1.1
pw-id 100
!
!
line vty
!

View File

@ -0,0 +1,19 @@
hostname r2
log file ospfd.log
debug ospf zebra interface
debug ospf ldp-sync
!
router ospf
router-id 2.2.2.2
network 0.0.0.0/0 area 0
mpls ldp-sync
mpls ldp-sync holddown 50
!
interface r2-eth1
ip ospf network point-to-point
ip ospf mpls ldp-sync holddown 300
!
interface r2-eth2
ip ospf network point-to-point
no ip ospf mpls ldp-sync
!

View File

@ -0,0 +1,11 @@
{
"interfaces":{
"r2-eth1":{
"cost":10
},
"r2-eth2":{
"cost":10
}
}
}

View File

@ -0,0 +1,11 @@
{
"interfaces":{
"r2-eth1":{
"cost":65535
},
"r2-eth2":{
"cost":10
}
}
}

View File

@ -0,0 +1,8 @@
{
"interfaces":{
"r2-eth2":{
"cost":10
}
}
}

View File

@ -0,0 +1,26 @@
{
"neighbors": {
"1.1.1.1": [
{
"priority":1,
"state":"Full/DROther",
"address":"10.0.1.1",
"ifaceName":"r2-eth1:10.0.1.2",
"retransmitCounter":0,
"requestCounter":0,
"dbSummaryCounter":0
}
],
"3.3.3.3": [
{
"priority":1,
"state":"Full/DROther",
"address":"10.0.3.3",
"ifaceName":"r2-eth2:10.0.3.2",
"retransmitCounter":0,
"requestCounter":0,
"dbSummaryCounter":0
}
]
}
}

View File

@ -0,0 +1,157 @@
{
"1.1.1.1/32":[
{
"prefix":"1.1.1.1/32",
"protocol":"ospf",
"selected":true,
"distance":110,
"metric":10,
"nexthops":[
{
"fib":true,
"ip":"10.0.1.1",
"afi":"ipv4",
"interfaceIndex":3,
"interfaceName":"r2-eth1",
"active":true
}
]
}
],
"2.2.2.2/32":[
{
"prefix":"2.2.2.2/32",
"protocol":"ospf",
"distance":110,
"metric":0,
"nexthops":[
{
"directlyConnected":true,
"interfaceIndex":1,
"interfaceName":"lo",
"active":true
}
]
},
{
"prefix":"2.2.2.2/32",
"protocol":"connected",
"selected":true,
"nexthops":[
{
"fib":true,
"directlyConnected":true,
"interfaceIndex":1,
"interfaceName":"lo",
"active":true
}
]
}
],
"3.3.3.3/32":[
{
"prefix":"3.3.3.3/32",
"protocol":"ospf",
"selected":true,
"distance":110,
"metric":10,
"nexthops":[
{
"fib":true,
"ip":"10.0.3.3",
"afi":"ipv4",
"interfaceIndex":4,
"interfaceName":"r2-eth2",
"active":true
}
]
}
],
"10.0.1.0/24":[
{
"prefix":"10.0.1.0/24",
"protocol":"ospf",
"distance":110,
"metric":10,
"nexthops":[
{
"directlyConnected":true,
"interfaceIndex":3,
"interfaceName":"r2-eth1",
"active":true
}
]
},
{
"prefix":"10.0.1.0/24",
"protocol":"connected",
"selected":true,
"nexthops":[
{
"fib":true,
"directlyConnected":true,
"interfaceIndex":3,
"interfaceName":"r2-eth1",
"active":true
}
]
}
],
"10.0.2.0/24":[
{
"prefix":"10.0.2.0/24",
"protocol":"ospf",
"selected":true,
"distance":110,
"metric":20,
"nexthops":[
{
"fib":true,
"ip":"10.0.1.1",
"afi":"ipv4",
"interfaceIndex":3,
"interfaceName":"r2-eth1",
"active":true
},
{
"fib":true,
"ip":"10.0.3.3",
"afi":"ipv4",
"interfaceIndex":4,
"interfaceName":"r2-eth2",
"active":true
}
]
}
],
"10.0.3.0/24":[
{
"prefix":"10.0.3.0/24",
"protocol":"ospf",
"distance":110,
"metric":10,
"nexthops":[
{
"directlyConnected":true,
"interfaceIndex":4,
"interfaceName":"r2-eth2",
"active":true
}
]
},
{
"prefix":"10.0.3.0/24",
"protocol":"connected",
"selected":true,
"nexthops":[
{
"fib":true,
"directlyConnected":true,
"interfaceIndex":4,
"interfaceName":"r2-eth2",
"active":true
}
]
}
]
}

View File

@ -0,0 +1,16 @@
{
"1.1.1.1: 100":{
"destination":"1.1.1.1",
"vcId":100,
"localLabel":16,
"localControlWord":1,
"localVcType":"Ethernet",
"localGroupID":0,
"localIfMtu":1500,
"remoteLabel":16,
"remoteControlWord":1,
"remoteVcType":"Ethernet",
"remoteGroupID":0,
"remoteIfMtu":1500
}
}

View File

@ -0,0 +1,8 @@
{
"r2-mpw0":{
"peerId":"1.1.1.1",
"vcId":100,
"VpnName":"CUST_A",
"status":"up"
}
}

View File

@ -0,0 +1,44 @@
{
"bindings":[
{
"addressFamily":"ipv4",
"prefix":"1.1.1.1/32",
"neighborId":"1.1.1.1",
"remoteLabel":"imp-null",
"inUse":1
},
{
"addressFamily":"ipv4",
"prefix":"1.1.1.1/32",
"neighborId":"3.3.3.3",
"inUse":0
},
{
"addressFamily":"ipv4",
"prefix":"2.2.2.2/32",
"neighborId":"1.1.1.1",
"localLabel":"imp-null",
"inUse":0
},
{
"addressFamily":"ipv4",
"prefix":"2.2.2.2/32",
"neighborId":"3.3.3.3",
"localLabel":"imp-null",
"inUse":0
},
{
"addressFamily":"ipv4",
"prefix":"3.3.3.3/32",
"neighborId":"1.1.1.1",
"inUse":0
},
{
"addressFamily":"ipv4",
"prefix":"3.3.3.3/32",
"neighborId":"3.3.3.3",
"remoteLabel":"imp-null",
"inUse":1
}
]
}

View File

@ -0,0 +1,25 @@
{
"adjacencies":[
{
"addressFamily":"ipv4",
"neighborId":"1.1.1.1",
"type":"link",
"interface":"r2-eth1",
"helloHoldtime":15
},
{
"addressFamily":"ipv4",
"neighborId":"1.1.1.1",
"type":"targeted",
"peer":"1.1.1.1",
"helloHoldtime":45
},
{
"addressFamily":"ipv4",
"neighborId":"3.3.3.3",
"type":"link",
"interface":"r2-eth2",
"helloHoldtime":15
}
]
}

View File

@ -0,0 +1,16 @@
{
"r2-eth1":{
"state":"labelExchangeComplete",
"waitTime":10,
"waitTimeRemaining":0,
"timerRunning":false,
"peerLdpId":"1.1.1.1"
},
"r2-eth2":{
"state":"labelExchangeComplete",
"waitTime":10,
"waitTimeRemaining":0,
"timerRunning":false,
"peerLdpId":"3.3.3.3"
}
}

View File

@ -0,0 +1,16 @@
{
"r2-eth1":{
"state":"labelExchangeNotComplete",
"waitTime":10,
"waitTimeRemaining":0,
"timerRunning":false,
"peerLdpId":""
},
"r2-eth2":{
"state":"labelExchangeComplete",
"waitTime":10,
"waitTimeRemaining":0,
"timerRunning":false,
"peerLdpId":"3.3.3.3"
}
}

View File

@ -0,0 +1,16 @@
{
"neighbors":[
{
"addressFamily":"ipv4",
"neighborId":"1.1.1.1",
"state":"OPERATIONAL",
"transportAddress":"1.1.1.1"
},
{
"addressFamily":"ipv4",
"neighborId":"3.3.3.3",
"state":"OPERATIONAL",
"transportAddress":"3.3.3.3"
}
]
}

View File

@ -0,0 +1,12 @@
{
"r2-eth1":{
"ldpIgpSyncEnabled":true,
"holdDownTimeInSec":300,
"ldpIgpSyncState":"Sync achieved"
},
"r2-eth2":{
"ldpIgpSyncEnabled":false,
"holdDownTimeInSec":50,
"ldpIgpSyncState":"Sync not required"
}
}

View File

@ -0,0 +1,12 @@
{
"r2-eth1":{
"ldpIgpSyncEnabled":true,
"holdDownTimeInSec":300,
"ldpIgpSyncState":"Holding down until Sync"
},
"r2-eth2":{
"ldpIgpSyncEnabled":false,
"holdDownTimeInSec":50,
"ldpIgpSyncState":"Sync not required"
}
}

View File

@ -0,0 +1,7 @@
{
"r2-eth2":{
"ldpIgpSyncEnabled":false,
"holdDownTimeInSec":50,
"ldpIgpSyncState":"Sync not required"
}
}

Some files were not shown because too many files have changed in this diff Show More