summaryrefslogtreecommitdiffhomepage
path: root/test
diff options
context:
space:
mode:
authorISHIDA Wataru <ishida.wataru@lab.ntt.co.jp>2015-08-03 18:33:37 +0900
committerFUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>2015-08-05 17:24:36 +0900
commitc059eb0f88969bac02aad13771a1bc2c82c2a803 (patch)
tree6deeffcfb90c92bd64b87ee1de560642b8808a1a /test
parentf66133c506585424a0e06bb769e2323b73ecddfb (diff)
test: add scenario test for evpn
Signed-off-by: ISHIDA Wataru <ishida.wataru@lab.ntt.co.jp>
Diffstat (limited to 'test')
-rw-r--r--test/scenario_test/ci-scripts/jenkins-build-script.sh9
-rw-r--r--test/scenario_test/evpn_test.py148
-rw-r--r--test/scenario_test/lib/base.py1
3 files changed, 157 insertions, 1 deletions
diff --git a/test/scenario_test/ci-scripts/jenkins-build-script.sh b/test/scenario_test/ci-scripts/jenkins-build-script.sh
index dabeb3ba..13ae6f9a 100644
--- a/test/scenario_test/ci-scripts/jenkins-build-script.sh
+++ b/test/scenario_test/ci-scripts/jenkins-build-script.sh
@@ -16,6 +16,7 @@ ls -al
git log | head -20
sudo docker rmi $(sudo docker images | grep "^<none>" | awk '{print $3}')
+sudo docker rm -f $(sudo docker ps -a -q)
sudo fab -f $GOBGP/test/scenario_test/lib/base.py make_gobgp_ctn --set tag=$GOBGP_IMAGE
@@ -54,12 +55,18 @@ PID5=$!
sudo -E python ibgp_router_test.py --gobgp-image $GOBGP_IMAGE --test-prefix ibgp -s -x --with-xunit --xunit-file=${WS}/nosetest_ibgp.xml &
PID6=$!
+# evpn test
+sudo -E python evpn_test.py --gobgp-image $GOBGP_IMAGE --test-prefix evpn -s -x --with-xunit --xunit-file=${WS}/nosetest_evpn.xml&
+PID7=$!
+
wait $PID5
RET5=$?
wait $PID6
RET6=$?
+wait $PID7
+RET7=$?
-if [ $RET1 != 0 ] || [ $RET2 != 0 ] || [ $RET3 != 0 ] || [ $RET4 != 0 ] || [ $RET5 != 0 ] || [ $RET6 != 0 ]; then
+if [ $RET1 != 0 ] || [ $RET2 != 0 ] || [ $RET3 != 0 ] || [ $RET4 != 0 ] || [ $RET5 != 0 ] || [ $RET6 != 0 ] || [ $RET7 != 0 ]; then
exit 1
fi
exit 0
diff --git a/test/scenario_test/evpn_test.py b/test/scenario_test/evpn_test.py
new file mode 100644
index 00000000..270773bb
--- /dev/null
+++ b/test/scenario_test/evpn_test.py
@@ -0,0 +1,148 @@
+# Copyright (C) 2015 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.gobgp import *
+from lib.quagga import *
+import sys
+import os
+import time
+import nose
+from noseplugin import OptionParser, parser_option
+from itertools import combinations
+
+def get_mac_mobility_sequence(pattr):
+ for ecs in [p['extended_communities'] for p in pattr
+ if 'type' in p and \
+ p['type'] == BGP_ATTR_TYPE_EXTENDED_COMMUNITIES]:
+ for ec in [e for e in ecs if 'type' in e and e['type'] == 4]:
+ if ec['subtype'] == 5:
+ if 'sequence' not in ec:
+ return 0
+ else:
+ return ec['sequence']
+ return -1
+
+
+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=65000, 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)
+
+ br01 = Bridge(name='br01', subnet='192.168.10.0/24')
+ [br01.addif(ctn) for ctn in ctns]
+
+ for a, b in combinations(ctns, 2):
+ a.add_peer(b, evpn=True)
+ b.add_peer(a, evpn=True)
+
+ 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_evpn_route(self):
+ self.g1.local('gobgp global rib add '
+ '-a evpn macadv 11:22:33:44:55:66 10.0.0.1 1000 1000 '
+ 'rd 10:10 rt 10:10')
+ grib = self.g1.get_global_rib(rf='evpn')
+ self.assertTrue(len(grib) == 1)
+ dst = grib[0]
+ self.assertTrue(len(dst['paths']) == 1)
+ path = dst['paths'][0]
+ self.assertTrue(path['nexthop'] == '0.0.0.0')
+
+ interval = 1
+ timeout = int(30/interval)
+ done = False
+ for _ in range(timeout):
+ if done:
+ break
+ grib = self.g2.get_global_rib(rf='evpn')
+
+ if len(grib) < 1:
+ time.sleep(interval)
+ continue
+
+ self.assertTrue(len(grib) == 1)
+ dst = grib[0]
+ self.assertTrue(len(dst['paths']) == 1)
+ path = dst['paths'][0]
+ n_addrs = [i[1].split('/')[0] for i in self.g1.ip_addrs]
+ self.assertTrue(path['nexthop'] in n_addrs)
+ done = True
+
+ def test_03_check_mac_mobility(self):
+ self.g2.local('gobgp global rib add '
+ '-a evpn macadv 11:22:33:44:55:66 10.0.0.1 1000 1000 '
+ 'rd 10:20 rt 10:10')
+
+ time.sleep(3)
+
+ grib = self.g1.get_global_rib(rf='evpn')
+ self.assertTrue(len(grib) == 1)
+ dst = grib[0]
+ self.assertTrue(len(dst['paths']) == 1)
+ path = dst['paths'][0]
+ n_addrs = [i[1].split('/')[0] for i in self.g2.ip_addrs]
+ self.assertTrue(path['nexthop'] in n_addrs)
+ self.assertTrue(get_mac_mobility_sequence(path['attrs']) == 0)
+
+ def test_04_check_mac_mobility_again(self):
+ self.g1.local('gobgp global rib add '
+ '-a evpn macadv 11:22:33:44:55:66 10.0.0.1 1000 1000 '
+ 'rd 10:20 rt 10:10')
+
+ time.sleep(3)
+
+ grib = self.g2.get_global_rib(rf='evpn')
+ self.assertTrue(len(grib) == 1)
+ dst = grib[0]
+ self.assertTrue(len(dst['paths']) == 1)
+ path = dst['paths'][0]
+ n_addrs = [i[1].split('/')[0] for i in self.g1.ip_addrs]
+ self.assertTrue(path['nexthop'] in n_addrs)
+ self.assertTrue(get_mac_mobility_sequence(path['attrs']) == 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])
diff --git a/test/scenario_test/lib/base.py b/test/scenario_test/lib/base.py
index 6fc40e36..274a68cf 100644
--- a/test/scenario_test/lib/base.py
+++ b/test/scenario_test/lib/base.py
@@ -36,6 +36,7 @@ BGP_ATTR_TYPE_AS_PATH = 2
BGP_ATTR_TYPE_NEXT_HOP = 3
BGP_ATTR_TYPE_MULTI_EXIT_DISC = 4
BGP_ATTR_TYPE_LOCAL_PREF = 5
+BGP_ATTR_TYPE_EXTENDED_COMMUNITIES = 16
def get_bridges():