summaryrefslogtreecommitdiffhomepage
path: root/test/scenario_test/evpn_test.py
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/scenario_test/evpn_test.py
parentf66133c506585424a0e06bb769e2323b73ecddfb (diff)
test: add scenario test for evpn
Signed-off-by: ISHIDA Wataru <ishida.wataru@lab.ntt.co.jp>
Diffstat (limited to 'test/scenario_test/evpn_test.py')
-rw-r--r--test/scenario_test/evpn_test.py148
1 files changed, 148 insertions, 0 deletions
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])