blob: 5ac729181e0ec99e692b6397c64b5f22f995eb5d [file] [log] [blame]
#
# Copyright 2016-present Ciena Corporation
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
import unittest
from nose.tools import *
from scapy.all import *
from OnosCtrl import OnosCtrl, get_mac
from OltConfig import OltConfig
from OnosFlowCtrl import OnosFlowCtrl
from onosclidriver import OnosCliDriver
#from quaggaclidriver import QuaggaCliDriver
from CordContainer import Container, Onos, Quagga
from CordTestServer import cord_test_onos_restart, cord_test_quagga_restart, cord_test_quagga_stop, cord_test_quagga_shell
from portmaps import g_subscriber_port_map
from CordLogger import CordLogger
import threading
import time
import os
import json
import pexpect
import random
from netaddr.ip import IPNetwork, IPAddress
#from cli import quagga
#from quagga import *
#from cli import requires
#from cli import system
#from generic import *
log.setLevel('INFO')
class ipv6vrouter_exchange(CordLogger):
apps = ('org.onosproject.vrouter', 'org.onosproject.fwd')
device_id = 'of:' + get_mac()
vrouter_device_dict = { "devices" : {
"{}".format(device_id) : {
"basic" : {
"driver" : "softrouter"
}
}
},
}
zebra_conf = '''
password zebra
log stdout
service advanced-vty
!
!debug zebra rib
!debug zebra kernel
!debug zebra fpm
!
interface eth1
ipv6 address 2001::10/32
line vty
exec-timeout 0 0
'''
#! ip address 10.10.0.3/16
test_path = os.path.dirname(os.path.realpath(__file__))
quagga_config_path = os.path.join(test_path, '..', 'setup/quagga-config')
onos_config_path = os.path.join(test_path, '..', 'setup/onos-config')
GATEWAY = '1000:10:0:0:0:0:0:164'
INGRESS_PORT = 1
EGRESS_PORT = 2
MAX_PORTS = 100
peer_list = [ ('2001:0:10:0:0:0:10:1', '00:00:00:00:00:01'), ('2001:0:20:0:0:0:20:1', '00:00:00:00:02:01'), ]
network_list = []
network_mask = 64
default_routes_address = ('1001:0:10:0::/32',)
default_peer_address = peer_list
quagga_ip = os.getenv('QUAGGA_IP')
@classmethod
def setUpClass(cls):
''' Activate the vrouter apps'''
cls.olt = OltConfig()
cls.port_map, _ = cls.olt.olt_port_map()
if not cls.port_map:
cls.port_map = g_subscriber_port_map
time.sleep(3)
cls.load_device_id()
@classmethod
def tearDownClass(cls):
'''Deactivate the vrouter apps'''
cls.vrouter_host_unload()
cls.start_onos(network_cfg = {})
@classmethod
def load_device_id(cls):
did = OnosCtrl.get_device_id()
cls.device_id = did
cls.vrouter_device_dict = { "devices" : {
"{}".format(did) : {
"basic" : {
"driver" : "softrouter"
}
}
},
}
def cliEnter(self):
retries = 0
while retries < 3:
self.cli = OnosCliDriver(connect = True)
if self.cli.handle:
break
else:
retries += 1
time.sleep(2)
def cliExit(self):
self.cli.disconnect()
@classmethod
def onos_load_config(cls, config):
status, code = OnosCtrl.config(config)
if status is False:
log.info('JSON request returned status %d' %code)
assert_equal(status, True)
@classmethod
def vrouter_config_get(cls, networks = 4, peers = 1, peer_address = None,
route_update = None, router_address = None, specific_peer = None):
vrouter_configs = cls.generate_vrouter_conf(networks = networks, peers = peers,specific_peer = specific_peer,
peer_address = peer_address, router_address = router_address)
return vrouter_configs
@classmethod
def host_config_load(cls, host_config = None):
for host in host_config:
status, code = OnosCtrl.host_config(host)
if status is False:
log.info('JSON request returned status %d' %code)
assert_equal(status, True)
@classmethod
def generate_host_config(cls,hosts_list=None):
num = 1
hosts_dict = {}
if hosts_list is not None:
hosts = hosts_list
else:
hosts = cls.peer_list
for host, mac in hosts:
port = num if num < cls.MAX_PORTS - 1 else cls.MAX_PORTS - 1
hosts_dict[host] = {'mac':mac, 'vlan':'none', 'ipAddresses':[host], 'location':{ 'elementId' : '{}'.format(cls.device_id), 'port': port}}
num += 1
return hosts_dict.values()
@classmethod
def vrouter_host_load(cls, peer_address = None):
index = 1
peer_info = peer_address if peer_address is not None else cls.peer_list
for host,_ in peer_info:
iface = cls.port_map[index]
index += 1
log.info('Assigning ip %s to interface %s' %(host, iface))
config_cmds = ( 'ifconfig {} 0'.format(iface),
'ifconfig {0} inet6 add {1}/64'.format(iface, host),
'arping -I {0} {1} -c 2'.format(iface, host),
)
for cmd in config_cmds:
os.system(cmd)
@classmethod
def vrouter_host_unload(cls, peer_address = None):
index = 1
peer_info = peer_address if peer_address is not None else cls.peer_list
for host,_ in peer_info:
iface = cls.port_map[index]
index += 1
config_cmds = ('ifconfig {} 0'.format(iface), )
for cmd in config_cmds:
os.system(cmd)
@classmethod
def start_onos(cls, network_cfg = None):
if type(network_cfg) is tuple:
res = []
for v in network_cfg:
res += v.items()
config = dict(res)
else:
config = network_cfg
log.info('Restarting ONOS with new network configuration %s'%config)
return cord_test_onos_restart(config = config)
@classmethod
def randomipv6(cls, subnet='2001::', prefix=64):
random.seed()
ipv6_address = IPAddress(subnet) + random.getrandbits(16)
ipv6_network = IPNetwork(ipv6_address)
ipv6_network.prefixlen = prefix
output = '{},{}'.format(ipv6_address,ipv6_network)
return '{}'.format(ipv6_address),'{}'.format(ipv6_network)
@classmethod
def start_quagga(cls, networks = 4, peer_address = None, router_address = None):
log.info('Peer address in quagga start is %s'%peer_address)
log.info('Restarting Quagga container with configuration for %d networks' %(networks))
config = cls.generate_conf(networks = networks, peer_address = peer_address, router_address = router_address)
if networks <= 10000:
boot_delay = 25
else:
delay_map = [60, 100, 150, 200, 300, 450, 600, 800, 1000, 1200]
n = min(networks/100000, len(delay_map)-1)
boot_delay = delay_map[n]
cord_test_quagga_restart(config = config, boot_delay = boot_delay)
@classmethod
def generate_vrouter_conf(cls, networks = 4, peers = 1, peer_address = None, specific_peer = None,router_address = None):
num = 0
count = 0
if peer_address is None:
start_peer = ( 10 << 16 )
end_peer = ( 9999 << 16 )
else:
ip = peer_address[0][0]
start_ip = ip.split(':')
start_peer = ( int(start_ip[6]) << 16)
end_peer = ( 9999 << 16 )
local_network = end_peer + 1
ports_dict = { 'ports' : {} }
interface_list = []
peer_list = []
for n in xrange(start_peer, end_peer, 65536):
port_map = ports_dict['ports']
port = num+1 if count < cls.MAX_PORTS - 1 else cls.MAX_PORTS - 1
device_port_key = '{0}/{1}'.format(cls.device_id, port)
try:
interfaces = port_map[device_port_key]['interfaces']
except:
port_map[device_port_key] = { 'interfaces' : [] }
interfaces = port_map[device_port_key]['interfaces']
if specific_peer is None:
peer_ip = '2001:0:0:0:0:0:' + '%s:1'%( ( n >> 16 ) & 0xffff )
else:
start_ip[6] = '%s'%( ( n >> 16 ) & 0xffff )
start_ip[-1] = '1'
peer_ip = ':'.join(start_ip)
peer_nt = peer_ip + '/112'
mac = RandMAC()._fix()
peer_list.append((peer_ip, mac))
log.info('peer ip is %s and and peer network is %s'%(peer_ip,peer_nt))
if num < cls.MAX_PORTS - 1:
interface_dict = { 'name' : 'b1-{}'.format(port), 'ips': [peer_nt], 'mac' : mac }
interfaces.append(interface_dict)
interface_list.append(interface_dict['name'])
else:
interfaces[0]['ips'].append(peer_nt)
num += 1
if num == peers:
break
quagga_dict = { 'apps': { 'org.onosproject.router' : { 'router' : {}, 'bgp' : { 'bgpSpeakers' : [] } } } }
quagga_router_dict = quagga_dict['apps']['org.onosproject.router']['router']
quagga_router_dict['ospfEnabled'] = True
quagga_router_dict['interfaces'] = interface_list
quagga_router_dict['controlPlaneConnectPoint'] = '{0}/{1}'.format(cls.device_id, peers + 1)
#bgp_speaker_dict = { 'apps': { 'org.onosproject.router' : { 'bgp' : { 'bgpSpeakers' : [] } } } }
bgp_speakers_list = quagga_dict['apps']['org.onosproject.router']['bgp']['bgpSpeakers']
speaker_dict = {}
speaker_dict['name'] = 'bgp{}'.format(peers+1)
speaker_dict['connectPoint'] = '{0}/{1}'.format(cls.device_id, peers + 1)
speaker_dict['peers'] = peer_list
bgp_speakers_list.append(speaker_dict)
cls.peer_list = peer_list
return (cls.vrouter_device_dict, ports_dict, quagga_dict)
@classmethod
def generate_conf(cls, networks = 4, peer_address = None, router_address = None):
num = 0
if router_address is None:
start_network = ( 10 << 16 )
end_network = ( 9999 << 16 )
network_mask = 112
else:
ip = router_address
start_ip = ip.split(':')
network_mask = int(start_ip[7].split('/')[1])
start_network = (int(start_ip[6]) << 16)
end_network = (9999 << 16)
net_list = []
peer_list = peer_address if peer_address is not None else cls.peer_list
network_list = []
for n in xrange(start_network, end_network, 65536):
if router_address is None:
net = '3001:0:0:0:0:0:' + '%s:0'%( ( n >> 16 ) & 0xffff )
else:
start_ip[6] = '%s'%( ( n >> 16 ) & 0xffff )
net = ':'.join((start_ip[0],start_ip[1],start_ip[2],start_ip[3],start_ip[4],start_ip[5],start_ip[6],start_ip[7][0]))
network_list.append(net)
gateway = peer_list[num % len(peer_list)][0]
net_route = 'ipv6 route {0}/{1} {2}'.format(net, network_mask, gateway)
net_list.append(net_route)
num += 1
if num == networks:
break
cls.network_list = network_list
cls.network_mask = network_mask
zebra_routes = '\n'.join(net_list)
return cls.zebra_conf + zebra_routes
@classmethod
def vrouter_activate(cls, deactivate = False):
app = 'org.onosproject.vrouter'
onos_ctrl = OnosCtrl(app)
if deactivate is True:
onos_ctrl.deactivate()
else:
onos_ctrl.activate()
time.sleep(3)
@classmethod
def vrouter_configure(cls, networks = 4, peers = 1, peer_address = None,specific_peer = None,
route_update = None, router_address = None, time_expire = None, adding_new_routes = None):
vrouter_configs = cls.vrouter_config_get(networks = networks, peers = peers,specific_peer = specific_peer,
peer_address = peer_address, route_update = route_update)
cls.start_onos(network_cfg = vrouter_configs)
hostcfg = cls.generate_host_config()
cls.host_config_load(host_config = hostcfg)
##Start quagga
cls.start_quagga(networks = networks, peer_address = peer_address, router_address = router_address)
return vrouter_configs
def vrouter_port_send_recv(self, ingress, egress, dst_mac, dst_ip, positive_test = True):
src_mac = '00:00:00:00:00:02'
src_ip = '1000:11:12:13:14:15:16:17'
self.success = False if positive_test else True
timeout = 10 if positive_test else 1
count = 2 if positive_test else 1
self.start_sending = True
def recv_task():
def recv_cb(pkt):
log.info('Pkt seen with ingress ip %s, egress ip %s' %(pkt[IP].src, pkt[IP].dst))
self.success = True if positive_test else False
sniff(count=count, timeout=timeout,
lfilter = lambda p: IP in p and p[IP].dst == dst_ip and p[IP].src == src_ip,
prn = recv_cb, iface = self.port_map[ingress])
self.start_sending = False
t = threading.Thread(target = recv_task)
t.start()
L2 = Ether(src = src_mac, dst = dst_mac)
L3 = IPv6(src=src_ip,dst = dst_ip)
pkt = L2/L3
log.info('Sending a packet with dst ip %s, dst mac %s on port %s to verify if flows are correct' %
(dst_ip, dst_mac, self.port_map[egress]))
while self.start_sending is True:
sendp(pkt, count=50, iface = self.port_map[egress])
t.join()
assert_equal(self.success, True)
def vrouter_traffic_verify(self, positive_test = True, peer_address = None):
if peer_address is None:
peers = len(self.peer_list)
peer_list = self.peer_list
else:
peers = len(peer_address)
peer_list = peer_address
egress = peers + 1
num = 0
num_hosts = 5 if positive_test else 1
src_mac = '00:00:00:00:00:02'
src_ip = '1000:11:12:13:14:15:16:17'
last_bytes = [1234,8364,7360,'0af3','fdac']
for network in self.network_list:
num_ips = num_hosts
octets = network.split(':')
for byte in last_bytes:
octets[-1] = str(byte)
dst_ip = ':'.join(octets)
dst_mac = peer_list[ num % peers ] [1]
port = (num % peers)
ingress = port + 1
#Since peers are on the same network
##Verify if flows are setup by sending traffic across
self.vrouter_port_send_recv(ingress, egress, dst_mac, dst_ip, positive_test = positive_test)
num += 1
def __vrouter_network_verify(self, networks, peers = 1, positive_test = True,
start_network = None, start_peer_address = None, route_update = None,
invalid_peers = None, time_expire = None, unreachable_route_traffic = None,
deactivate_activate_vrouter = None, adding_new_routes = None,
specific_peer = None):
_, ports_map, egress_map = self.vrouter_configure(networks = networks, peers = peers,
peer_address = start_peer_address,
route_update = route_update,
router_address = start_network,
time_expire = time_expire,
adding_new_routes = adding_new_routes,
specific_peer = specific_peer)
if self.network_list > 50:
wait = len(self.network_list)/20
time.sleep(wait)
log.info('waiting for %d seconds to verify routes in ONOS'%wait)
else:
time.sleep(5)
self.cliEnter()
routes = json.loads(self.cli.routes(jsonFormat = True))
assert_equal(len(routes['routes6']), networks)
if invalid_peers is None:
self.vrouter_traffic_verify()
if time_expire is True:
self.start_quagga(networks = networks, peer_address = start_peer_address, router_address = '12.10.10.1/24')
self.vrouter_traffic_verify()
if unreachable_route_traffic is True:
network_list_backup = self.network_list
self.network_list = ['1:1:1:1:1:1:1:1','2:2:2:2:2:2:2:2','3:3:3:3:3:3:3:3','4:4:4:4:4:4:4:4']
self.vrouter_traffic_verify(positive_test = False)
self.network_list = network_list_backup
if deactivate_activate_vrouter is True:
log.info('Deactivating vrouter app in ONOS controller for negative scenario')
self.vrouter_activate(deactivate = True)
#routes = json.loads(self.cli.routes(jsonFormat = False, cmd_exist = False))
#assert_equal(len(routes['routes4']), 'Command not found')
log.info('Activating vrouter app again in ONOS controller for negative scenario')
self.vrouter_activate(deactivate = False)
if self.network_list > 50:
wait = len(self.network_list)/20
time.sleep(wait)
log.info('waiting for %d seconds to verify routes in ONOS'%wait)
else:
time.sleep(5)
routes = json.loads(self.cli.routes(jsonFormat = True))
assert_equal(len(routes['routes4']), networks)
self.vrouter_traffic_verify()
self.cliExit()
return True
def __vrouter_network_verify_negative(self, networks, peers = 1):
##Stop quagga. Test traffic again to see if flows were removed
log.info('Stopping Quagga container')
cord_test_quagga_stop()
self.vrouter_traffic_verify(positive_test = False)
log.info('OVS flows have been removed successfully after Quagga was stopped')
self.start_quagga(networks = networks)
self.vrouter_traffic_verify()
log.info('OVS flows have been successfully reinstalled after Quagga was restarted')
def quagga_shell(self, cmd):
shell_cmds = ('vtysh', '"conf t"', '"{}"'.format(cmd))
quagga_cmd = ' -c '.join(shell_cmds)
return cord_test_quagga_shell(quagga_cmd)
def test_vrouter_ipv6_with_5_routes(self):
res = self.__vrouter_network_verify(5, peers = 1)
assert_equal(res, True)
def test_vrouter_ipv6_with_5_routes_quagga_restart_without_config(self):
res = self.__vrouter_network_verify(5, peers = 1)
assert_equal(res, True)
log.info('Restart Quagga container without config retain')
cord_test_quagga_restart()
self.vrouter_traffic_verify(positive_test = False)
def test_vrouter_ipv6_with_5_routes_quagga_restart_with_config(self):
res = self.__vrouter_network_verify(5, peers = 1)
assert_equal(res, True)
log.info('verifying vrouter traffic after Quagga restart with config retain')
#cord_test_quagga_restart()
self.start_quagga(networks=5)
self.vrouter_traffic_verify(positive_test = True)
def test_vrouter_ipv6_with_5_routes_quagga_stop(self):
res = self.__vrouter_network_verify(5, peers = 1)
assert_equal(res, True)
log.info('verifying vrouter traffic after Quagga stop')
cord_test_quagga_stop()
self.vrouter_traffic_verify(positive_test = False)
def test_vrouter_ipv6_with_5_routes_quagga_stop_and_start(self):
res = self.__vrouter_network_verify(5, peers = 1)
assert_equal(res, True)
log.info('verifying vrouter traffic after Quagga stop and start again')
cord_test_quagga_stop()
self.vrouter_traffic_verify(positive_test = False)
self.start_quagga(networks=5)
self.vrouter_traffic_verify(positive_test = True)
def test_vrouter_ipv6_with_5_routes_onos_restart_without_config(self):
res = self.__vrouter_network_verify(5, peers = 1)
assert_equal(res, True)
log.info('verifying vrouter traffic after ONOS restart without config retain')
cord_test_onos_restart()
self.vrouter_traffic_verify(positive_test = False)
def test_vrouter_ipv6_with_5_routes_onos_restart_with_config(self):
res = self.__vrouter_network_verify(5, peers = 1)
assert_equal(res, True)
log.info('verifying vrouter traffic after ONOS restart with config retain')
vrouter_configs = self.vrouter_config_get(networks = 5, peers = 1,
peer_address = None, route_update = None)
self.start_onos(network_cfg=vrouter_configs)
mac = RandMAC()._fix()
hostcfg = self.generate_host_config(hosts_list = [('2001:0:0:0:0:0:10:1',mac)])
self.host_config_load(host_config = hostcfg)
time.sleep(10)
self.vrouter_traffic_verify(positive_test = True)
def test_vrouter_ipv6_with_5_routes_restart_quagga_and_onos_with_config(self):
res = self.__vrouter_network_verify(5, peers = 1)
assert_equal(res, True)
log.info('verifying vrouter traffic after Quagga and ONOS restart with config retain')
#cord_test_quagga_restart()
self.start_quagga(networks=5)
vrouter_configs = self.vrouter_config_get(networks = 5, peers = 1,
peer_address = None, route_update = None)
self.start_onos(network_cfg = vrouter_configs)
mac = RandMAC()._fix()
hostcfg = self.generate_host_config(hosts_list = [('2001:0:0:0:0:0:10:1',mac)])
self.host_config_load(host_config = hostcfg)
time.sleep(10)
self.vrouter_traffic_verify(positive_test = True)
def test_vrouter_ipv6_with_5_routes_2_peers(self):
res = self.__vrouter_network_verify(5, peers = 2)
assert_equal(res, True)
def test_vrouter_ipv6_with_6_routes_3_peers(self):
res = self.__vrouter_network_verify(6, peers = 3)
assert_equal(res, True)
def test_vrouter_ipv6_with_50_routes(self):
res = self.__vrouter_network_verify(50, peers = 1)
assert_equal(res, True)
def test_vrouter_ipv6_with_50_routes_5_peers(self):
res = self.__vrouter_network_verify(50, peers = 5)
assert_equal(res, True)
def test_vrouter_ipv6_with_100_routes(self):
res = self.__vrouter_network_verify(100, peers = 1)
assert_equal(res, True)
def test_vrouter_ipv6_with_100_routes_10_peers(self):
res = self.__vrouter_network_verify(100, peers = 10)
assert_equal(res, True)
def test_vrouter_ipv6_with_300_routes(self):
res = self.__vrouter_network_verify(300, peers = 1)
assert_equal(res, True)
def test_vrouter_ipv6_with_1k_routes(self):
res = self.__vrouter_network_verify(1000, peers = 1)
assert_equal(res, True)
def test_vrouter_ipv6_with_9k_routes(self):
res = self.__vrouter_network_verify(9000, peers = 1)
assert_equal(res, True)
@nottest # Need to implement logic for generating more than 10000 routes
def test_vrouter_ipv6_with_100000_routes(self):
res = self.__vrouter_network_verify(100000, peers = 1)
assert_equal(res, True)
@nottest # Need to implement logic for generating more than 10000 routes
def test_vrouter_ipv6_with_1000000_routes(self):
res = self.__vrouter_network_verify(1000000, peers = 1)
assert_equal(res, True)
def test_vrouter_ipv6_with_route_update(self):
res = self.__vrouter_network_verify(5, peers = 2, positive_test = True)
assert_equal(res, True)
peer_info = [('2001:0:0:0:0:0:72:1', '00:00:00:00:01:01'), ('2001:0:0:0:0:0:73:1', '00:00:00:00:02:01')]
res = self.__vrouter_network_verify(5, peers = 2, positive_test = True,
start_peer_address = peer_info, route_update = True)
assert_equal(res, True)
def test_vrouter_ipv6_with_64bit_mask_route_update(self):
router_address = '3001:0:0:0:0:0:56:0/64'
res = self.__vrouter_network_verify(1, peers = 1, positive_test = True, start_network = router_address)
assert_equal(res, True)
def test_vrouter_ipv6_with_32bit_route_update(self):
router_address = '3112:90c4:836a:7e56:0:0:06:0/32'
res = self.__vrouter_network_verify(1, peers = 1, positive_test = True, start_network = router_address)
assert_equal(res, True)
def test_vrouter_ipv6_with_16bit_route_update(self):
router_address = '9961:9474:0:8472:f30a:0:06:0/16'
res = self.__vrouter_network_verify(1, peers = 1, positive_test = True,start_network = router_address)
assert_equal(res, True)
def test_vrouter_ipv6_with_48bit_route_update(self):
router_address = 'c34a:9737:14cd:8730:0:0:06:0/48'
res = self.__vrouter_network_verify(1, peers = 1, positive_test = True, start_network = router_address)
assert_equal(res, True)
def test_vrouter_ipv6_with_classless_route_update(self):
router_address = '3001:430d:76cb:f56e:873:0:677:0/67'
res = self.__vrouter_network_verify(1, peers = 1, positive_test = True, start_network = router_address)
assert_equal(res, True)
def test_vrouter_ipv6_with_classless_duplicate_route_update(self):
router_address = '3001:8730:732:723:0:0:677:0/116'
res = self.__vrouter_network_verify(5, peers = 1, positive_test = True, start_network = router_address)
assert_equal(res, True)
def test_vrouter_ipv6_with_invalid_peers(self):
peer_info = [('FE80:0:0:0:C800:27FF:10:8', '00:00:00:00:01:01'), ('FE80:0:0:0:C800:27FF:11:8', '00:00:00:00:02:01')]
res = self.__vrouter_network_verify(5, peers = 2, positive_test = True,
start_peer_address = peer_info, specific_peer=True,invalid_peers= True)
assert_equal(res, True)
@nottest
def test_vrouter_with_traffic_sent_between_peers_connected_to_onos(self):
res = self.__vrouter_network_verify(5, peers = 2, positive_test = True, traffic_running_between_peers = True)
assert_equal(res, True)
@nottest
def test_vrouter_with_routes_time_expire(self):
res = self.__vrouter_network_verify(5, peers = 2, positive_test = True, time_expire = True)
assert_equal(res, True)
def test_vrouter_ipv6_with_unreachable_route(self):
res = self.__vrouter_network_verify(5, peers = 2, positive_test = True, unreachable_route_traffic = True)
assert_equal(res, True)
@nottest
def test_vrouter_ipv6_with_enabling_disabling_vrouter_app(self):
res = self.__vrouter_network_verify(5, peers = 2, positive_test = True, deactivate_activate_vrouter = True)
assert_equal(res, True)
def test_vrouter_ipv6_with_adding_new_routes_in_routing_table(self):
res = self.__vrouter_network_verify(5, peers = 2, positive_test = True)
cmd = 'ipv6 route 4001:0:0:0:0:0:677:0/64 2001:0:0:0:0:0:10:1'
self.quagga_shell(cmd)
self.vrouter_traffic_verify()
self.network_list = [ '4001:0:0:0:0:0:677:0' ]
self.network_mask = 64
self.vrouter_traffic_verify()
assert_equal(res, True)
def test_vrouter_ipv6_with_adding_new_routes_in_quagga_routing_table_and_restart(self):
res = self.__vrouter_network_verify(5, peers = 2, positive_test = True)
cmd = 'ipv6 route 4001:0:0:0:0:0:677:0/64 2001:0:0:0:0:0:10:1'
self.quagga_shell(cmd)
self.vrouter_traffic_verify()
self.network_list = [ '4001:0:0:0:0:0:677:0' ]
self.network_mask = 64
self.vrouter_traffic_verify()
log.info('verifying vrouter traffic for added routes after Quagga restart with old config only retain')
#cord_test_quagga_restart()
self.start_quagga(networks=5)
self.vrouter_traffic_verify(positive_test = False)
assert_equal(res, True)
def test_vrouter_ipv6_with_removing_old_routes_in_routing_table(self):
res = self.__vrouter_network_verify(5, peers = 2, positive_test = True)
cmd = 'ipv6 route 4001:0:0:0:0:0:677:0/64 2001:0:0:0:0:0:10:1'
self.quagga_shell(cmd)
self.vrouter_traffic_verify()
old_network_list = self.network_list
old_network_mask = self.network_mask
self.network_list = [ '4001:0:0:0:0:0:677:0' ]
self.network_mask = 64
self.vrouter_traffic_verify()
assert_equal(res, True)
cmd = 'no ipv6 route 4001:0:0:0:0:0:677:0/64 2001:0:0:0:0:0:10:1'
self.quagga_shell(cmd)
time.sleep(5)
self.vrouter_traffic_verify(positive_test = False)
self.network_mask = old_network_mask
self.network_list = old_network_list
self.vrouter_traffic_verify(positive_test = True)
def test_vrouter_ipv6_modifying_nexthop_route_in_routing_table(self):
peer_info = [('2001:0:0:0:0:0:12:1', '00:00:00:00:01:01'), ('2001:0:0:0:0:0:13:1', '00:00:00:00:02:01')]
router_address = '3001:0:0:0:0:0:677:0/112'
res = self.__vrouter_network_verify(1, peers = 1, positive_test = True,
start_peer_address = peer_info, start_network = router_address)
cmd = 'no ipv6 route 3001:0:0:0:0:0:677:0/112 2001:0:0:0:0:0:18:1'
self.quagga_shell(cmd)
self.vrouter_traffic_verify(positive_test = True)
assert_equal(res, True)
def test_vrouter_ipv6_deleting_alternative_nexthop_in_routing_table(self):
peer_info = [('2001:0:0:0:0:0:12:1', '00:00:00:00:01:01'), ('2001:0:0:0:0:0:13:1', '00:00:00:00:02:01')]
router_address = '3001:0:0:0:0:0:677:0/112'
res = self.__vrouter_network_verify(1, peers = 2, positive_test = True,
start_peer_address = peer_info, start_network = router_address)
cmd = 'no ipv6 route 3001:0:0:0:0:0:677:0/112 2001:0:0:0:0:0:12:1'
self.quagga_shell(cmd)
time.sleep(5)
self.vrouter_traffic_verify(positive_test = False)
assert_equal(res, True)
def test_vrouter_ipv6_deleting_some_routes_in_routing_table(self):
peer_info = [('2001:0:0:0:0:0:12:1', '00:00:00:00:01:01'), ('2001:0:0:0:0:0:13:1', '00:00:00:00:02:01')]
router_address = '3001:0:0:0:0:0:677:0/112'
res = self.__vrouter_network_verify(10, peers = 2, positive_test = True,
start_peer_address = peer_info, start_network = router_address)
cmd = 'no ipv6 route 3001:0:0:0:0:0:677:0/112 2001:0:0:0:0:0:12:1'
self.quagga_shell(cmd)
cmd = 'no ipv6 route 3001:0:0:0:0:0:678:0/112 2001:0:0:0:0:0:13:1'
self.quagga_shell(cmd)
cmd = 'no ipv6 route 3001:0:0:0:0:0:679:0/112 2001:0:0:0:0:0:12:1'
self.quagga_shell(cmd)
self.vrouter_traffic_verify(positive_test = True)
assert_equal(res, True)
def test_vrouter_ipv6_deleting_some_routes_in_quagga_routing_table_and_restart(self):
peer_info = [('2001:0:0:0:0:0:12:1', '00:00:00:00:01:01'), ('2001:0:0:0:0:0:13:1', '00:00:00:00:02:01')]
router_address = '3001:0:0:0:0:0:677:0/112'
res = self.__vrouter_network_verify(10, peers = 2, positive_test = True,
start_peer_address = peer_info, start_network = router_address)
cmd = 'no ipv6 route 3001:0:0:0:0:0:677:0/112 2001:0:0:0:0:0:12:1'
self.quagga_shell(cmd)
cmd = 'no ipv6 route 3001:0:0:0:0:0:678:0/112 2001:0:0:0:0:0:13:1'
self.quagga_shell(cmd)
cmd = 'no ipv6 route 3001:0:0:0:0:0:679:0/112 2001:0:0:0:0:0:12:1'
self.quagga_shell(cmd)
self.network_list = [ '3001:0:0:0:0:0:677:0','3001:0:0:0:0:0:678:0','3001:0:0:0:0:0:679:0' ]
self.network_mask = 112
self.vrouter_traffic_verify(positive_test = False)
self.network_list = [ '3001:0:0:0:0:0:680:0','3001:0:0:0:0:0:681:0' ]
self.vrouter_traffic_verify(positive_test = True)
#cord_test_quagga_restart()
self.start_quagga(networks=10)
self.network_list = [ '3001:0:0:0:0:0:677:0','3001:0:0:0:0:0:681:0' ]
self.vrouter_traffic_verify(positive_test = True)
assert_equal(res, True)
def test_vrouter_ipv6_deleting_and_adding_routes_in_routing_table(self):
peer_info = [('2001:0:0:0:0:0:12:1', '00:00:00:00:01:01'), ('2001:0:0:0:0:0:13:1', '00:00:00:00:02:01')]
router_address = '3001:0:0:0:0:0:677:0/64'
res = self.__vrouter_network_verify(1, peers = 1, positive_test = True, start_peer_address = peer_info, start_network = router_address)
cmd = 'no ipv6 route 3001:0:0:0:0:0:677:0/64 2001:0:0:0:0:0:12:1'
self.quagga_shell(cmd)
cmd = 'ipv6 route 3001:0:0:0:0:0:677:0/64 2001:0:0:0:0:0:12:1'
self.quagga_shell(cmd)
self.vrouter_traffic_verify(positive_test = True)
assert_equal(res, True)
def test_vrouter_ipv6_toggling_nexthop_interface(self):
peer_info = [('2001:0:0:0:0:0:12:1', '00:00:00:00:01:01'), ('2001:0:0:0:0:0:13:1', '00:00:00:00:02:01')]
router_address = '3001:0:0:0:0:0:677:0/64'
res = self.__vrouter_network_verify(1, peers = 1, positive_test = True, start_peer_address = peer_info, start_network = router_address)
iface = self.port_map[1]
#toggle the interface to trigger host removal.
cmds = ('ifconfig {} down'.format(iface),
'sleep 2',
'ifconfig {} 0'.format(iface),)
for cmd in cmds:
os.system(cmd)
self.vrouter_traffic_verify(positive_test = False)
host = "2001:0:0:0:0:0:12:1"
cmd = 'ifconfig {0} {1} up'.format(iface, host)
os.system(cmd)
#wait for arp refresh
time.sleep(60)
self.vrouter_traffic_verify(positive_test = True)
assert_equal(res, True)