mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-08 03:28:31 +00:00
rip_topo1: Adding new test for RIPv2 Topology
Signed-off-by: Martin Winter <mwinter@opensourcerouting.org>
This commit is contained in:
parent
9f3e0f6493
commit
d6df723b10
16
tests/topotests/rip-topo1/r1/rip_status.ref
Normal file
16
tests/topotests/rip-topo1/r1/rip_status.ref
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
Routing Protocol is "rip"
|
||||||
|
Sending updates every 30 seconds with +/-50%, next due in XX seconds
|
||||||
|
Timeout after 180 seconds, garbage collect after 120 seconds
|
||||||
|
Outgoing update filter list for all interface is not set
|
||||||
|
Incoming update filter list for all interface is not set
|
||||||
|
Default redistribution metric is 1
|
||||||
|
Redistributing:
|
||||||
|
Default version control: send version 2, receive version 2
|
||||||
|
Interface Send Recv Key-chain
|
||||||
|
r1-eth1 2 2
|
||||||
|
Routing for Networks:
|
||||||
|
193.1.1.0/26
|
||||||
|
Routing Information Sources:
|
||||||
|
Gateway BadPackets BadRoutes Distance Last Update
|
||||||
|
193.1.1.2 0 0 120 XX:XX:XX
|
||||||
|
Distance: (default is 120)
|
9
tests/topotests/rip-topo1/r1/ripd.conf
Normal file
9
tests/topotests/rip-topo1/r1/ripd.conf
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
log file /tmp/r1-ripd.log
|
||||||
|
!
|
||||||
|
router rip
|
||||||
|
version 2
|
||||||
|
network 193.1.1.0/26
|
||||||
|
!
|
||||||
|
line vty
|
||||||
|
!
|
||||||
|
|
10
tests/topotests/rip-topo1/r1/show_ip_rip.ref
Normal file
10
tests/topotests/rip-topo1/r1/show_ip_rip.ref
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
Codes: R - RIP, C - connected, S - Static, O - OSPF, B - BGP
|
||||||
|
Sub-codes:
|
||||||
|
(n) - normal, (s) - static, (d) - default, (r) - redistribute,
|
||||||
|
(i) - interface
|
||||||
|
|
||||||
|
Network Next Hop Metric From Tag Time
|
||||||
|
R(n) 192.168.2.0/24 193.1.1.2 3 193.1.1.2 0 XX:XX
|
||||||
|
R(n) 192.168.3.0/24 193.1.1.2 3 193.1.1.2 0 XX:XX
|
||||||
|
C(i) 193.1.1.0/26 0.0.0.0 1 self 0
|
||||||
|
R(n) 193.1.2.0/24 193.1.1.2 2 193.1.1.2 0 XX:XX
|
3
tests/topotests/rip-topo1/r1/show_ip_route.ref
Normal file
3
tests/topotests/rip-topo1/r1/show_ip_route.ref
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
R>* 192.168.2.0/24 [120/3] via 193.1.1.2, r1-eth1
|
||||||
|
R>* 192.168.3.0/24 [120/3] via 193.1.1.2, r1-eth1
|
||||||
|
R>* 193.1.2.0/24 [120/2] via 193.1.1.2, r1-eth1
|
19
tests/topotests/rip-topo1/r1/zebra.conf
Normal file
19
tests/topotests/rip-topo1/r1/zebra.conf
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
log file /tmp/r1-zebra.log
|
||||||
|
!
|
||||||
|
hostname r1
|
||||||
|
!
|
||||||
|
interface r1-eth0
|
||||||
|
ip address 192.168.1.1/24
|
||||||
|
!
|
||||||
|
interface r1-eth1
|
||||||
|
description to sw2 - RIPv2 interface
|
||||||
|
ip address 193.1.1.1/26
|
||||||
|
no link-detect
|
||||||
|
!
|
||||||
|
ip forwarding
|
||||||
|
ipv6 forwarding
|
||||||
|
!
|
||||||
|
!
|
||||||
|
line vty
|
||||||
|
!
|
||||||
|
|
18
tests/topotests/rip-topo1/r2/rip_status.ref
Normal file
18
tests/topotests/rip-topo1/r2/rip_status.ref
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
Routing Protocol is "rip"
|
||||||
|
Sending updates every 30 seconds with +/-50%, next due in XX seconds
|
||||||
|
Timeout after 180 seconds, garbage collect after 120 seconds
|
||||||
|
Outgoing update filter list for all interface is not set
|
||||||
|
Incoming update filter list for all interface is not set
|
||||||
|
Default redistribution metric is 1
|
||||||
|
Redistributing:
|
||||||
|
Default version control: send version 2, receive version 2
|
||||||
|
Interface Send Recv Key-chain
|
||||||
|
r2-eth0 2 2
|
||||||
|
r2-eth1 2 2
|
||||||
|
Routing for Networks:
|
||||||
|
193.1.1.0/26
|
||||||
|
193.1.2.0/24
|
||||||
|
Routing Information Sources:
|
||||||
|
Gateway BadPackets BadRoutes Distance Last Update
|
||||||
|
193.1.2.2 0 0 120 XX:XX:XX
|
||||||
|
Distance: (default is 120)
|
11
tests/topotests/rip-topo1/r2/ripd.conf
Normal file
11
tests/topotests/rip-topo1/r2/ripd.conf
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
log file /tmp/r2-ripd.log
|
||||||
|
!
|
||||||
|
!
|
||||||
|
router rip
|
||||||
|
version 2
|
||||||
|
network 193.1.1.0/26
|
||||||
|
network 193.1.2.0/24
|
||||||
|
!
|
||||||
|
line vty
|
||||||
|
!
|
||||||
|
|
10
tests/topotests/rip-topo1/r2/show_ip_rip.ref
Normal file
10
tests/topotests/rip-topo1/r2/show_ip_rip.ref
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
Codes: R - RIP, C - connected, S - Static, O - OSPF, B - BGP
|
||||||
|
Sub-codes:
|
||||||
|
(n) - normal, (s) - static, (d) - default, (r) - redistribute,
|
||||||
|
(i) - interface
|
||||||
|
|
||||||
|
Network Next Hop Metric From Tag Time
|
||||||
|
R(n) 192.168.2.0/24 193.1.2.2 2 193.1.2.2 0 XX:XX
|
||||||
|
R(n) 192.168.3.0/24 193.1.2.2 2 193.1.2.2 0 XX:XX
|
||||||
|
C(i) 193.1.1.0/26 0.0.0.0 1 self 0
|
||||||
|
C(i) 193.1.2.0/24 0.0.0.0 1 self 0
|
2
tests/topotests/rip-topo1/r2/show_ip_route.ref
Normal file
2
tests/topotests/rip-topo1/r2/show_ip_route.ref
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
R>* 192.168.2.0/24 [120/2] via 193.1.2.2, r2-eth1
|
||||||
|
R>* 192.168.3.0/24 [120/2] via 193.1.2.2, r2-eth1
|
21
tests/topotests/rip-topo1/r2/zebra.conf
Normal file
21
tests/topotests/rip-topo1/r2/zebra.conf
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
log file /tmp/r2-zebra.log
|
||||||
|
!
|
||||||
|
hostname r2
|
||||||
|
!
|
||||||
|
interface r2-eth0
|
||||||
|
description to sw2 - RIPv2 interface
|
||||||
|
ip address 193.1.1.2/26
|
||||||
|
no link-detect
|
||||||
|
!
|
||||||
|
interface r2-eth1
|
||||||
|
description to sw3 - RIPv1 interface
|
||||||
|
ip address 193.1.2.1/24
|
||||||
|
no link-detect
|
||||||
|
!
|
||||||
|
ip forwarding
|
||||||
|
ipv6 forwarding
|
||||||
|
!
|
||||||
|
!
|
||||||
|
line vty
|
||||||
|
!
|
||||||
|
|
16
tests/topotests/rip-topo1/r3/rip_status.ref
Normal file
16
tests/topotests/rip-topo1/r3/rip_status.ref
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
Routing Protocol is "rip"
|
||||||
|
Sending updates every 30 seconds with +/-50%, next due in XX seconds
|
||||||
|
Timeout after 180 seconds, garbage collect after 120 seconds
|
||||||
|
Outgoing update filter list for all interface is not set
|
||||||
|
Incoming update filter list for all interface is not set
|
||||||
|
Default redistribution metric is 1
|
||||||
|
Redistributing: connected static
|
||||||
|
Default version control: send version 2, receive version 2
|
||||||
|
Interface Send Recv Key-chain
|
||||||
|
r3-eth1 2 2
|
||||||
|
Routing for Networks:
|
||||||
|
193.1.2.0/24
|
||||||
|
Routing Information Sources:
|
||||||
|
Gateway BadPackets BadRoutes Distance Last Update
|
||||||
|
193.1.2.1 0 0 120 XX:XX:XX
|
||||||
|
Distance: (default is 120)
|
12
tests/topotests/rip-topo1/r3/ripd.conf
Normal file
12
tests/topotests/rip-topo1/r3/ripd.conf
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
log file /tmp/r3-ripd.log
|
||||||
|
!
|
||||||
|
!
|
||||||
|
router rip
|
||||||
|
version 2
|
||||||
|
redistribute connected
|
||||||
|
redistribute static
|
||||||
|
network 193.1.2.0/24
|
||||||
|
!
|
||||||
|
line vty
|
||||||
|
!
|
||||||
|
|
10
tests/topotests/rip-topo1/r3/show_ip_rip.ref
Normal file
10
tests/topotests/rip-topo1/r3/show_ip_rip.ref
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
Codes: R - RIP, C - connected, S - Static, O - OSPF, B - BGP
|
||||||
|
Sub-codes:
|
||||||
|
(n) - normal, (s) - static, (d) - default, (r) - redistribute,
|
||||||
|
(i) - interface
|
||||||
|
|
||||||
|
Network Next Hop Metric From Tag Time
|
||||||
|
S(r) 192.168.2.0/24 192.168.3.10 1 self 0
|
||||||
|
C(r) 192.168.3.0/24 0.0.0.0 1 self 0
|
||||||
|
R(n) 193.1.1.0/26 193.1.2.1 2 193.1.2.1 0 XX:XX
|
||||||
|
C(i) 193.1.2.0/24 0.0.0.0 1 self 0
|
1
tests/topotests/rip-topo1/r3/show_ip_route.ref
Normal file
1
tests/topotests/rip-topo1/r3/show_ip_route.ref
Normal file
@ -0,0 +1 @@
|
|||||||
|
R>* 193.1.1.0/26 [120/2] via 193.1.2.1, r3-eth1
|
22
tests/topotests/rip-topo1/r3/zebra.conf
Normal file
22
tests/topotests/rip-topo1/r3/zebra.conf
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
log file /tmp/r3-zebra.log
|
||||||
|
!
|
||||||
|
hostname r3
|
||||||
|
!
|
||||||
|
interface r3-eth0
|
||||||
|
description to sw4 - Stub interface
|
||||||
|
ip address 192.168.3.1/24
|
||||||
|
no link-detect
|
||||||
|
!
|
||||||
|
interface r3-eth1
|
||||||
|
description to sw3 - RIPv2 interface
|
||||||
|
ip address 193.1.2.2/24
|
||||||
|
no link-detect
|
||||||
|
!
|
||||||
|
ip route 192.168.2.0/24 192.168.3.10
|
||||||
|
!
|
||||||
|
ip forwarding
|
||||||
|
ipv6 forwarding
|
||||||
|
!
|
||||||
|
!
|
||||||
|
line vty
|
||||||
|
!
|
61
tests/topotests/rip-topo1/test_rip_topo1.dot
Normal file
61
tests/topotests/rip-topo1/test_rip_topo1.dot
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
## GraphViz file for test_rip_topo1
|
||||||
|
##
|
||||||
|
## 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 test_rip_topo1 {
|
||||||
|
overlap=false;
|
||||||
|
constraint=false;
|
||||||
|
|
||||||
|
// title
|
||||||
|
labelloc="t";
|
||||||
|
label="Test Topologoy RIP Topo1";
|
||||||
|
|
||||||
|
######################
|
||||||
|
# Routers
|
||||||
|
######################
|
||||||
|
|
||||||
|
# Main FRR Router with all protocols
|
||||||
|
R1 [shape=doubleoctagon, label="R1 FRR\nMain Router", fillcolor="#f08080", style=filled];
|
||||||
|
|
||||||
|
# RIP Routers
|
||||||
|
R2 [shape=doubleoctagon, label="R2 FRR\nRIP Router", fillcolor="#19e3d9", style=filled];
|
||||||
|
R3 [shape=doubleoctagon, label="R3 FRR\nRIP Router", fillcolor="#19e3d9", style=filled];
|
||||||
|
|
||||||
|
######################
|
||||||
|
# Network Lists
|
||||||
|
######################
|
||||||
|
|
||||||
|
SW1_R1_stub [label="SW1\n192.168.1.0/24", fillcolor="#d0e0d0", style=filled];
|
||||||
|
|
||||||
|
# RIP Networks
|
||||||
|
SW2_R1_R2 [label="SW2\nRIPv2\n193.1.1.0/26", fillcolor="#d0e0d0", style=filled];
|
||||||
|
SW3_R2_R3 [label="SW3\nRIPv1\n193.1.2.0/24", fillcolor="#d0e0d0", style=filled];
|
||||||
|
SW4_R3 [label="SW4\n192.168.3.0/24", fillcolor="#d0e0d0", style=filled];
|
||||||
|
Net_R3_remote [label="Static Net\n192.168.2.0/24"];
|
||||||
|
|
||||||
|
######################
|
||||||
|
# Network Connections
|
||||||
|
######################
|
||||||
|
R1 -- SW1_R1_stub [label = "eth0\n.1\n::1"];
|
||||||
|
|
||||||
|
# RIP Network
|
||||||
|
R1 -- SW2_R1_R2 [label = "eth1\n.1"];
|
||||||
|
SW2_R1_R2 -- R2 [label = "eth0\n.2"];
|
||||||
|
R2 -- SW3_R2_R3 [label = "eth1\n.1"];
|
||||||
|
SW3_R2_R3 -- R3 [label = "eth1\n.2"];
|
||||||
|
R3 -- SW4_R3 [label = "eth0\n.1"];
|
||||||
|
SW4_R3 -- Net_R3_remote [label = ".10"];
|
||||||
|
|
||||||
|
}
|
BIN
tests/topotests/rip-topo1/test_rip_topo1.pdf
Normal file
BIN
tests/topotests/rip-topo1/test_rip_topo1.pdf
Normal file
Binary file not shown.
352
tests/topotests/rip-topo1/test_rip_topo1.py
Executable file
352
tests/topotests/rip-topo1/test_rip_topo1.py
Executable file
@ -0,0 +1,352 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
|
||||||
|
#
|
||||||
|
# test_rip_topo1.py
|
||||||
|
# Part of NetDEF Topology Tests
|
||||||
|
#
|
||||||
|
# Copyright (c) 2017 by
|
||||||
|
# Network Device Education Foundation, Inc. ("NetDEF")
|
||||||
|
#
|
||||||
|
# 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_rip_topo1.py: Testing RIPv2
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
import os
|
||||||
|
import re
|
||||||
|
import sys
|
||||||
|
import difflib
|
||||||
|
import pytest
|
||||||
|
from time import sleep
|
||||||
|
|
||||||
|
from mininet.topo import Topo
|
||||||
|
from mininet.net import Mininet
|
||||||
|
from mininet.node import Node, OVSSwitch, Host
|
||||||
|
from mininet.log import setLogLevel, info
|
||||||
|
from mininet.cli import CLI
|
||||||
|
from mininet.link import Intf
|
||||||
|
|
||||||
|
from functools import partial
|
||||||
|
|
||||||
|
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
||||||
|
from lib import topotest
|
||||||
|
|
||||||
|
fatal_error = ""
|
||||||
|
|
||||||
|
|
||||||
|
#####################################################
|
||||||
|
##
|
||||||
|
## Network Topology Definition
|
||||||
|
##
|
||||||
|
#####################################################
|
||||||
|
|
||||||
|
class NetworkTopo(Topo):
|
||||||
|
"RIP Topology 1"
|
||||||
|
|
||||||
|
def build(self, **_opts):
|
||||||
|
|
||||||
|
# Setup Routers
|
||||||
|
router = {}
|
||||||
|
#
|
||||||
|
# Setup Main Router
|
||||||
|
router[1] = topotest.addRouter(self, 'r1')
|
||||||
|
#
|
||||||
|
# Setup RIP Routers
|
||||||
|
for i in range(2, 4):
|
||||||
|
router[i] = topotest.addRouter(self, 'r%s' % i)
|
||||||
|
#
|
||||||
|
# Setup Switches
|
||||||
|
switch = {}
|
||||||
|
#
|
||||||
|
# On main router
|
||||||
|
# First switch is for a dummy interface (for local network)
|
||||||
|
switch[1] = self.addSwitch('sw1', cls=topotest.LegacySwitch)
|
||||||
|
self.addLink(switch[1], router[1], intfName2='r1-eth0')
|
||||||
|
#
|
||||||
|
# Switches for RIP
|
||||||
|
# switch 2 switch is for connection to RIP router
|
||||||
|
switch[2] = self.addSwitch('sw2', cls=topotest.LegacySwitch)
|
||||||
|
self.addLink(switch[2], router[1], intfName2='r1-eth1')
|
||||||
|
self.addLink(switch[2], router[2], intfName2='r2-eth0')
|
||||||
|
# switch 3 is between RIP routers
|
||||||
|
switch[3] = self.addSwitch('sw3', cls=topotest.LegacySwitch)
|
||||||
|
self.addLink(switch[3], router[2], intfName2='r2-eth1')
|
||||||
|
self.addLink(switch[3], router[3], intfName2='r3-eth1')
|
||||||
|
# switch 4 is stub on remote RIP router
|
||||||
|
switch[4] = self.addSwitch('sw4', cls=topotest.LegacySwitch)
|
||||||
|
self.addLink(switch[4], router[3], intfName2='r3-eth0')
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#####################################################
|
||||||
|
##
|
||||||
|
## Tests starting
|
||||||
|
##
|
||||||
|
#####################################################
|
||||||
|
|
||||||
|
def setup_module(module):
|
||||||
|
global topo, net
|
||||||
|
|
||||||
|
print("\n\n** %s: Setup Topology" % module.__name__)
|
||||||
|
print("******************************************\n")
|
||||||
|
|
||||||
|
print("Cleanup old Mininet runs")
|
||||||
|
os.system('sudo mn -c > /dev/null 2>&1')
|
||||||
|
|
||||||
|
thisDir = os.path.dirname(os.path.realpath(__file__))
|
||||||
|
topo = NetworkTopo()
|
||||||
|
|
||||||
|
net = Mininet(controller=None, topo=topo)
|
||||||
|
net.start()
|
||||||
|
|
||||||
|
# Starting Routers
|
||||||
|
#
|
||||||
|
for i in range(1, 4):
|
||||||
|
net['r%s' % i].loadConf('zebra', '%s/r%s/zebra.conf' % (thisDir, i))
|
||||||
|
net['r%s' % i].loadConf('ripd', '%s/r%s/ripd.conf' % (thisDir, i))
|
||||||
|
net['r%s' % i].startRouter()
|
||||||
|
|
||||||
|
# For debugging after starting Quagga/FRR daemons, uncomment the next line
|
||||||
|
# CLI(net)
|
||||||
|
|
||||||
|
|
||||||
|
def teardown_module(module):
|
||||||
|
global net
|
||||||
|
|
||||||
|
print("\n\n** %s: Shutdown Topology" % module.__name__)
|
||||||
|
print("******************************************\n")
|
||||||
|
|
||||||
|
# End - Shutdown network
|
||||||
|
net.stop()
|
||||||
|
|
||||||
|
|
||||||
|
def test_router_running():
|
||||||
|
global fatal_error
|
||||||
|
global net
|
||||||
|
|
||||||
|
# Skip if previous fatal error condition is raised
|
||||||
|
if (fatal_error != ""):
|
||||||
|
pytest.skip(fatal_error)
|
||||||
|
|
||||||
|
print("\n\n** Check if FRR/Quagga is running on each Router node")
|
||||||
|
print("******************************************\n")
|
||||||
|
sleep(5)
|
||||||
|
|
||||||
|
# Starting Routers
|
||||||
|
for i in range(1, 4):
|
||||||
|
fatal_error = net['r%s' % i].checkRouterRunning()
|
||||||
|
assert fatal_error == "", fatal_error
|
||||||
|
|
||||||
|
# For debugging after starting FRR/Quagga daemons, uncomment the next line
|
||||||
|
# CLI(net)
|
||||||
|
|
||||||
|
|
||||||
|
def test_converge_protocols():
|
||||||
|
global fatal_error
|
||||||
|
global net
|
||||||
|
|
||||||
|
# Skip if previous fatal error condition is raised
|
||||||
|
if (fatal_error != ""):
|
||||||
|
pytest.skip(fatal_error)
|
||||||
|
|
||||||
|
thisDir = os.path.dirname(os.path.realpath(__file__))
|
||||||
|
|
||||||
|
print("\n\n** Waiting for protocols convergence")
|
||||||
|
print("******************************************\n")
|
||||||
|
|
||||||
|
# Not really implemented yet - just sleep 60 secs for now
|
||||||
|
sleep(60)
|
||||||
|
|
||||||
|
# For debugging after starting FRR/Quagga daemons, uncomment the next line
|
||||||
|
# CLI(net)
|
||||||
|
|
||||||
|
|
||||||
|
def test_rip_status():
|
||||||
|
global fatal_error
|
||||||
|
global net
|
||||||
|
|
||||||
|
# Skip if previous fatal error condition is raised
|
||||||
|
if (fatal_error != ""):
|
||||||
|
pytest.skip(fatal_error)
|
||||||
|
|
||||||
|
thisDir = os.path.dirname(os.path.realpath(__file__))
|
||||||
|
|
||||||
|
# Verify RIP Status
|
||||||
|
print("\n\n** Verifing RIP status")
|
||||||
|
print("******************************************\n")
|
||||||
|
failures = 0
|
||||||
|
for i in range(1, 4):
|
||||||
|
refTableFile = '%s/r%s/rip_status.ref' % (thisDir, i)
|
||||||
|
if os.path.isfile(refTableFile):
|
||||||
|
# Read expected result from file
|
||||||
|
expected = open(refTableFile).read().rstrip()
|
||||||
|
# Fix newlines (make them all the same)
|
||||||
|
expected = ('\n'.join(expected.splitlines()) + '\n').splitlines(1)
|
||||||
|
|
||||||
|
# Actual output from router
|
||||||
|
actual = net['r%s' % i].cmd('vtysh -c "show ip rip status" 2> /dev/null').rstrip()
|
||||||
|
# Drop time in next due
|
||||||
|
actual = re.sub(r"in [0-9]+ seconds", "in XX seconds", actual)
|
||||||
|
# Drop time in last update
|
||||||
|
actual = re.sub(r" [0-2][0-9]:[0-5][0-9]:[0-5][0-9]", " XX:XX:XX", actual)
|
||||||
|
# Fix newlines (make them all the same)
|
||||||
|
actual = ('\n'.join(actual.splitlines()) + '\n').splitlines(1)
|
||||||
|
|
||||||
|
# Generate Diff
|
||||||
|
diff = ''.join(difflib.context_diff(actual, expected,
|
||||||
|
fromfile="actual IP RIP status",
|
||||||
|
tofile="expected IP RIP status"))
|
||||||
|
|
||||||
|
# Empty string if it matches, otherwise diff contains unified diff
|
||||||
|
if diff:
|
||||||
|
sys.stderr.write('r%s failed IP RIP status check:\n%s\n' % (i, diff))
|
||||||
|
failures += 1
|
||||||
|
else:
|
||||||
|
print("r%s ok" % i)
|
||||||
|
|
||||||
|
assert failures == 0, "IP RIP status failed for router r%s:\n%s" % (i, diff)
|
||||||
|
|
||||||
|
# For debugging after starting FRR/Quagga daemons, uncomment the next line
|
||||||
|
# CLI(net)
|
||||||
|
|
||||||
|
|
||||||
|
def test_rip_routes():
|
||||||
|
global fatal_error
|
||||||
|
global net
|
||||||
|
|
||||||
|
# Skip if previous fatal error condition is raised
|
||||||
|
if (fatal_error != ""):
|
||||||
|
pytest.skip(fatal_error)
|
||||||
|
|
||||||
|
thisDir = os.path.dirname(os.path.realpath(__file__))
|
||||||
|
|
||||||
|
# Verify RIP Status
|
||||||
|
print("\n\n** Verifing RIP routes")
|
||||||
|
print("******************************************\n")
|
||||||
|
failures = 0
|
||||||
|
for i in range(1, 4):
|
||||||
|
refTableFile = '%s/r%s/show_ip_rip.ref' % (thisDir, i)
|
||||||
|
if os.path.isfile(refTableFile):
|
||||||
|
# Read expected result from file
|
||||||
|
expected = open(refTableFile).read().rstrip()
|
||||||
|
# Fix newlines (make them all the same)
|
||||||
|
expected = ('\n'.join(expected.splitlines()) + '\n').splitlines(1)
|
||||||
|
|
||||||
|
# Actual output from router
|
||||||
|
actual = net['r%s' % i].cmd('vtysh -c "show ip rip" 2> /dev/null').rstrip()
|
||||||
|
# Drop Time
|
||||||
|
actual = re.sub(r"[0-9][0-9]:[0-5][0-9]", "XX:XX", actual)
|
||||||
|
# Fix newlines (make them all the same)
|
||||||
|
actual = ('\n'.join(actual.splitlines()) + '\n').splitlines(1)
|
||||||
|
|
||||||
|
# Generate Diff
|
||||||
|
diff = ''.join(difflib.context_diff(actual, expected,
|
||||||
|
fromfile="actual SHOW IP RIP",
|
||||||
|
tofile="expected SHOW IP RIP"))
|
||||||
|
|
||||||
|
# Empty string if it matches, otherwise diff contains unified diff
|
||||||
|
if diff:
|
||||||
|
sys.stderr.write('r%s failed SHOW IP RIP check:\n%s\n' % (i, diff))
|
||||||
|
failures += 1
|
||||||
|
else:
|
||||||
|
print("r%s ok" % i)
|
||||||
|
|
||||||
|
assert failures == 0, "SHOW IP RIP failed for router r%s:\n%s" % (i, diff)
|
||||||
|
|
||||||
|
# For debugging after starting FRR/Quagga daemons, uncomment the next line
|
||||||
|
# CLI(net)
|
||||||
|
|
||||||
|
|
||||||
|
def test_zebra_ipv4_routingTable():
|
||||||
|
global fatal_error
|
||||||
|
global net
|
||||||
|
|
||||||
|
# Skip if previous fatal error condition is raised
|
||||||
|
if (fatal_error != ""):
|
||||||
|
pytest.skip(fatal_error)
|
||||||
|
|
||||||
|
thisDir = os.path.dirname(os.path.realpath(__file__))
|
||||||
|
|
||||||
|
# Verify OSPFv3 Routing Table
|
||||||
|
print("\n\n** Verifing Zebra IPv4 Routing Table")
|
||||||
|
print("******************************************\n")
|
||||||
|
failures = 0
|
||||||
|
for i in range(1, 4):
|
||||||
|
refTableFile = '%s/r%s/show_ip_route.ref' % (thisDir, i)
|
||||||
|
if os.path.isfile(refTableFile):
|
||||||
|
# Read expected result from file
|
||||||
|
expected = open(refTableFile).read().rstrip()
|
||||||
|
# Fix newlines (make them all the same)
|
||||||
|
expected = ('\n'.join(expected.splitlines()) + '\n').splitlines(1)
|
||||||
|
|
||||||
|
# Actual output from router
|
||||||
|
actual = net['r%s' % i].cmd('vtysh -c "show ip route" 2> /dev/null | grep "^R"').rstrip()
|
||||||
|
# Drop timers on end of line (older Quagga Versions)
|
||||||
|
actual = re.sub(r", [0-2][0-9]:[0-5][0-9]:[0-5][0-9]", "", actual)
|
||||||
|
# Fix newlines (make them all the same)
|
||||||
|
actual = ('\n'.join(actual.splitlines()) + '\n').splitlines(1)
|
||||||
|
|
||||||
|
# Generate Diff
|
||||||
|
diff = ''.join(difflib.context_diff(actual, expected,
|
||||||
|
fromfile="actual Zebra IPv4 routing table",
|
||||||
|
tofile="expected Zebra IPv4 routing table"))
|
||||||
|
|
||||||
|
# Empty string if it matches, otherwise diff contains unified diff
|
||||||
|
if diff:
|
||||||
|
sys.stderr.write('r%s failed Zebra IPv4 Routing Table Check:\n%s\n' % (i, diff))
|
||||||
|
failures += 1
|
||||||
|
else:
|
||||||
|
print("r%s ok" % i)
|
||||||
|
|
||||||
|
assert failures == 0, "Zebra IPv4 Routing Table verification failed for router r%s:\n%s" % (i, diff)
|
||||||
|
|
||||||
|
# For debugging after starting FRR/Quagga daemons, uncomment the next line
|
||||||
|
# CLI(net)
|
||||||
|
|
||||||
|
|
||||||
|
def test_shutdown_check_stderr():
|
||||||
|
global fatal_error
|
||||||
|
global net
|
||||||
|
|
||||||
|
# Skip if previous fatal error condition is raised
|
||||||
|
if (fatal_error != ""):
|
||||||
|
pytest.skip(fatal_error)
|
||||||
|
|
||||||
|
if os.environ.get('TOPOTESTS_CHECK_STDERR') is None:
|
||||||
|
pytest.skip('Skipping test for Stderr output and memory leaks')
|
||||||
|
|
||||||
|
thisDir = os.path.dirname(os.path.realpath(__file__))
|
||||||
|
|
||||||
|
print("\n\n** Verifing unexpected STDERR output from daemons")
|
||||||
|
print("******************************************\n")
|
||||||
|
|
||||||
|
net['r1'].stopRouter()
|
||||||
|
|
||||||
|
log = net['r1'].getStdErr('ripd')
|
||||||
|
print("\nRIPd StdErr Log:\n" + log)
|
||||||
|
log = net['r1'].getStdErr('zebra')
|
||||||
|
print("\nZebra StdErr Log:\n" + log)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
|
||||||
|
setLogLevel('info')
|
||||||
|
# To suppress tracebacks, either use the following pytest call or add "--tb=no" to cli
|
||||||
|
# retval = pytest.main(["-s", "--tb=no"])
|
||||||
|
retval = pytest.main(["-s"])
|
||||||
|
sys.exit(retval)
|
Loading…
Reference in New Issue
Block a user