mirror of
https://github.com/osrg/gobgp.git
synced 2024-05-11 05:55:10 +00:00
test: add test for unnumbered bgp feature
Signed-off-by: ISHIDA Wataru <[email protected]>
This commit is contained in:
committed by
FUJITA Tomonori
parent
70a654a238
commit
c7985efcf5
@@ -3,6 +3,7 @@ language: go
|
||||
before_install:
|
||||
- if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then sudo sysctl -w net.ipv6.conf.all.disable_ipv6=0; fi
|
||||
- if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then sudo sysctl -w net.ipv6.conf.default.disable_ipv6=0; fi
|
||||
- if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then sudo sysctl -w net.ipv6.conf.docker0.disable_ipv6=1; fi
|
||||
install: test/scenario_test/ci-scripts/travis-install-script.sh
|
||||
script: test/scenario_test/ci-scripts/travis-build-script.sh
|
||||
|
||||
@@ -32,16 +33,19 @@ matrix:
|
||||
install: go get -t ./...
|
||||
script: go test ./...
|
||||
- go: 1.7
|
||||
before_install: true
|
||||
install: go get -t ./...
|
||||
script: cd gobgpd && go build
|
||||
env:
|
||||
- GOOS=windows
|
||||
- go: 1.7
|
||||
before_install: true
|
||||
install: go get -t ./...
|
||||
script: cd gobgpd && go build
|
||||
env:
|
||||
- GOOS=freebsd
|
||||
- go: 1.7
|
||||
before_install: true
|
||||
install: go get -t ./...
|
||||
script: cd gobgpd && go build
|
||||
env:
|
||||
@@ -163,6 +167,11 @@ matrix:
|
||||
sudo: required
|
||||
services:
|
||||
- docker
|
||||
- env:
|
||||
- TEST=bgp_unnumbered_test.py
|
||||
sudo: required
|
||||
services:
|
||||
- docker
|
||||
|
||||
cache:
|
||||
pip: true
|
||||
|
||||
+23
-13
@@ -293,36 +293,46 @@ class BGPContainer(Container):
|
||||
super(BGPContainer, self).run()
|
||||
return self.WAIT_FOR_BOOT
|
||||
|
||||
def peer_name(self, peer):
|
||||
if peer not in self.peers:
|
||||
raise Exception('not found peer {0}'.format(peer.router_id))
|
||||
name = self.peers[peer]['interface']
|
||||
if name == '':
|
||||
name = self.peers[peer]['neigh_addr'].split('/')[0]
|
||||
return name
|
||||
|
||||
def add_peer(self, peer, passwd=None, vpn=False, is_rs_client=False,
|
||||
policies=None, passive=False,
|
||||
is_rr_client=False, cluster_id=None,
|
||||
flowspec=False, bridge='', reload_config=True, as2=False,
|
||||
graceful_restart=None, local_as=None, prefix_limit=None,
|
||||
v6=False, llgr=None, vrf=''):
|
||||
v6=False, llgr=None, vrf='', interface=''):
|
||||
neigh_addr = ''
|
||||
local_addr = ''
|
||||
it = itertools.product(self.ip_addrs, peer.ip_addrs)
|
||||
if v6:
|
||||
it = itertools.product(self.ip6_addrs, peer.ip6_addrs)
|
||||
|
||||
for me, you in it:
|
||||
if bridge != '' and bridge != me[2]:
|
||||
continue
|
||||
if me[2] == you[2]:
|
||||
neigh_addr = you[1]
|
||||
local_addr = me[1]
|
||||
if v6:
|
||||
addr, mask = local_addr.split('/')
|
||||
local_addr = "{0}%{1}/{2}".format(addr, me[0], mask)
|
||||
break
|
||||
if interface == '':
|
||||
for me, you in it:
|
||||
if bridge != '' and bridge != me[2]:
|
||||
continue
|
||||
if me[2] == you[2]:
|
||||
neigh_addr = you[1]
|
||||
local_addr = me[1]
|
||||
if v6:
|
||||
addr, mask = local_addr.split('/')
|
||||
local_addr = "{0}%{1}/{2}".format(addr, me[0], mask)
|
||||
break
|
||||
|
||||
if neigh_addr == '':
|
||||
raise Exception('peer {0} seems not ip reachable'.format(peer))
|
||||
if neigh_addr == '':
|
||||
raise Exception('peer {0} seems not ip reachable'.format(peer))
|
||||
|
||||
if not policies:
|
||||
policies = {}
|
||||
|
||||
self.peers[peer] = {'neigh_addr': neigh_addr,
|
||||
'interface': interface,
|
||||
'passwd': passwd,
|
||||
'vpn': vpn,
|
||||
'flowspec': flowspec,
|
||||
|
||||
+22
-20
@@ -152,9 +152,7 @@ class GoBGPContainer(BGPContainer):
|
||||
return None
|
||||
|
||||
def _trigger_peer_cmd(self, cmd, peer):
|
||||
if peer not in self.peers:
|
||||
raise Exception('not found peer {0}'.format(peer.router_id))
|
||||
peer_addr = self.peers[peer]['neigh_addr'].split('/')[0]
|
||||
peer_addr = self.peer_name(peer)
|
||||
cmd = 'gobgp neighbor {0} {1}'.format(peer_addr, cmd)
|
||||
self.local(cmd)
|
||||
|
||||
@@ -171,9 +169,7 @@ class GoBGPContainer(BGPContainer):
|
||||
self._trigger_peer_cmd('softreset{0} -a {1}'.format(type, rf), peer)
|
||||
|
||||
def get_local_rib(self, peer, prefix='', rf='ipv4'):
|
||||
if peer not in self.peers:
|
||||
raise Exception('not found peer {0}'.format(peer.router_id))
|
||||
peer_addr = self.peers[peer]['neigh_addr'].split('/')[0]
|
||||
peer_addr = self.peer_name(peer)
|
||||
cmd = 'gobgp -j neighbor {0} local {1} -a {2}'.format(peer_addr, prefix, rf)
|
||||
output = self.local(cmd, capture=True)
|
||||
ret = json.loads(output)
|
||||
@@ -226,9 +222,7 @@ class GoBGPContainer(BGPContainer):
|
||||
t.start()
|
||||
|
||||
def _get_adj_rib(self, adj_type, peer, prefix='', rf='ipv4'):
|
||||
if peer not in self.peers:
|
||||
raise Exception('not found peer {0}'.format(peer.router_id))
|
||||
peer_addr = self.peers[peer]['neigh_addr'].split('/')[0]
|
||||
peer_addr = self.peer_name(peer)
|
||||
cmd = 'gobgp neighbor {0} adj-{1} {2} -a {3} -j'.format(peer_addr,
|
||||
adj_type,
|
||||
prefix, rf)
|
||||
@@ -249,10 +243,7 @@ class GoBGPContainer(BGPContainer):
|
||||
return self._get_adj_rib('out', peer, prefix, rf)
|
||||
|
||||
def get_neighbor(self, peer):
|
||||
if peer not in self.peers:
|
||||
raise Exception('not found peer {0}'.format(peer.router_id))
|
||||
peer_addr = self.peers[peer]['neigh_addr'].split('/')[0]
|
||||
cmd = 'gobgp -j neighbor {0}'.format(peer_addr)
|
||||
cmd = 'gobgp -j neighbor {0}'.format(self.peer_name(peer))
|
||||
return json.loads(self.local(cmd, capture=True))
|
||||
|
||||
def get_neighbor_state(self, peer):
|
||||
@@ -317,13 +308,17 @@ class GoBGPContainer(BGPContainer):
|
||||
|
||||
for peer, info in self.peers.iteritems():
|
||||
afi_safi_list = []
|
||||
version = netaddr.IPNetwork(info['neigh_addr']).version
|
||||
if version == 4:
|
||||
afi_safi_list.append({'config': {'afi-safi-name': 'ipv4-unicast'}})
|
||||
elif version == 6:
|
||||
afi_safi_list.append({'config': {'afi-safi-name': 'ipv6-unicast'}})
|
||||
if info['interface'] != '':
|
||||
afi_safi_list.append({'config':{'afi-safi-name': 'ipv4-unicast'}})
|
||||
afi_safi_list.append({'config':{'afi-safi-name': 'ipv6-unicast'}})
|
||||
else:
|
||||
Exception('invalid ip address version. {0}'.format(version))
|
||||
version = netaddr.IPNetwork(info['neigh_addr']).version
|
||||
if version == 4:
|
||||
afi_safi_list.append({'config':{'afi-safi-name': 'ipv4-unicast'}})
|
||||
elif version == 6:
|
||||
afi_safi_list.append({'config':{'afi-safi-name': 'ipv6-unicast'}})
|
||||
else:
|
||||
Exception('invalid ip address version. {0}'.format(version))
|
||||
|
||||
if info['vpn']:
|
||||
afi_safi_list.append({'config': {'afi-safi-name': 'l3vpn-ipv4-unicast'}})
|
||||
@@ -337,9 +332,16 @@ class GoBGPContainer(BGPContainer):
|
||||
afi_safi_list.append({'config': {'afi-safi-name': 'ipv6-flowspec'}})
|
||||
afi_safi_list.append({'config': {'afi-safi-name': 'l3vpn-ipv6-flowspec'}})
|
||||
|
||||
neigh_addr = None
|
||||
interface = None
|
||||
if info['interface'] == '':
|
||||
neigh_addr = info['neigh_addr'].split('/')[0]
|
||||
else:
|
||||
interface = info['interface']
|
||||
n = {
|
||||
'config': {
|
||||
'neighbor-address': info['neigh_addr'].split('/')[0],
|
||||
'neighbor-address': neigh_addr,
|
||||
'neighbor-interface': interface,
|
||||
'peer-as': peer.asn,
|
||||
'auth-password': info['passwd'],
|
||||
'vrf': info['vrf'],
|
||||
|
||||
@@ -0,0 +1,100 @@
|
||||
# Copyright (C) 2017 Nippon Telegraph and Telephone 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 fabric.api import local
|
||||
from lib import base
|
||||
from lib.base import BGP_FSM_ESTABLISHED
|
||||
from lib.gobgp import GoBGPContainer
|
||||
import sys
|
||||
import os
|
||||
import time
|
||||
import nose
|
||||
from lib.noseplugin import OptionParser, parser_option
|
||||
from itertools import combinations
|
||||
|
||||
|
||||
class GoBGPTestBase(unittest.TestCase):
|
||||
|
||||
@classmethod
|
||||
def setUpClass(cls):
|
||||
gobgp_ctn_image_name = parser_option.gobgp_image
|
||||
base.TEST_PREFIX = parser_option.test_prefix
|
||||
|
||||
g1 = GoBGPContainer(name='g1', asn=65000, router_id='192.168.0.1',
|
||||
ctn_image_name=gobgp_ctn_image_name,
|
||||
log_level=parser_option.gobgp_log_level)
|
||||
g2 = GoBGPContainer(name='g2', asn=65001, router_id='192.168.0.2',
|
||||
ctn_image_name=gobgp_ctn_image_name,
|
||||
log_level=parser_option.gobgp_log_level)
|
||||
ctns = [g1, g2]
|
||||
|
||||
initial_wait_time = max(ctn.run() for ctn in ctns)
|
||||
|
||||
time.sleep(initial_wait_time + 2)
|
||||
|
||||
done = False
|
||||
def f(ifname, ctn):
|
||||
out = ctn.local('ip -6 n', capture=True)
|
||||
l = [line for line in out.split('\n') if ifname in line]
|
||||
if len(l) == 0:
|
||||
return False
|
||||
elif len(l) > 1:
|
||||
raise Exception('not p2p link')
|
||||
return 'REACHABLE' in l[0]
|
||||
|
||||
for i in range(20):
|
||||
g1.local('ping6 -c 1 ff02::1%eth0')
|
||||
g2.local('ping6 -c 1 ff02::1%eth0')
|
||||
if f('eth0', g1) and f('eth0', g2):
|
||||
done = True
|
||||
break
|
||||
time.sleep(1)
|
||||
|
||||
if not done:
|
||||
raise Exception('timeout')
|
||||
|
||||
for a, b in combinations(ctns, 2):
|
||||
a.add_peer(b, interface='eth0')
|
||||
b.add_peer(a, interface='eth0')
|
||||
|
||||
cls.g1 = g1
|
||||
cls.g2 = g2
|
||||
|
||||
# test each neighbor state is turned establish
|
||||
def test_01_neighbor_established(self):
|
||||
self.g1.wait_for(expected_state=BGP_FSM_ESTABLISHED, peer=self.g2)
|
||||
|
||||
def test_02_add_ipv4_route(self):
|
||||
|
||||
self.g1.add_route('10.0.0.0/24')
|
||||
|
||||
time.sleep(1)
|
||||
|
||||
rib = self.g2.get_global_rib(rf='ipv4')
|
||||
self.assertTrue(len(rib) == 1)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
if os.geteuid() is not 0:
|
||||
print "you are not root."
|
||||
sys.exit(1)
|
||||
output = local("which docker 2>&1 > /dev/null ; echo $?", capture=True)
|
||||
if int(output) is not 0:
|
||||
print "docker not found"
|
||||
sys.exit(1)
|
||||
|
||||
nose.main(argv=sys.argv, addplugins=[OptionParser()],
|
||||
defaultTest=sys.argv[0])
|
||||
@@ -75,6 +75,10 @@ PIDS=("${PIDS[@]}" $!)
|
||||
PYTHONPATH=$GOBGP/test python graceful_restart_test.py --gobgp-image $GOBGP_IMAGE --test-prefix gr -s -x --with-xunit --xunit-file=${WS}/nosetest_rs_gr.xml &
|
||||
PIDS=("${PIDS[@]}" $!)
|
||||
|
||||
# bgp unnumbered test
|
||||
sudo -E PYTHONPATH=$GOBGP/test python bgp_unnumbered_test.py --gobgp-image $GOBGP_IMAGE --test-prefix un -s -x --with-xunit --xunit-file=${WS}/nosetest_rs_un.xml &
|
||||
PIDS=("${PIDS[@]}" $!)
|
||||
|
||||
for (( i = 0; i < ${#PIDS[@]}; ++i ))
|
||||
do
|
||||
wait ${PIDS[$i]}
|
||||
|
||||
Reference in New Issue
Block a user