summaryrefslogtreecommitdiffhomepage
path: root/test/scenario_test/route_server_policy_test.py
diff options
context:
space:
mode:
authorFUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>2015-10-16 23:20:30 +0900
committerFUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>2015-10-16 23:20:30 +0900
commitfffd98da1d98eeba91aabeb1cade3312552be5df (patch)
tree27ff1c556d37f8f43a0d7db216d0d00b27d55c87 /test/scenario_test/route_server_policy_test.py
parent9883ef81b0a3b8855a210f33147165b7fd0cb333 (diff)
scenario_test: refactor route_server_policy_test
Currently, it's not easy to add or delete a test because it's necessary to specify a number for each test by hand. Instead, let's assign a number for each test automatically. Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
Diffstat (limited to 'test/scenario_test/route_server_policy_test.py')
-rw-r--r--test/scenario_test/route_server_policy_test.py6055
1 files changed, 3089 insertions, 2966 deletions
diff --git a/test/scenario_test/route_server_policy_test.py b/test/scenario_test/route_server_policy_test.py
index 7acaecc6..ae6ea9fc 100644
--- a/test/scenario_test/route_server_policy_test.py
+++ b/test/scenario_test/route_server_policy_test.py
@@ -23,21 +23,25 @@ import sys
import os
import time
import nose
+import inspect
from noseplugin import OptionParser, parser_option
-scenarios = {}
+counter = 1
+_SCENARIOS = {}
-def scenario(idx):
- def wrapped(f):
- if idx not in scenarios:
- scenarios[idx] = {}
- if f.__name__ in scenarios[idx]:
- raise Exception('scenario index {0}. already exists'.format(idx))
+def register_scenario(cls):
+ global counter
+ _SCENARIOS[counter] = cls
+ counter += 1
- scenarios[idx][f.__name__] = f
- return wrapped
+
+def lookup_scenario(name):
+ for value in _SCENARIOS.values():
+ if value.__name__ == name:
+ return value
+ return None
def wait_for(f, timeout=120):
@@ -53,2811 +57,2851 @@ def wait_for(f, timeout=120):
raise Exception('timeout')
-"""
- No.1 import-policy test
- --------------------------------
- e1 ->(192.168.2.0/24)-> | -> q1-rib -> q1-adj-rib-out | --> q1
- | |
- | ->x q2-rib |
- --------------------------------
-"""
-@scenario(1)
-def boot(env):
- gobgp_ctn_image_name = env.parser_option.gobgp_image
- log_level = env.parser_option.gobgp_log_level
- g1 = GoBGPContainer(name='g1', asn=65000, router_id='192.168.0.1',
- ctn_image_name=gobgp_ctn_image_name,
- log_level=log_level)
- e1 = ExaBGPContainer(name='e1', asn=65001, router_id='192.168.0.2')
- q1 = QuaggaBGPContainer(name='q1', asn=65002, router_id='192.168.0.3')
- q2 = QuaggaBGPContainer(name='q2', asn=65003, router_id='192.168.0.4')
-
- ctns = [g1, e1, q1, q2]
- 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 q in [e1, q1, q2]:
- g1.add_peer(q, is_rs_client=True)
- q.add_peer(g1)
-
- env.g1 = g1
- env.e1 = e1
- env.q1 = q1
- env.q2 = q2
-
-@scenario(1)
-def setup(env):
- g1 = env.g1
- e1 = env.e1
- q1 = env.q1
- q2 = env.q2
-
- p0 = {'IpPrefix': '192.168.0.0/16',
- 'MasklengthRange': '16..24'}
-
- ps0 = {'PrefixSetName': 'ps0',
- 'PrefixList': [p0]}
- g1.set_prefix_set(ps0)
-
- n0 = {'Address': g1.peers[e1]['neigh_addr'].split('/')[0]}
-
- ns0 = {'NeighborSetName': 'ns0',
- 'NeighborInfoList': [n0]}
- g1.set_neighbor_set(ns0)
-
- st0 = {'Name': 'st0',
- 'Conditions': {
- 'MatchPrefixSet': {'PrefixSet': ps0['PrefixSetName']},
- 'MatchNeighborSet': {'NeighborSet': ns0['NeighborSetName']}}}
-
- policy = {'name': 'policy0',
- 'type': 'import',
- 'statements': [st0]}
- g1.add_policy(policy, q2)
-
- # this will be blocked
- e1.add_route('192.168.2.0/24')
- # this will pass
- e1.add_route('192.168.2.0/15')
-
- for c in [e1, q1, q2]:
- g1.wait_for(BGP_FSM_ESTABLISHED, c)
-
-
-@scenario(1)
-def check(env):
- wait_for(lambda: len(env.g1.get_local_rib(env.q1)) == 2)
- wait_for(lambda: len(env.g1.get_adj_rib_out(env.q1)) == 2)
- wait_for(lambda: len(env.q1.get_global_rib()) == 2)
- wait_for(lambda: len(env.g1.get_local_rib(env.q2)) == 1)
- wait_for(lambda: len(env.g1.get_adj_rib_out(env.q2)) == 1)
- wait_for(lambda: len(env.q2.get_global_rib()) == 1)
-
-"""
- No.2 export-policy test
- --------------------------------
- e1 ->(192.168.2.0/24)-> | -> q1-rib -> q1-adj-rib-out | --> q1
- | |
- | -> q2-rib ->x q2-adj-rib-out |
- --------------------------------
-"""
-@scenario(2)
-def boot(env):
- scenarios[1]['boot'](env)
-
-@scenario(2)
-def setup(env):
- g1 = env.g1
- e1 = env.e1
- q1 = env.q1
- q2 = env.q2
-
- p0 = {'IpPrefix': '192.168.0.0/16',
- 'MasklengthRange': '16..24'}
-
- ps0 = {'PrefixSetName': 'ps0',
- 'PrefixList': [p0]}
- g1.set_prefix_set(ps0)
-
- n0 = {'Address': g1.peers[q2]['neigh_addr'].split('/')[0]}
-
- ns0 = {'NeighborSetName': 'ns0',
- 'NeighborInfoList': [n0]}
- g1.set_neighbor_set(ns0)
-
- st0 = {'Name': 'st0',
- 'Conditions': {
- 'MatchPrefixSet': {'PrefixSet': ps0['PrefixSetName']},
- 'MatchNeighborSet': {'NeighborSet': ns0['NeighborSetName']}}}
-
- policy = {'name': 'policy0',
- 'type': 'export',
- 'statements': [st0]}
- g1.add_policy(policy, q2)
-
- # this will be blocked
- e1.add_route('192.168.2.0/24')
- # this will pass
- e1.add_route('192.168.2.0/15')
-
- for c in [e1, q1, q2]:
- g1.wait_for(BGP_FSM_ESTABLISHED, c)
-
-@scenario(2)
-def check(env):
- g1 = env.g1
- q1 = env.q1
- q2 = env.q2
- wait_for(lambda : len(g1.get_local_rib(q1)) == 2)
- wait_for(lambda : len(g1.get_adj_rib_out(q1)) == 2)
- wait_for(lambda : len(q1.get_global_rib()) == 2)
- wait_for(lambda : len(g1.get_local_rib(q2)) == 2)
- wait_for(lambda : len(g1.get_adj_rib_out(q2)) == 1)
- wait_for(lambda : len(q2.get_global_rib()) == 1)
-
-"""
- No.3 import-policy update test
-
- r1:192.168.2.0/24
- r2:192.168.20.0/24
- r3:192.168.200.0/24
- -------------------------------------------------
- | q1 |
- e1 ->(r1,r2,r3)-> | ->(r1,r2,r3)-> rib ->(r1,r2,r3)-> adj-rib-out | ->(r1,r2,r3)-> q1
- | |
- | q2 |
- | ->(r1)-> rib ->(r1)-> adj-rib-out | ->(r1)-> q2
- -------------------------------------------------
- |
- update gobgp.conf
- |
- V
- -------------------------------------------------
- | q1 |
- e1 ->(r1,r2,r3)-> | ->(r1,r2,r3)-> rib ->(r1,r2,r3)-> adj-rib-out | ->(r1,r2,r3)-> q1
- | |
- | q2 |
- | ->(r1,r3)-> rib ->(r1,r3)-> adj-rib-out | ->(r1,r3)-> q2
- -------------------------------------------------
-"""
-@scenario(3)
-def boot(env):
- scenarios[1]['boot'](env)
-
-@scenario(3)
-def setup(env):
- g1 = env.g1
- e1 = env.e1
- q1 = env.q1
- q2 = env.q2
-
- p0 = {'IpPrefix': '192.168.20.0/24'}
- p1 = {'IpPrefix': '192.168.200.0/24'}
-
- ps0 = {'PrefixSetName': 'ps0',
- 'PrefixList': [p0, p1]}
- g1.set_prefix_set(ps0)
-
- n0 = {'Address': g1.peers[e1]['neigh_addr'].split('/')[0]}
-
- ns0 = {'NeighborSetName': 'ns0',
- 'NeighborInfoList': [n0]}
- g1.set_neighbor_set(ns0)
-
- st0 = {'Name': 'st0',
- 'Conditions': {
- 'MatchPrefixSet': {'PrefixSet': ps0['PrefixSetName']},
- 'MatchNeighborSet': {'NeighborSet': ns0['NeighborSetName']}}}
-
- policy = {'name': 'policy0',
- 'type': 'import',
- 'statements': [st0]}
- g1.add_policy(policy, q2)
-
- e1.add_route('192.168.2.0/24')
- e1.add_route('192.168.20.0/24')
- e1.add_route('192.168.200.0/24')
-
- for c in [e1, q1, q2]:
- g1.wait_for(BGP_FSM_ESTABLISHED, c)
-
-@scenario(3)
-def check(env):
- g1 = env.g1
- e1 = env.e1
- q1 = env.q1
- q2 = env.q2
- wait_for(lambda : len(g1.get_local_rib(q1)) == 3)
- wait_for(lambda : len(g1.get_adj_rib_out(q1)) == 3)
- wait_for(lambda : len(q1.get_global_rib()) == 3)
- wait_for(lambda : len(g1.get_local_rib(q2)) == 1)
- wait_for(lambda : len(g1.get_adj_rib_out(q2)) == 1)
- wait_for(lambda : len(q2.get_global_rib()) == 1)
-
-@scenario(3)
-def setup2(env):
- g1 = env.g1
- e1 = env.e1
- q1 = env.q1
- q2 = env.q2
- g1.clear_policy()
-
- p0 = {'IpPrefix': '192.168.20.0/24'}
-
- ps0 = {'PrefixSetName': 'ps0',
- 'PrefixList': [p0]}
- g1.set_prefix_set(ps0)
-
- n0 = {'Address': g1.peers[e1]['neigh_addr'].split('/')[0]}
-
- ns0 = {'NeighborSetName': 'ns0',
- 'NeighborInfoList': [n0]}
- g1.set_neighbor_set(ns0)
-
- st0 = {'Name': 'st0',
- 'Conditions': {'MatchPrefixSet': {'PrefixSet': ps0['PrefixSetName']},
- 'MatchNeighborSet': {'NeighborSet': ns0['NeighborSetName']}}}
-
- policy = {'name': 'policy0',
- 'type': 'import',
- 'statements': [st0]}
- g1.add_policy(policy, q2)
- g1.softreset(e1)
-
-@scenario(3)
-def check2(env):
- g1 = env.g1
- e1 = env.e1
- q1 = env.q1
- q2 = env.q2
- wait_for(lambda : len(g1.get_local_rib(q1)) == 3)
- wait_for(lambda : len(g1.get_adj_rib_out(q1)) == 3)
- wait_for(lambda : len(q1.get_global_rib()) == 3)
- wait_for(lambda : len(g1.get_local_rib(q2)) == 2)
- wait_for(lambda : len(g1.get_adj_rib_out(q2)) == 2)
- wait_for(lambda : len(q2.get_global_rib()) == 2)
-
-"""
- No.4 export-policy update test
-
- r1:192.168.2.0
- r2:192.168.20.0
- r3:192.168.200.0
- -------------------------------------------------
- | q1 |
- e1 ->(r1,r2,r3)-> | ->(r1,r2,r3)-> rib ->(r1,r2,r3)-> adj-rib-out | ->(r1,r2,r3)-> q1
- | |
- | q2 |
- | ->(r1,r2,r3)-> rib ->(r1)-> adj-rib-out | ->(r1)-> q2
- -------------------------------------------------
- |
- update gobgp.conf
- |
- V
- -------------------------------------------------
- | q1 |
- e1 ->(r1,r2,r3)-> | ->(r1,r2,r3)-> rib ->(r1,r2,r3)-> adj-rib-out | ->(r1,r2,r3)-> q1
- | |
- | q2 |
- | ->(r1,r2,r3)-> rib ->(r1,r3)-> adj-rib-out | ->(r1,r3)-> q2
- -------------------------------------------------
-"""
-@scenario(4)
-def boot(env):
- scenarios[1]['boot'](env)
-
-@scenario(4)
-def setup(env):
- g1 = env.g1
- e1 = env.e1
- q1 = env.q1
- q2 = env.q2
- p0 = {'IpPrefix': '192.168.20.0/24'}
- p1 = {'IpPrefix': '192.168.200.0/24'}
-
- ps0 = {'PrefixSetName': 'ps0',
- 'PrefixList': [p0, p1]}
- g1.set_prefix_set(ps0)
-
- n0 = {'Address': g1.peers[q2]['neigh_addr'].split('/')[0]}
-
- ns0 = {'NeighborSetName': 'ns0',
- 'NeighborInfoList': [n0]}
- g1.set_neighbor_set(ns0)
-
- st0 = {'Name': 'st0',
- 'Conditions': {'MatchPrefixSet': {'PrefixSet': ps0['PrefixSetName']},
- 'MatchNeighborSet': {'NeighborSet': ns0['NeighborSetName']}}}
-
- policy = {'name': 'policy0',
- 'type': 'export',
- 'statements': [st0]}
- g1.add_policy(policy, q2)
-
- e1.add_route('192.168.2.0/24')
- e1.add_route('192.168.20.0/24')
- e1.add_route('192.168.200.0/24')
-
- for c in [e1, q1, q2]:
- g1.wait_for(BGP_FSM_ESTABLISHED, c)
-
-@scenario(4)
-def check(env):
- g1 = env.g1
- e1 = env.e1
- q1 = env.q1
- q2 = env.q2
- wait_for(lambda : len(g1.get_local_rib(q1)) == 3)
- wait_for(lambda : len(g1.get_adj_rib_out(q1)) == 3)
- wait_for(lambda : len(q1.get_global_rib()) == 3)
- wait_for(lambda : len(g1.get_local_rib(q2)) == 3)
- wait_for(lambda : len(g1.get_adj_rib_out(q2)) == 1)
- wait_for(lambda : len(q2.get_global_rib()) == 1)
-
-@scenario(4)
-def setup2(env):
- g1 = env.g1
- e1 = env.e1
- q1 = env.q1
- q2 = env.q2
- g1.clear_policy()
-
- p0 = {'IpPrefix': '192.168.20.0/24'}
-
- ps0 = {'PrefixSetName': 'ps0',
- 'PrefixList': [p0]}
- g1.set_prefix_set(ps0)
-
- n0 = {'Address': g1.peers[q2]['neigh_addr'].split('/')[0]}
-
- ns0 = {'NeighborSetName': 'ns0',
- 'NeighborInfoList': [n0]}
- g1.set_neighbor_set(ns0)
-
- st0 = {'Name': 'st0',
- 'Conditions': {'MatchPrefixSet': {'PrefixSet': ps0['PrefixSetName']},
- 'MatchNeighborSet': {'NeighborSet': ns0['NeighborSetName']}}}
-
- policy = {'name': 'policy0',
- 'type': 'export',
- 'statements': [st0]}
- g1.add_policy(policy, q2)
-
- # we need hard reset to flush q2's local rib
- g1.reset(e1)
-
- for c in [e1, q1, q2]:
- g1.wait_for(BGP_FSM_ESTABLISHED, c)
-
-
-@scenario(4)
-def check2(env):
- g1 = env.g1
- e1 = env.e1
- q1 = env.q1
- q2 = env.q2
- wait_for(lambda : len(g1.get_local_rib(q1)) == 3)
- wait_for(lambda : len(g1.get_adj_rib_out(q1)) == 3)
- wait_for(lambda : len(q1.get_global_rib()) == 3)
- wait_for(lambda : len(g1.get_local_rib(q2)) == 3)
- wait_for(lambda : len(g1.get_adj_rib_out(q2)) == 2)
- wait_for(lambda : len(q2.get_global_rib()) == 2)
-
-"""
- No.5 IPv6 import-policy test
-
- r1=2001::/64
- r2=2001::/63
- -------------------------------------------------
- e1 ->(r1,r2)-> | ->(r1,r2)-> q1-rib ->(r1,r2)-> q1-adj-rib-out | ->(r1,r2)-> q1
- | |
- | ->(r2) -> q2-rib ->(r2) -> q2-adj-rib-out | ->(r2)-> q2
- -------------------------------------------------
-"""
-@scenario(5)
-def boot(env):
- gobgp_ctn_image_name = env.parser_option.gobgp_image
- log_level = env.parser_option.gobgp_log_level
- g1 = GoBGPContainer(name='g1', asn=65000, router_id='192.168.0.1',
- ctn_image_name=gobgp_ctn_image_name,
- log_level=log_level)
- e1 = ExaBGPContainer(name='e1', asn=65001, router_id='192.168.0.2')
- q1 = QuaggaBGPContainer(name='q1', asn=65002, router_id='192.168.0.3')
- q2 = QuaggaBGPContainer(name='q2', asn=65003, router_id='192.168.0.4')
-
- ctns = [g1, e1, q1, q2]
- initial_wait_time = max(ctn.run() for ctn in ctns)
- time.sleep(initial_wait_time)
-
- br01 = Bridge(name='br01', subnet='2001::/96')
- [br01.addif(ctn) for ctn in ctns]
-
- for q in [e1, q1, q2]:
- g1.add_peer(q, is_rs_client=True)
- q.add_peer(g1)
-
- env.g1 = g1
- env.e1 = e1
- env.q1 = q1
- env.q2 = q2
-
-@scenario(5)
-def setup(env):
- g1 = env.g1
- e1 = env.e1
- q1 = env.q1
- q2 = env.q2
-
- p0 = {'IpPrefix': '2001::/32',
- 'MasklengthRange': '64..128'}
-
- ps0 = {'PrefixSetName': 'ps0',
- 'PrefixList': [p0]}
- g1.set_prefix_set(ps0)
-
- n0 = {'Address': g1.peers[e1]['neigh_addr'].split('/')[0]}
-
- ns0 = {'NeighborSetName': 'ns0',
- 'NeighborInfoList': [n0]}
- g1.set_neighbor_set(ns0)
-
- st0 = {'Name': 'st0',
- 'Conditions': {
- 'MatchPrefixSet': {'PrefixSet': ps0['PrefixSetName']},
- 'MatchNeighborSet': {'NeighborSet': ns0['NeighborSetName']}}}
-
- policy = {'name': 'policy0',
- 'type': 'import',
- 'statements': [st0]}
- g1.add_policy(policy, q2)
-
- # this will be blocked
- e1.add_route('2001::/64', rf='ipv6')
- # this will pass
- e1.add_route('2001::/63', rf='ipv6')
-
- for c in [e1, q1, q2]:
- g1.wait_for(BGP_FSM_ESTABLISHED, c)
-
-@scenario(5)
-def check(env):
- wait_for(lambda: len(env.g1.get_local_rib(env.q1, rf='ipv6')) == 2)
- wait_for(lambda: len(env.g1.get_adj_rib_out(env.q1, rf='ipv6')) == 2)
- wait_for(lambda: len(env.q1.get_global_rib(rf='ipv6')) == 2)
- wait_for(lambda: len(env.g1.get_local_rib(env.q2, rf='ipv6')) == 1)
- wait_for(lambda: len(env.g1.get_adj_rib_out(env.q2, rf='ipv6')) == 1)
- wait_for(lambda: len(env.q2.get_global_rib(rf='ipv6')) == 1)
-
-"""
- No.6 IPv6 export-policy test
-
- r1=2001::/64
- r2=2001::/63
- -------------------------------------------------
- e1 ->(r1,r2)-> | ->(r1,r2)-> q1-rib ->(r1,r2)-> q1-adj-rib-out | ->(r1,r2)-> q1
- | |
- | ->(r1,r2)-> q2-rib ->(r2) -> q2-adj-rib-out | ->(r2)-> q2
- -------------------------------------------------
-"""
-@scenario(6)
-def boot(env):
- scenarios[5]['boot'](env)
-
-@scenario(6)
-def setup(env):
- g1 = env.g1
- e1 = env.e1
- q1 = env.q1
- q2 = env.q2
-
- p0 = {'IpPrefix': '2001::/32',
- 'MasklengthRange': '64..128'}
-
- ps0 = {'PrefixSetName': 'ps0',
- 'PrefixList': [p0]}
- g1.set_prefix_set(ps0)
-
- n0 = {'Address': g1.peers[q2]['neigh_addr'].split('/')[0]}
-
- ns0 = {'NeighborSetName': 'ns0',
- 'NeighborInfoList': [n0]}
- g1.set_neighbor_set(ns0)
-
- st0 = {'Name': 'st0',
- 'Conditions': {
- 'MatchPrefixSet': {'PrefixSet': ps0['PrefixSetName']},
- 'MatchNeighborSet': {'NeighborSet': ns0['NeighborSetName']}}}
-
- policy = {'name': 'policy0',
- 'type': 'export',
- 'statements': [st0]}
- g1.add_policy(policy, q2)
-
- # this will be blocked
- e1.add_route('2001::/64', rf='ipv6')
- # this will pass
- e1.add_route('2001::/63', rf='ipv6')
-
- for c in [e1, q1, q2]:
- g1.wait_for(BGP_FSM_ESTABLISHED, c)
-
-@scenario(6)
-def check(env):
- wait_for(lambda: len(env.g1.get_local_rib(env.q1, rf='ipv6')) == 2)
- wait_for(lambda: len(env.g1.get_adj_rib_out(env.q1, rf='ipv6')) == 2)
- wait_for(lambda: len(env.q1.get_global_rib(rf='ipv6')) == 2)
- wait_for(lambda: len(env.g1.get_local_rib(env.q2, rf='ipv6')) == 2)
- wait_for(lambda: len(env.g1.get_adj_rib_out(env.q2, rf='ipv6')) == 1)
- wait_for(lambda: len(env.q2.get_global_rib(rf='ipv6')) == 1)
-
-"""
- No.7 IPv6 import-policy update test
- r1=2001:0:10:2::/64
- r2=2001:0:10:20::/64
- r3=2001:0:10:200::/64
- -------------------------------------------------
- | q1 |
- e1 ->(r1,r2,r3)-> | ->(r1,r2,r3)-> rib ->(r1,r2,r3)-> adj-rib-out | ->(r1,r2,r3)-> q1
- | |
- | q2 |
- | ->(r1)-> rib ->(r1)-> adj-rib-out | ->(r1)-> q2
- -------------------------------------------------
- |
- update gobgp.conf
- |
- V
- -------------------------------------------------
- | q1 |
- e1 ->(r1,r2,r3)-> | ->(r1,r2,r3)-> rib ->(r1,r2,r3)-> adj-rib-out | ->(r1,r2,r3)-> q1
- | |
- | q2 |
- | ->(r1,r3)-> rib ->(r1,r3)-> adj-rib-out | ->(r1,r3)-> q2
- -------------------------------------------------
-"""
-@scenario(7)
-def boot(env):
- scenarios[5]['boot'](env)
-
-@scenario(7)
-def setup(env):
- g1 = env.g1
- e1 = env.e1
- q1 = env.q1
- q2 = env.q2
-
- p0 = {'IpPrefix': '2001:0:10:2::/64'}
- p1 = {'IpPrefix': '2001:0:10:20::/64'}
-
- ps0 = {'PrefixSetName': 'ps0',
- 'PrefixList': [p0, p1]}
- g1.set_prefix_set(ps0)
-
- n0 = {'Address': g1.peers[e1]['neigh_addr'].split('/')[0]}
-
- ns0 = {'NeighborSetName': 'ns0',
- 'NeighborInfoList': [n0]}
- g1.set_neighbor_set(ns0)
-
- st0 = {'Name': 'st0',
- 'Conditions': {
- 'MatchPrefixSet': {'PrefixSet': ps0['PrefixSetName']},
- 'MatchNeighborSet': {'NeighborSet': ns0['NeighborSetName']}}}
-
- policy = {'name': 'policy0',
- 'type': 'import',
- 'statements': [st0]}
- g1.add_policy(policy, q2)
-
- e1.add_route('2001:0:10:2::/64', rf='ipv6')
- e1.add_route('2001:0:10:20::/64', rf='ipv6')
- e1.add_route('2001:0:10:200::/64', rf='ipv6')
-
- for c in [e1, q1, q2]:
- g1.wait_for(BGP_FSM_ESTABLISHED, c)
-
-@scenario(7)
-def check(env):
- wait_for(lambda: len(env.g1.get_local_rib(env.q1, rf='ipv6')) == 3)
- wait_for(lambda: len(env.g1.get_adj_rib_out(env.q1, rf='ipv6')) == 3)
- wait_for(lambda: len(env.q1.get_global_rib(rf='ipv6')) == 3)
- wait_for(lambda: len(env.g1.get_local_rib(env.q2, rf='ipv6')) == 1)
- wait_for(lambda: len(env.g1.get_adj_rib_out(env.q2, rf='ipv6')) == 1)
- wait_for(lambda: len(env.q2.get_global_rib(rf='ipv6')) == 1)
-
-@scenario(7)
-def setup2(env):
- g1 = env.g1
- e1 = env.e1
- q1 = env.q1
- q2 = env.q2
-
- p0 = {'IpPrefix': '2001:0:10:2::/64'}
-
- ps0 = {'PrefixSetName': 'ps0',
- 'PrefixList': [p0]}
- g1.set_prefix_set(ps0)
-
- n0 = {'Address': g1.peers[e1]['neigh_addr'].split('/')[0]}
-
- ns0 = {'NeighborSetName': 'ns0',
- 'NeighborInfoList': [n0]}
- g1.set_neighbor_set(ns0)
-
- st0 = {'Name': 'st0',
- 'Conditions': {
- 'MatchPrefixSet': {'PrefixSet': ps0['PrefixSetName']},
- 'MatchNeighborSet': {'NeighborSet': ns0['NeighborSetName']}}}
-
- policy = {'name': 'policy0',
- 'type': 'import',
- 'statements': [st0]}
- g1.add_policy(policy, q2)
- g1.softreset(e1, rf='ipv6')
-
-@scenario(7)
-def check2(env):
- wait_for(lambda: len(env.g1.get_local_rib(env.q1, rf='ipv6')) == 3)
- wait_for(lambda: len(env.g1.get_adj_rib_out(env.q1, rf='ipv6')) == 3)
- wait_for(lambda: len(env.q1.get_global_rib(rf='ipv6')) == 3)
- wait_for(lambda: len(env.g1.get_local_rib(env.q2, rf='ipv6')) == 2)
- wait_for(lambda: len(env.g1.get_adj_rib_out(env.q2, rf='ipv6')) == 2)
- wait_for(lambda: len(env.q2.get_global_rib(rf='ipv6')) == 2)
-
-"""
- No.8 IPv6 export-policy update test
- r1=2001:0:10:2::/64
- r2=2001:0:10:20::/64
- r3=2001:0:10:200::/64
- -------------------------------------------------
- | q1 |
- e1 ->(r1,r2,r3)-> | ->(r1,r2,r3)-> rib ->(r1,r2,r3)-> adj-rib-out | ->(r1,r2,r3)-> q1
- | |
- | q2 |
- | ->(r1,r2,r3)-> rib ->(r1)-> adj-rib-out | ->(r1)-> q2
- -------------------------------------------------
- |
- update gobgp.conf
- |
- V
- -------------------------------------------------
- | q1 |
- e1 ->(r1,r2,r3)-> | ->(r1,r2,r3)-> rib ->(r1,r2,r3)-> adj-rib-out | ->(r1,r2,r3)-> q1
- | |
- | q2 |
- | ->(r1,r2,r3)-> rib ->(r1,r3)-> adj-rib-out | ->(r1,r3)-> q2
- -------------------------------------------------
-"""
-@scenario(8)
-def boot(env):
- scenarios[5]['boot'](env)
-
-@scenario(8)
-def setup(env):
- g1 = env.g1
- e1 = env.e1
- q1 = env.q1
- q2 = env.q2
-
- p0 = {'IpPrefix': '2001:0:10:2::/64'}
- p1 = {'IpPrefix': '2001:0:10:20::/64'}
-
- ps0 = {'PrefixSetName': 'ps0',
- 'PrefixList': [p0, p1]}
- g1.set_prefix_set(ps0)
-
- n0 = {'Address': g1.peers[q2]['neigh_addr'].split('/')[0]}
-
- ns0 = {'NeighborSetName': 'ns0',
- 'NeighborInfoList': [n0]}
- g1.set_neighbor_set(ns0)
-
- st0 = {'Name': 'st0',
- 'Conditions': {
- 'MatchPrefixSet': {'PrefixSet': ps0['PrefixSetName']},
- 'MatchNeighborSet': {'NeighborSet': ns0['NeighborSetName']}}}
-
- policy = {'name': 'policy0',
- 'type': 'export',
- 'statements': [st0]}
- g1.add_policy(policy, q2)
-
- e1.add_route('2001:0:10:2::/64', rf='ipv6')
- e1.add_route('2001:0:10:20::/64', rf='ipv6')
- e1.add_route('2001:0:10:200::/64', rf='ipv6')
-
- for c in [e1, q1, q2]:
- g1.wait_for(BGP_FSM_ESTABLISHED, c)
-
-@scenario(8)
-def check(env):
- wait_for(lambda: len(env.g1.get_local_rib(env.q1, rf='ipv6')) == 3)
- wait_for(lambda: len(env.g1.get_adj_rib_out(env.q1, rf='ipv6')) == 3)
- wait_for(lambda: len(env.q1.get_global_rib(rf='ipv6')) == 3)
- wait_for(lambda: len(env.g1.get_local_rib(env.q2, rf='ipv6')) == 3)
- wait_for(lambda: len(env.g1.get_adj_rib_out(env.q2, rf='ipv6')) == 1)
- wait_for(lambda: len(env.q2.get_global_rib(rf='ipv6')) == 1)
-
-@scenario(8)
-def setup2(env):
- g1 = env.g1
- e1 = env.e1
- q1 = env.q1
- q2 = env.q2
-
- p0 = {'IpPrefix': '2001:0:10:2::/64'}
-
- ps0 = {'PrefixSetName': 'ps0',
- 'PrefixList': [p0]}
- g1.set_prefix_set(ps0)
-
- n0 = {'Address': g1.peers[q2]['neigh_addr'].split('/')[0]}
-
- ns0 = {'NeighborSetName': 'ns0',
- 'NeighborInfoList': [n0]}
- g1.set_neighbor_set(ns0)
-
- st0 = {'Name': 'st0',
- 'Conditions': {
- 'MatchPrefixSet': {'PrefixSet': ps0['PrefixSetName']},
- 'MatchNeighborSet': {'NeighborSet': ns0['NeighborSetName']}}}
-
- policy = {'name': 'policy0',
- 'type': 'export',
- 'statements': [st0]}
- g1.add_policy(policy, q2)
- g1.reset(e1)
-
- for c in [e1, q1, q2]:
- g1.wait_for(BGP_FSM_ESTABLISHED, c)
-
-@scenario(8)
-def check2(env):
- wait_for(lambda: len(env.g1.get_local_rib(env.q1, rf='ipv6')) == 3)
- wait_for(lambda: len(env.g1.get_adj_rib_out(env.q1, rf='ipv6')) == 3)
- wait_for(lambda: len(env.q1.get_global_rib(rf='ipv6')) == 3)
- wait_for(lambda: len(env.g1.get_local_rib(env.q2, rf='ipv6')) == 3)
- wait_for(lambda: len(env.g1.get_adj_rib_out(env.q2, rf='ipv6')) == 2)
- wait_for(lambda: len(env.q2.get_global_rib(rf='ipv6')) == 2)
-
-"""
- No.9 aspath length condition import-policy test
+@register_scenario
+class ImportPolicy(object):
+ """
+ No.1 import-policy test
--------------------------------
- e1 ->(aspath_length=10)-> | -> q1-rib -> q1-adj-rib-out | --> q1
+ e1 ->(192.168.2.0/24)-> | -> q1-rib -> q1-adj-rib-out | --> q1
| |
| ->x q2-rib |
--------------------------------
-
-"""
-@scenario(9)
-def boot(env):
- scenarios[1]['boot'](env)
-
-@scenario(9)
-def setup(env):
- g1 = env.g1
- e1 = env.e1
- q1 = env.q1
- q2 = env.q2
- st0 = {'Name': 'st0',
- 'Conditions':{'BgpConditions':{'AsPathLength':{'Operator': 'ge',
- 'Value': 10}}}}
-
-
- policy = {'name': 'policy0',
- 'type': 'import',
- 'statements': [st0]}
- g1.add_policy(policy, q2)
-
- # this will be blocked
- e1.add_route('192.168.100.0/24', aspath=range(e1.asn, e1.asn-10, -1))
- # this will pass
- e1.add_route('192.168.200.0/24', aspath=range(e1.asn, e1.asn-8, -1))
-
- for c in [e1, q1, q2]:
- g1.wait_for(BGP_FSM_ESTABLISHED, c)
-
-@scenario(9)
-def check(env):
- g1 = env.g1
- e1 = env.e1
- q1 = env.q1
- q2 = env.q2
- wait_for(lambda : len(g1.get_local_rib(q1)) == 2)
- wait_for(lambda : len(g1.get_adj_rib_out(q1)) == 2)
- wait_for(lambda : len(q1.get_global_rib()) == 2)
- wait_for(lambda : len(g1.get_local_rib(q2)) == 1)
- wait_for(lambda : len(g1.get_adj_rib_out(q2)) == 1)
- wait_for(lambda : len(q2.get_global_rib()) == 1)
-
-
-"""
- No.10 aspath from condition import-policy test
+ """
+ @staticmethod
+ def boot(env):
+ gobgp_ctn_image_name = env.parser_option.gobgp_image
+ log_level = env.parser_option.gobgp_log_level
+ g1 = GoBGPContainer(name='g1', asn=65000, router_id='192.168.0.1',
+ ctn_image_name=gobgp_ctn_image_name,
+ log_level=log_level)
+ e1 = ExaBGPContainer(name='e1', asn=65001, router_id='192.168.0.2')
+ q1 = QuaggaBGPContainer(name='q1', asn=65002, router_id='192.168.0.3')
+ q2 = QuaggaBGPContainer(name='q2', asn=65003, router_id='192.168.0.4')
+
+ ctns = [g1, e1, q1, q2]
+ 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 q in [e1, q1, q2]:
+ g1.add_peer(q, is_rs_client=True)
+ q.add_peer(g1)
+
+ env.g1 = g1
+ env.e1 = e1
+ env.q1 = q1
+ env.q2 = q2
+
+ @staticmethod
+ def setup(env):
+ g1 = env.g1
+ e1 = env.e1
+ q1 = env.q1
+ q2 = env.q2
+
+ p0 = {'IpPrefix': '192.168.0.0/16',
+ 'MasklengthRange': '16..24'}
+
+ ps0 = {'PrefixSetName': 'ps0',
+ 'PrefixList': [p0]}
+ g1.set_prefix_set(ps0)
+
+ n0 = {'Address': g1.peers[e1]['neigh_addr'].split('/')[0]}
+
+ ns0 = {'NeighborSetName': 'ns0',
+ 'NeighborInfoList': [n0]}
+ g1.set_neighbor_set(ns0)
+
+ st0 = {'Name': 'st0',
+ 'Conditions': {
+ 'MatchPrefixSet': {'PrefixSet': ps0['PrefixSetName']},
+ 'MatchNeighborSet': {'NeighborSet': ns0['NeighborSetName']}}}
+
+ policy = {'name': 'policy0',
+ 'type': 'import',
+ 'statements': [st0]}
+ g1.add_policy(policy, q2)
+
+ # this will be blocked
+ e1.add_route('192.168.2.0/24')
+ # this will pass
+ e1.add_route('192.168.2.0/15')
+
+ for c in [e1, q1, q2]:
+ g1.wait_for(BGP_FSM_ESTABLISHED, c)
+
+ @staticmethod
+ def check(env):
+ wait_for(lambda: len(env.g1.get_local_rib(env.q1)) == 2)
+ wait_for(lambda: len(env.g1.get_adj_rib_out(env.q1)) == 2)
+ wait_for(lambda: len(env.q1.get_global_rib()) == 2)
+ wait_for(lambda: len(env.g1.get_local_rib(env.q2)) == 1)
+ wait_for(lambda: len(env.g1.get_adj_rib_out(env.q2)) == 1)
+ wait_for(lambda: len(env.q2.get_global_rib()) == 1)
+
+
+@register_scenario
+class ExportPolicy(object):
+ """
+ No.2 export-policy test
+ --------------------------------
+ e1 ->(192.168.2.0/24)-> | -> q1-rib -> q1-adj-rib-out | --> q1
+ | |
+ | -> q2-rib ->x q2-adj-rib-out |
+ --------------------------------
+ """
+ @staticmethod
+ def boot(env):
+ lookup_scenario("ImportPolicy").boot(env)
+
+ @staticmethod
+ def setup(env):
+ g1 = env.g1
+ e1 = env.e1
+ q1 = env.q1
+ q2 = env.q2
+
+ p0 = {'IpPrefix': '192.168.0.0/16',
+ 'MasklengthRange': '16..24'}
+
+ ps0 = {'PrefixSetName': 'ps0',
+ 'PrefixList': [p0]}
+ g1.set_prefix_set(ps0)
+
+ n0 = {'Address': g1.peers[q2]['neigh_addr'].split('/')[0]}
+
+ ns0 = {'NeighborSetName': 'ns0',
+ 'NeighborInfoList': [n0]}
+ g1.set_neighbor_set(ns0)
+
+ st0 = {'Name': 'st0',
+ 'Conditions': {
+ 'MatchPrefixSet': {'PrefixSet': ps0['PrefixSetName']},
+ 'MatchNeighborSet': {'NeighborSet': ns0['NeighborSetName']}}}
+
+ policy = {'name': 'policy0',
+ 'type': 'export',
+ 'statements': [st0]}
+ g1.add_policy(policy, q2)
+
+ # this will be blocked
+ e1.add_route('192.168.2.0/24')
+ # this will pass
+ e1.add_route('192.168.2.0/15')
+
+ for c in [e1, q1, q2]:
+ g1.wait_for(BGP_FSM_ESTABLISHED, c)
+
+ @staticmethod
+ def check(env):
+ g1 = env.g1
+ q1 = env.q1
+ q2 = env.q2
+ wait_for(lambda: len(g1.get_local_rib(q1)) == 2)
+ wait_for(lambda: len(g1.get_adj_rib_out(q1)) == 2)
+ wait_for(lambda: len(q1.get_global_rib()) == 2)
+ wait_for(lambda: len(g1.get_local_rib(q2)) == 2)
+ wait_for(lambda: len(g1.get_adj_rib_out(q2)) == 1)
+ wait_for(lambda: len(q2.get_global_rib()) == 1)
+
+
+@register_scenario
+class ImportPolicyUpdate(object):
+ """
+ No.3 import-policy update test
+
+ r1:192.168.2.0/24
+ r2:192.168.20.0/24
+ r3:192.168.200.0/24
+ -------------------------------------------------
+ | q1 |
+ e1 ->(r1,r2,r3)-> | ->(r1,r2,r3)-> rib ->(r1,r2,r3)-> adj-rib-out | ->(r1,r2,r3)-> q1
+ | |
+ | q2 |
+ | ->(r1)-> rib ->(r1)-> adj-rib-out | ->(r1)-> q2
+ -------------------------------------------------
+ |
+ update gobgp.conf
+ |
+ V
+ -------------------------------------------------
+ | q1 |
+ e1 ->(r1,r2,r3)-> | ->(r1,r2,r3)-> rib ->(r1,r2,r3)-> adj-rib-out | ->(r1,r2,r3)-> q1
+ | |
+ | q2 |
+ | ->(r1,r3)-> rib ->(r1,r3)-> adj-rib-out | ->(r1,r3)-> q2
+ -------------------------------------------------
+ """
+ @staticmethod
+ def boot(env):
+ lookup_scenario("ImportPolicy").boot(env)
+
+ @staticmethod
+ def setup(env):
+ g1 = env.g1
+ e1 = env.e1
+ q1 = env.q1
+ q2 = env.q2
+
+ p0 = {'IpPrefix': '192.168.20.0/24'}
+ p1 = {'IpPrefix': '192.168.200.0/24'}
+
+ ps0 = {'PrefixSetName': 'ps0',
+ 'PrefixList': [p0, p1]}
+ g1.set_prefix_set(ps0)
+
+ n0 = {'Address': g1.peers[e1]['neigh_addr'].split('/')[0]}
+
+ ns0 = {'NeighborSetName': 'ns0',
+ 'NeighborInfoList': [n0]}
+ g1.set_neighbor_set(ns0)
+
+ st0 = {'Name': 'st0',
+ 'Conditions': {
+ 'MatchPrefixSet': {'PrefixSet': ps0['PrefixSetName']},
+ 'MatchNeighborSet': {'NeighborSet': ns0['NeighborSetName']}}}
+
+ policy = {'name': 'policy0',
+ 'type': 'import',
+ 'statements': [st0]}
+ g1.add_policy(policy, q2)
+
+ e1.add_route('192.168.2.0/24')
+ e1.add_route('192.168.20.0/24')
+ e1.add_route('192.168.200.0/24')
+
+ for c in [e1, q1, q2]:
+ g1.wait_for(BGP_FSM_ESTABLISHED, c)
+
+ @staticmethod
+ def check(env):
+ g1 = env.g1
+ e1 = env.e1
+ q1 = env.q1
+ q2 = env.q2
+ wait_for(lambda: len(g1.get_local_rib(q1)) == 3)
+ wait_for(lambda: len(g1.get_adj_rib_out(q1)) == 3)
+ wait_for(lambda: len(q1.get_global_rib()) == 3)
+ wait_for(lambda: len(g1.get_local_rib(q2)) == 1)
+ wait_for(lambda: len(g1.get_adj_rib_out(q2)) == 1)
+ wait_for(lambda: len(q2.get_global_rib()) == 1)
+
+ @staticmethod
+ def setup2(env):
+ g1 = env.g1
+ e1 = env.e1
+ q1 = env.q1
+ q2 = env.q2
+ g1.clear_policy()
+
+ p0 = {'IpPrefix': '192.168.20.0/24'}
+
+ ps0 = {'PrefixSetName': 'ps0',
+ 'PrefixList': [p0]}
+ g1.set_prefix_set(ps0)
+
+ n0 = {'Address': g1.peers[e1]['neigh_addr'].split('/')[0]}
+
+ ns0 = {'NeighborSetName': 'ns0',
+ 'NeighborInfoList': [n0]}
+ g1.set_neighbor_set(ns0)
+
+ st0 = {'Name': 'st0',
+ 'Conditions': {'MatchPrefixSet': {'PrefixSet': ps0['PrefixSetName']},
+ 'MatchNeighborSet': {'NeighborSet': ns0['NeighborSetName']}}}
+
+ policy = {'name': 'policy0',
+ 'type': 'import',
+ 'statements': [st0]}
+ g1.add_policy(policy, q2)
+ g1.softreset(e1)
+
+ @staticmethod
+ def check2(env):
+ g1 = env.g1
+ e1 = env.e1
+ q1 = env.q1
+ q2 = env.q2
+ wait_for(lambda: len(g1.get_local_rib(q1)) == 3)
+ wait_for(lambda: len(g1.get_adj_rib_out(q1)) == 3)
+ wait_for(lambda: len(q1.get_global_rib()) == 3)
+ wait_for(lambda: len(g1.get_local_rib(q2)) == 2)
+ wait_for(lambda: len(g1.get_adj_rib_out(q2)) == 2)
+ wait_for(lambda: len(q2.get_global_rib()) == 2)
+
+
+@register_scenario
+class ExportPolicyUpdate(object):
+ """
+ No.4 export-policy update test
+
+ r1:192.168.2.0
+ r2:192.168.20.0
+ r3:192.168.200.0
+ -------------------------------------------------
+ | q1 |
+ e1 ->(r1,r2,r3)-> | ->(r1,r2,r3)-> rib ->(r1,r2,r3)-> adj-rib-out | ->(r1,r2,r3)-> q1
+ | |
+ | q2 |
+ | ->(r1,r2,r3)-> rib ->(r1)-> adj-rib-out | ->(r1)-> q2
+ -------------------------------------------------
+ |
+ update gobgp.conf
+ |
+ V
+ -------------------------------------------------
+ | q1 |
+ e1 ->(r1,r2,r3)-> | ->(r1,r2,r3)-> rib ->(r1,r2,r3)-> adj-rib-out | ->(r1,r2,r3)-> q1
+ | |
+ | q2 |
+ | ->(r1,r2,r3)-> rib ->(r1,r3)-> adj-rib-out | ->(r1,r3)-> q2
+ -------------------------------------------------
+ """
+ @staticmethod
+ def boot(env):
+ lookup_scenario("ImportPolicy").boot(env)
+
+ @staticmethod
+ def setup(env):
+ g1 = env.g1
+ e1 = env.e1
+ q1 = env.q1
+ q2 = env.q2
+ p0 = {'IpPrefix': '192.168.20.0/24'}
+ p1 = {'IpPrefix': '192.168.200.0/24'}
+
+ ps0 = {'PrefixSetName': 'ps0',
+ 'PrefixList': [p0, p1]}
+ g1.set_prefix_set(ps0)
+
+ n0 = {'Address': g1.peers[q2]['neigh_addr'].split('/')[0]}
+
+ ns0 = {'NeighborSetName': 'ns0',
+ 'NeighborInfoList': [n0]}
+ g1.set_neighbor_set(ns0)
+
+ st0 = {'Name': 'st0',
+ 'Conditions': {'MatchPrefixSet': {'PrefixSet': ps0['PrefixSetName']},
+ 'MatchNeighborSet': {'NeighborSet': ns0['NeighborSetName']}}}
+
+ policy = {'name': 'policy0',
+ 'type': 'export',
+ 'statements': [st0]}
+ g1.add_policy(policy, q2)
+
+ e1.add_route('192.168.2.0/24')
+ e1.add_route('192.168.20.0/24')
+ e1.add_route('192.168.200.0/24')
+
+ for c in [e1, q1, q2]:
+ g1.wait_for(BGP_FSM_ESTABLISHED, c)
+
+ @staticmethod
+ def check(env):
+ g1 = env.g1
+ e1 = env.e1
+ q1 = env.q1
+ q2 = env.q2
+ wait_for(lambda: len(g1.get_local_rib(q1)) == 3)
+ wait_for(lambda: len(g1.get_adj_rib_out(q1)) == 3)
+ wait_for(lambda: len(q1.get_global_rib()) == 3)
+ wait_for(lambda: len(g1.get_local_rib(q2)) == 3)
+ wait_for(lambda: len(g1.get_adj_rib_out(q2)) == 1)
+ wait_for(lambda: len(q2.get_global_rib()) == 1)
+
+ @staticmethod
+ def setup2(env):
+ g1 = env.g1
+ e1 = env.e1
+ q1 = env.q1
+ q2 = env.q2
+ g1.clear_policy()
+
+ p0 = {'IpPrefix': '192.168.20.0/24'}
+
+ ps0 = {'PrefixSetName': 'ps0',
+ 'PrefixList': [p0]}
+ g1.set_prefix_set(ps0)
+
+ n0 = {'Address': g1.peers[q2]['neigh_addr'].split('/')[0]}
+
+ ns0 = {'NeighborSetName': 'ns0',
+ 'NeighborInfoList': [n0]}
+ g1.set_neighbor_set(ns0)
+
+ st0 = {'Name': 'st0',
+ 'Conditions': {'MatchPrefixSet': {'PrefixSet': ps0['PrefixSetName']},
+ 'MatchNeighborSet': {'NeighborSet': ns0['NeighborSetName']}}}
+
+ policy = {'name': 'policy0',
+ 'type': 'export',
+ 'statements': [st0]}
+ g1.add_policy(policy, q2)
+
+ # we need hard reset to flush q2's local rib
+ g1.reset(e1)
+
+ for c in [e1, q1, q2]:
+ g1.wait_for(BGP_FSM_ESTABLISHED, c)
+
+ @staticmethod
+ def check2(env):
+ g1 = env.g1
+ e1 = env.e1
+ q1 = env.q1
+ q2 = env.q2
+ wait_for(lambda: len(g1.get_local_rib(q1)) == 3)
+ wait_for(lambda: len(g1.get_adj_rib_out(q1)) == 3)
+ wait_for(lambda: len(q1.get_global_rib()) == 3)
+ wait_for(lambda: len(g1.get_local_rib(q2)) == 3)
+ wait_for(lambda: len(g1.get_adj_rib_out(q2)) == 2)
+ wait_for(lambda: len(q2.get_global_rib()) == 2)
+
+
+@register_scenario
+class ImportPolicyIPV6(object):
+ """
+ No.5 IPv6 import-policy test
+
+ r1=2001::/64
+ r2=2001::/63
+ -------------------------------------------------
+ e1 ->(r1,r2)-> | ->(r1,r2)-> q1-rib ->(r1,r2)-> q1-adj-rib-out | ->(r1,r2)-> q1
+ | |
+ | ->(r2) -> q2-rib ->(r2) -> q2-adj-rib-out | ->(r2)-> q2
+ -------------------------------------------------
+ """
+ @staticmethod
+ def boot(env):
+ gobgp_ctn_image_name = env.parser_option.gobgp_image
+ log_level = env.parser_option.gobgp_log_level
+ g1 = GoBGPContainer(name='g1', asn=65000, router_id='192.168.0.1',
+ ctn_image_name=gobgp_ctn_image_name,
+ log_level=log_level)
+ e1 = ExaBGPContainer(name='e1', asn=65001, router_id='192.168.0.2')
+ q1 = QuaggaBGPContainer(name='q1', asn=65002, router_id='192.168.0.3')
+ q2 = QuaggaBGPContainer(name='q2', asn=65003, router_id='192.168.0.4')
+
+ ctns = [g1, e1, q1, q2]
+ initial_wait_time = max(ctn.run() for ctn in ctns)
+ time.sleep(initial_wait_time)
+
+ br01 = Bridge(name='br01', subnet='2001::/96')
+ [br01.addif(ctn) for ctn in ctns]
+
+ for q in [e1, q1, q2]:
+ g1.add_peer(q, is_rs_client=True)
+ q.add_peer(g1)
+
+ env.g1 = g1
+ env.e1 = e1
+ env.q1 = q1
+ env.q2 = q2
+
+ @staticmethod
+ def setup(env):
+ g1 = env.g1
+ e1 = env.e1
+ q1 = env.q1
+ q2 = env.q2
+
+ p0 = {'IpPrefix': '2001::/32',
+ 'MasklengthRange': '64..128'}
+
+ ps0 = {'PrefixSetName': 'ps0',
+ 'PrefixList': [p0]}
+ g1.set_prefix_set(ps0)
+
+ n0 = {'Address': g1.peers[e1]['neigh_addr'].split('/')[0]}
+
+ ns0 = {'NeighborSetName': 'ns0',
+ 'NeighborInfoList': [n0]}
+ g1.set_neighbor_set(ns0)
+
+ st0 = {'Name': 'st0',
+ 'Conditions': {
+ 'MatchPrefixSet': {'PrefixSet': ps0['PrefixSetName']},
+ 'MatchNeighborSet': {'NeighborSet': ns0['NeighborSetName']}}}
+
+ policy = {'name': 'policy0',
+ 'type': 'import',
+ 'statements': [st0]}
+ g1.add_policy(policy, q2)
+
+ # this will be blocked
+ e1.add_route('2001::/64', rf='ipv6')
+ # this will pass
+ e1.add_route('2001::/63', rf='ipv6')
+
+ for c in [e1, q1, q2]:
+ g1.wait_for(BGP_FSM_ESTABLISHED, c)
+
+ @staticmethod
+ def check(env):
+ wait_for(lambda: len(env.g1.get_local_rib(env.q1, rf='ipv6')) == 2)
+ wait_for(lambda: len(env.g1.get_adj_rib_out(env.q1, rf='ipv6')) == 2)
+ wait_for(lambda: len(env.q1.get_global_rib(rf='ipv6')) == 2)
+ wait_for(lambda: len(env.g1.get_local_rib(env.q2, rf='ipv6')) == 1)
+ wait_for(lambda: len(env.g1.get_adj_rib_out(env.q2, rf='ipv6')) == 1)
+ wait_for(lambda: len(env.q2.get_global_rib(rf='ipv6')) == 1)
+
+
+@register_scenario
+class ExportPolicyIPV6(object):
+ """
+ No.6 IPv6 export-policy test
+
+ r1=2001::/64
+ r2=2001::/63
+ -------------------------------------------------
+ e1 ->(r1,r2)-> | ->(r1,r2)-> q1-rib ->(r1,r2)-> q1-adj-rib-out | ->(r1,r2)-> q1
+ | |
+ | ->(r1,r2)-> q2-rib ->(r2) -> q2-adj-rib-out | ->(r2)-> q2
+ -------------------------------------------------
+ """
+ @staticmethod
+ def boot(env):
+ lookup_scenario('ImportPolicyIPV6').boot(env)
+
+ @staticmethod
+ def setup(env):
+ g1 = env.g1
+ e1 = env.e1
+ q1 = env.q1
+ q2 = env.q2
+
+ p0 = {'IpPrefix': '2001::/32',
+ 'MasklengthRange': '64..128'}
+
+ ps0 = {'PrefixSetName': 'ps0',
+ 'PrefixList': [p0]}
+ g1.set_prefix_set(ps0)
+
+ n0 = {'Address': g1.peers[q2]['neigh_addr'].split('/')[0]}
+
+ ns0 = {'NeighborSetName': 'ns0',
+ 'NeighborInfoList': [n0]}
+ g1.set_neighbor_set(ns0)
+
+ st0 = {'Name': 'st0',
+ 'Conditions': {
+ 'MatchPrefixSet': {'PrefixSet': ps0['PrefixSetName']},
+ 'MatchNeighborSet': {'NeighborSet': ns0['NeighborSetName']}}}
+
+ policy = {'name': 'policy0',
+ 'type': 'export',
+ 'statements': [st0]}
+ g1.add_policy(policy, q2)
+
+ # this will be blocked
+ e1.add_route('2001::/64', rf='ipv6')
+ # this will pass
+ e1.add_route('2001::/63', rf='ipv6')
+
+ for c in [e1, q1, q2]:
+ g1.wait_for(BGP_FSM_ESTABLISHED, c)
+
+ @staticmethod
+ def check(env):
+ wait_for(lambda: len(env.g1.get_local_rib(env.q1, rf='ipv6')) == 2)
+ wait_for(lambda: len(env.g1.get_adj_rib_out(env.q1, rf='ipv6')) == 2)
+ wait_for(lambda: len(env.q1.get_global_rib(rf='ipv6')) == 2)
+ wait_for(lambda: len(env.g1.get_local_rib(env.q2, rf='ipv6')) == 2)
+ wait_for(lambda: len(env.g1.get_adj_rib_out(env.q2, rf='ipv6')) == 1)
+ wait_for(lambda: len(env.q2.get_global_rib(rf='ipv6')) == 1)
+
+
+@register_scenario
+class ImportPolicyIPV6Update(object):
+ """
+ No.7 IPv6 import-policy update test
+ r1=2001:0:10:2::/64
+ r2=2001:0:10:20::/64
+ r3=2001:0:10:200::/64
+ -------------------------------------------------
+ | q1 |
+ e1 ->(r1,r2,r3)-> | ->(r1,r2,r3)-> rib ->(r1,r2,r3)-> adj-rib-out | ->(r1,r2,r3)-> q1
+ | |
+ | q2 |
+ | ->(r1)-> rib ->(r1)-> adj-rib-out | ->(r1)-> q2
+ -------------------------------------------------
+ |
+ update gobgp.conf
+ |
+ V
+ -------------------------------------------------
+ | q1 |
+ e1 ->(r1,r2,r3)-> | ->(r1,r2,r3)-> rib ->(r1,r2,r3)-> adj-rib-out | ->(r1,r2,r3)-> q1
+ | |
+ | q2 |
+ | ->(r1,r3)-> rib ->(r1,r3)-> adj-rib-out | ->(r1,r3)-> q2
+ -------------------------------------------------
+ """
+ @staticmethod
+ def boot(env):
+ lookup_scenario('ImportPolicyIPV6').boot(env)
+
+ @staticmethod
+ def setup(env):
+ g1 = env.g1
+ e1 = env.e1
+ q1 = env.q1
+ q2 = env.q2
+
+ p0 = {'IpPrefix': '2001:0:10:2::/64'}
+ p1 = {'IpPrefix': '2001:0:10:20::/64'}
+
+ ps0 = {'PrefixSetName': 'ps0',
+ 'PrefixList': [p0, p1]}
+ g1.set_prefix_set(ps0)
+
+ n0 = {'Address': g1.peers[e1]['neigh_addr'].split('/')[0]}
+
+ ns0 = {'NeighborSetName': 'ns0',
+ 'NeighborInfoList': [n0]}
+ g1.set_neighbor_set(ns0)
+
+ st0 = {'Name': 'st0',
+ 'Conditions': {
+ 'MatchPrefixSet': {'PrefixSet': ps0['PrefixSetName']},
+ 'MatchNeighborSet': {'NeighborSet': ns0['NeighborSetName']}}}
+
+ policy = {'name': 'policy0',
+ 'type': 'import',
+ 'statements': [st0]}
+ g1.add_policy(policy, q2)
+
+ e1.add_route('2001:0:10:2::/64', rf='ipv6')
+ e1.add_route('2001:0:10:20::/64', rf='ipv6')
+ e1.add_route('2001:0:10:200::/64', rf='ipv6')
+
+ for c in [e1, q1, q2]:
+ g1.wait_for(BGP_FSM_ESTABLISHED, c)
+
+ @staticmethod
+ def check(env):
+ wait_for(lambda: len(env.g1.get_local_rib(env.q1, rf='ipv6')) == 3)
+ wait_for(lambda: len(env.g1.get_adj_rib_out(env.q1, rf='ipv6')) == 3)
+ wait_for(lambda: len(env.q1.get_global_rib(rf='ipv6')) == 3)
+ wait_for(lambda: len(env.g1.get_local_rib(env.q2, rf='ipv6')) == 1)
+ wait_for(lambda: len(env.g1.get_adj_rib_out(env.q2, rf='ipv6')) == 1)
+ wait_for(lambda: len(env.q2.get_global_rib(rf='ipv6')) == 1)
+
+ @staticmethod
+ def setup2(env):
+ g1 = env.g1
+ e1 = env.e1
+ q1 = env.q1
+ q2 = env.q2
+
+ p0 = {'IpPrefix': '2001:0:10:2::/64'}
+
+ ps0 = {'PrefixSetName': 'ps0',
+ 'PrefixList': [p0]}
+ g1.set_prefix_set(ps0)
+
+ n0 = {'Address': g1.peers[e1]['neigh_addr'].split('/')[0]}
+
+ ns0 = {'NeighborSetName': 'ns0',
+ 'NeighborInfoList': [n0]}
+ g1.set_neighbor_set(ns0)
+
+ st0 = {'Name': 'st0',
+ 'Conditions': {
+ 'MatchPrefixSet': {'PrefixSet': ps0['PrefixSetName']},
+ 'MatchNeighborSet': {'NeighborSet': ns0['NeighborSetName']}}}
+
+ policy = {'name': 'policy0',
+ 'type': 'import',
+ 'statements': [st0]}
+ g1.add_policy(policy, q2)
+ g1.softreset(e1, rf='ipv6')
+
+ @staticmethod
+ def check2(env):
+ wait_for(lambda: len(env.g1.get_local_rib(env.q1, rf='ipv6')) == 3)
+ wait_for(lambda: len(env.g1.get_adj_rib_out(env.q1, rf='ipv6')) == 3)
+ wait_for(lambda: len(env.q1.get_global_rib(rf='ipv6')) == 3)
+ wait_for(lambda: len(env.g1.get_local_rib(env.q2, rf='ipv6')) == 2)
+ wait_for(lambda: len(env.g1.get_adj_rib_out(env.q2, rf='ipv6')) == 2)
+ wait_for(lambda: len(env.q2.get_global_rib(rf='ipv6')) == 2)
+
+
+@register_scenario
+class ExportPolicyIPv6Update(object):
+ """
+ No.8 IPv6 export-policy update test
+ r1=2001:0:10:2::/64
+ r2=2001:0:10:20::/64
+ r3=2001:0:10:200::/64
+ -------------------------------------------------
+ | q1 |
+ e1 ->(r1,r2,r3)-> | ->(r1,r2,r3)-> rib ->(r1,r2,r3)-> adj-rib-out | ->(r1,r2,r3)-> q1
+ | |
+ | q2 |
+ | ->(r1,r2,r3)-> rib ->(r1)-> adj-rib-out | ->(r1)-> q2
+ -------------------------------------------------
+ |
+ update gobgp.conf
+ |
+ V
+ -------------------------------------------------
+ | q1 |
+ e1 ->(r1,r2,r3)-> | ->(r1,r2,r3)-> rib ->(r1,r2,r3)-> adj-rib-out | ->(r1,r2,r3)-> q1
+ | |
+ | q2 |
+ | ->(r1,r2,r3)-> rib ->(r1,r3)-> adj-rib-out | ->(r1,r3)-> q2
+ -------------------------------------------------
+ """
+ @staticmethod
+ def boot(env):
+ lookup_scenario('ImportPolicyIPV6').boot(env)
+
+ @staticmethod
+ def setup(env):
+ g1 = env.g1
+ e1 = env.e1
+ q1 = env.q1
+ q2 = env.q2
+
+ p0 = {'IpPrefix': '2001:0:10:2::/64'}
+ p1 = {'IpPrefix': '2001:0:10:20::/64'}
+
+ ps0 = {'PrefixSetName': 'ps0',
+ 'PrefixList': [p0, p1]}
+ g1.set_prefix_set(ps0)
+
+ n0 = {'Address': g1.peers[q2]['neigh_addr'].split('/')[0]}
+
+ ns0 = {'NeighborSetName': 'ns0',
+ 'NeighborInfoList': [n0]}
+ g1.set_neighbor_set(ns0)
+
+ st0 = {'Name': 'st0',
+ 'Conditions': {
+ 'MatchPrefixSet': {'PrefixSet': ps0['PrefixSetName']},
+ 'MatchNeighborSet': {'NeighborSet': ns0['NeighborSetName']}}}
+
+ policy = {'name': 'policy0',
+ 'type': 'export',
+ 'statements': [st0]}
+ g1.add_policy(policy, q2)
+
+ e1.add_route('2001:0:10:2::/64', rf='ipv6')
+ e1.add_route('2001:0:10:20::/64', rf='ipv6')
+ e1.add_route('2001:0:10:200::/64', rf='ipv6')
+
+ for c in [e1, q1, q2]:
+ g1.wait_for(BGP_FSM_ESTABLISHED, c)
+
+ @staticmethod
+ def check(env):
+ wait_for(lambda: len(env.g1.get_local_rib(env.q1, rf='ipv6')) == 3)
+ wait_for(lambda: len(env.g1.get_adj_rib_out(env.q1, rf='ipv6')) == 3)
+ wait_for(lambda: len(env.q1.get_global_rib(rf='ipv6')) == 3)
+ wait_for(lambda: len(env.g1.get_local_rib(env.q2, rf='ipv6')) == 3)
+ wait_for(lambda: len(env.g1.get_adj_rib_out(env.q2, rf='ipv6')) == 1)
+ wait_for(lambda: len(env.q2.get_global_rib(rf='ipv6')) == 1)
+
+ @staticmethod
+ def setup2(env):
+ g1 = env.g1
+ e1 = env.e1
+ q1 = env.q1
+ q2 = env.q2
+
+ p0 = {'IpPrefix': '2001:0:10:2::/64'}
+
+ ps0 = {'PrefixSetName': 'ps0',
+ 'PrefixList': [p0]}
+ g1.set_prefix_set(ps0)
+
+ n0 = {'Address': g1.peers[q2]['neigh_addr'].split('/')[0]}
+
+ ns0 = {'NeighborSetName': 'ns0',
+ 'NeighborInfoList': [n0]}
+ g1.set_neighbor_set(ns0)
+
+ st0 = {'Name': 'st0',
+ 'Conditions': {
+ 'MatchPrefixSet': {'PrefixSet': ps0['PrefixSetName']},
+ 'MatchNeighborSet': {'NeighborSet': ns0['NeighborSetName']}}}
+
+ policy = {'name': 'policy0',
+ 'type': 'export',
+ 'statements': [st0]}
+ g1.add_policy(policy, q2)
+ g1.reset(e1)
+
+ for c in [e1, q1, q2]:
+ g1.wait_for(BGP_FSM_ESTABLISHED, c)
+
+ @staticmethod
+ def check2(env):
+ wait_for(lambda: len(env.g1.get_local_rib(env.q1, rf='ipv6')) == 3)
+ wait_for(lambda: len(env.g1.get_adj_rib_out(env.q1, rf='ipv6')) == 3)
+ wait_for(lambda: len(env.q1.get_global_rib(rf='ipv6')) == 3)
+ wait_for(lambda: len(env.g1.get_local_rib(env.q2, rf='ipv6')) == 3)
+ wait_for(lambda: len(env.g1.get_adj_rib_out(env.q2, rf='ipv6')) == 2)
+ wait_for(lambda: len(env.q2.get_global_rib(rf='ipv6')) == 2)
+
+
+@register_scenario
+class ImportPolicyAsPathLengthCondition(object):
+ """
+ No.9 aspath length condition import-policy test
--------------------------------
- e1 ->(aspath=[65100,...])-> | -> q1-rib -> q1-adj-rib-out | --> q1
+ e1 ->(aspath_length=10)-> | -> q1-rib -> q1-adj-rib-out | --> q1
| |
| ->x q2-rib |
--------------------------------
-
-"""
-@scenario(10)
-def boot(env):
- scenarios[1]['boot'](env)
-
-@scenario(10)
-def setup(env):
- g1 = env.g1
- e1 = env.e1
- q1 = env.q1
- q2 = env.q2
- as0 = {'AsPathSets': {'AsPathSetList': [{'AsPathSetName': 'as0', 'AsPathList': [{'AsPath': '^{0}'.format(e1.asn)}]}]}}
-
- g1.set_bgp_defined_set(as0)
-
- st0 = {'Name': 'st0',
- 'Conditions':{'BgpConditions':{'MatchAsPathSet':{'AsPathSet': 'as0'}}}}
-
- policy = {'name': 'policy0',
- 'type': 'import',
- 'statements': [st0]}
- g1.add_policy(policy, q2)
-
- # this will be blocked
- e1.add_route('192.168.100.0/24', aspath=range(e1.asn, e1.asn-10, -1))
- # this will pass
- e1.add_route('192.168.200.0/24', aspath=range(e1.asn-1, e1.asn-10, -1))
-
- for c in [e1, q1, q2]:
- g1.wait_for(BGP_FSM_ESTABLISHED, c)
-
-@scenario(10)
-def check(env):
- # same check function as previous No.1 scenario
- scenarios[1]['check'](env)
-
-"""
- No.11 aspath any condition import-policy test
- --------------------------------
- e1 ->(aspath=[...65098,...])-> | -> q1-rib -> q1-adj-rib-out | --> q1
- | |
- | ->x q2-rib |
- --------------------------------
-
-"""
-@scenario(11)
-def boot(env):
- scenarios[1]['boot'](env)
-
-@scenario(11)
-def setup(env):
- g1 = env.g1
- e1 = env.e1
- q1 = env.q1
- q2 = env.q2
- as0 = {'AsPathSets': {'AsPathSetList': [{'AsPathSetName': 'as0', 'AsPathList': [{'AsPath': '65098'}]}]}}
-
- g1.set_bgp_defined_set(as0)
-
- st0 = {'Name': 'st0',
- 'Conditions':{'BgpConditions':{'MatchAsPathSet':{'AsPathSet': 'as0'}}}}
-
- policy = {'name': 'policy0',
- 'type': 'import',
- 'statements': [st0]}
- g1.add_policy(policy, q2)
-
- # this will be blocked
- e1.add_route('192.168.100.0/24', aspath=[65000, 65098, 65010])
- # this will pass
- e1.add_route('192.168.200.0/24', aspath=[65000, 65100, 65010])
-
- for c in [e1, q1, q2]:
- g1.wait_for(BGP_FSM_ESTABLISHED, c)
-
-@scenario(11)
-def check(env):
- # same check function as previous No.1 scenario
- scenarios[1]['check'](env)
-
-"""
- No.12 aspath origin condition import-policy test
+ """
+ @staticmethod
+ def boot(env):
+ lookup_scenario("ImportPolicy").boot(env)
+
+ @staticmethod
+ def setup(env):
+ g1 = env.g1
+ e1 = env.e1
+ q1 = env.q1
+ q2 = env.q2
+ st0 = {'Name': 'st0',
+ 'Conditions': {'BgpConditions': {'AsPathLength': {'Operator': 'ge',
+ 'Value': 10}}}}
+
+ policy = {'name': 'policy0',
+ 'type': 'import',
+ 'statements': [st0]}
+ g1.add_policy(policy, q2)
+
+ # this will be blocked
+ e1.add_route('192.168.100.0/24', aspath=range(e1.asn, e1.asn-10, -1))
+ # this will pass
+ e1.add_route('192.168.200.0/24', aspath=range(e1.asn, e1.asn-8, -1))
+
+ for c in [e1, q1, q2]:
+ g1.wait_for(BGP_FSM_ESTABLISHED, c)
+
+ @staticmethod
+ def check(env):
+ g1 = env.g1
+ e1 = env.e1
+ q1 = env.q1
+ q2 = env.q2
+ wait_for(lambda: len(g1.get_local_rib(q1)) == 2)
+ wait_for(lambda: len(g1.get_adj_rib_out(q1)) == 2)
+ wait_for(lambda: len(q1.get_global_rib()) == 2)
+ wait_for(lambda: len(g1.get_local_rib(q2)) == 1)
+ wait_for(lambda: len(g1.get_adj_rib_out(q2)) == 1)
+ wait_for(lambda: len(q2.get_global_rib()) == 1)
+
+
+@register_scenario
+class ImportPolicyAsPathCondition(object):
+ """
+ No.10 aspath from condition import-policy test
+ --------------------------------
+ e1 ->(aspath=[65100,...])-> | -> q1-rib -> q1-adj-rib-out | --> q1
+ | |
+ | ->x q2-rib |
+ --------------------------------
+ """
+ @staticmethod
+ def boot(env):
+ lookup_scenario("ImportPolicy").boot(env)
+
+ @staticmethod
+ def setup(env):
+ g1 = env.g1
+ e1 = env.e1
+ q1 = env.q1
+ q2 = env.q2
+ as0 = {'AsPathSets': {'AsPathSetList': [{'AsPathSetName': 'as0', 'AsPathList': [{'AsPath': '^{0}'.format(e1.asn)}]}]}}
+
+ g1.set_bgp_defined_set(as0)
+
+ st0 = {'Name': 'st0',
+ 'Conditions': {'BgpConditions': {'MatchAsPathSet': {'AsPathSet': 'as0'}}}}
+
+ policy = {'name': 'policy0',
+ 'type': 'import',
+ 'statements': [st0]}
+ g1.add_policy(policy, q2)
+
+ # this will be blocked
+ e1.add_route('192.168.100.0/24', aspath=range(e1.asn, e1.asn-10, -1))
+ # this will pass
+ e1.add_route('192.168.200.0/24', aspath=range(e1.asn-1, e1.asn-10, -1))
+
+ for c in [e1, q1, q2]:
+ g1.wait_for(BGP_FSM_ESTABLISHED, c)
+
+ @staticmethod
+ def check(env):
+ # same check function as previous No.1 scenario
+ lookup_scenario("ImportPolicy").check(env)
+
+
+@register_scenario
+class ImportPolicyAsPathAnyCondition(object):
+ """
+ No.11 aspath any condition import-policy test
+ --------------------------------
+ e1 ->(aspath=[...65098,...])-> | -> q1-rib -> q1-adj-rib-out | --> q1
+ | |
+ | ->x q2-rib |
+ --------------------------------
+ """
+ @staticmethod
+ def boot(env):
+ lookup_scenario("ImportPolicy").boot(env)
+
+ @staticmethod
+ def setup(env):
+ g1 = env.g1
+ e1 = env.e1
+ q1 = env.q1
+ q2 = env.q2
+ as0 = {'AsPathSets': {'AsPathSetList': [{'AsPathSetName': 'as0', 'AsPathList': [{'AsPath': '65098'}]}]}}
+
+ g1.set_bgp_defined_set(as0)
+
+ st0 = {'Name': 'st0',
+ 'Conditions': {'BgpConditions': {'MatchAsPathSet': {'AsPathSet': 'as0'}}}}
+
+ policy = {'name': 'policy0',
+ 'type': 'import',
+ 'statements': [st0]}
+ g1.add_policy(policy, q2)
+
+ # this will be blocked
+ e1.add_route('192.168.100.0/24', aspath=[65000, 65098, 65010])
+ # this will pass
+ e1.add_route('192.168.200.0/24', aspath=[65000, 65100, 65010])
+
+ for c in [e1, q1, q2]:
+ g1.wait_for(BGP_FSM_ESTABLISHED, c)
+
+ @staticmethod
+ def check(env):
+ # same check function as previous No.1 scenario
+ lookup_scenario("ImportPolicy").check(env)
+
+
+@register_scenario
+class ImportPolicyAsPathOriginCondition(object):
+ """
+ No.12 aspath origin condition import-policy test
+ --------------------------------
+ e1 ->(aspath=[...,65090])-> | -> q1-rib -> q1-adj-rib-out | --> q1
+ | |
+ | ->x q2-rib |
+ --------------------------------
+ """
+ @staticmethod
+ def boot(env):
+ lookup_scenario("ImportPolicy").boot(env)
+
+ @staticmethod
+ def setup(env):
+ g1 = env.g1
+ e1 = env.e1
+ q1 = env.q1
+ q2 = env.q2
+ as0 = {'AsPathSets': {'AsPathSetList': [{'AsPathSetName': 'as0', 'AsPathList': [{'AsPath': '65090$'}]}]}}
+
+ g1.set_bgp_defined_set(as0)
+
+ st0 = {'Name': 'st0',
+ 'Conditions': {'BgpConditions': {'MatchAsPathSet': {'AsPathSet': 'as0'}}}}
+
+ policy = {'name': 'policy0',
+ 'type': 'import',
+ 'statements': [st0]}
+ g1.add_policy(policy, q2)
+
+ # this will be blocked
+ e1.add_route('192.168.100.0/24', aspath=[65000, 65098, 65090])
+ # this will pass
+ e1.add_route('192.168.200.0/24', aspath=[65000, 65100, 65010])
+
+ for c in [e1, q1, q2]:
+ g1.wait_for(BGP_FSM_ESTABLISHED, c)
+
+ @staticmethod
+ def check(env):
+ # same check function as previous No.1 scenario
+ lookup_scenario("ImportPolicy").check(env)
+
+
+@register_scenario
+class ImportPolicyAsPathOnlyCondition(object):
+ """
+ No.13 aspath only condition import-policy test
--------------------------------
- e1 ->(aspath=[...,65090])-> | -> q1-rib -> q1-adj-rib-out | --> q1
+ e1 -> (aspath=[65100]) -> | -> q1-rib -> q1-adj-rib-out | --> q1
| |
| ->x q2-rib |
--------------------------------
+ """
+ @staticmethod
+ def boot(env):
+ lookup_scenario("ImportPolicy").boot(env)
+
+ @staticmethod
+ def setup(env):
+ g1 = env.g1
+ e1 = env.e1
+ q1 = env.q1
+ q2 = env.q2
+ as0 = {'AsPathSets': {'AsPathSetList': [{'AsPathSetName': 'as0', 'AsPathList': [{'AsPath': '^65100$'}]}]}}
+
+ g1.set_bgp_defined_set(as0)
+
+ st0 = {'Name': 'st0',
+ 'Conditions': {'BgpConditions': {'MatchAsPathSet': {'AsPathSet': 'as0'}}}}
+
+ policy = {'name': 'policy0',
+ 'type': 'import',
+ 'statements': [st0]}
+ g1.add_policy(policy, q2)
+
+ # this will be blocked
+ e1.add_route('192.168.100.0/24', aspath=[65100])
+ # this will pass
+ e1.add_route('192.168.200.0/24', aspath=[65000, 65100, 65010])
+
+ for c in [e1, q1, q2]:
+ g1.wait_for(BGP_FSM_ESTABLISHED, c)
+
+ @staticmethod
+ def check(env):
+ # same check function as previous No.1 scenario
+ lookup_scenario("ImportPolicy").check(env)
+
+
+@register_scenario
+class ImportPolicyAsPathMismatchCondition(object):
+ """
+ No.14 aspath condition mismatch import-policy test
+ -------------------------------
+ exabgp ->(aspath=[...,65090])->| -> q1-rib -> q1-adj-rib-out | --> q1
+ | |
+ | -> q2-rib -> q2-adj-rib-out | --> q2
+ -------------------------------
+ This case check if policy passes the path to e1 because of condition mismatch.
+ """
+ @staticmethod
+ def boot(env):
+ lookup_scenario("ImportPolicy").boot(env)
+
+ @staticmethod
+ def setup(env):
+ g1 = env.g1
+ e1 = env.e1
+ q1 = env.q1
+ q2 = env.q2
+ cs0 = {'CommunitySets': {'CommunitySetList':
+ [{'CommunitySetName': 'cs0',
+ 'CommunityList': [{'Community': '65100:10'}]}]}}
+
+ g1.set_bgp_defined_set(cs0)
+
+ st0 = {'Name': 'st0',
+ 'Conditions': {'BgpConditions': {'MatchCommunitySet': {'CommunitySet': 'cs0'}}}}
+
+ policy = {'name': 'policy0',
+ 'type': 'import',
+ 'statements': [st0]}
+ g1.add_policy(policy, q2)
+
+ # this will be blocked
+ e1.add_route('192.168.100.0/24', aspath=[65100, 65090])
+ # this will pass
+ e1.add_route('192.168.200.0/24', aspath=[65000, 65100, 65010])
+
+ for c in [e1, q1, q2]:
+ g1.wait_for(BGP_FSM_ESTABLISHED, c)
+
+ @staticmethod
+ def check(env):
+ g1 = env.g1
+ e1 = env.e1
+ q1 = env.q1
+ q2 = env.q2
+ wait_for(lambda: len(g1.get_local_rib(q1)) == 2)
+ wait_for(lambda: len(g1.get_adj_rib_out(q1)) == 2)
+ wait_for(lambda: len(q1.get_global_rib()) == 2)
+ wait_for(lambda: len(g1.get_local_rib(q2)) == 2)
+ wait_for(lambda: len(g1.get_adj_rib_out(q2)) == 2)
+ wait_for(lambda: len(q2.get_global_rib()) == 2)
+
+
+@register_scenario
+class ImportPolicyCommunityCondition(object):
+ """
+ No.15 community condition import-policy test
+ --------------------------------
+ e1 ->(community=65100:10)-> | -> q1-rib -> q1-adj-rib-out | --> q1
+ | |
+ | ->x q2-rib |
+ --------------------------------
+ """
+ @staticmethod
+ def boot(env):
+ lookup_scenario("ImportPolicy").boot(env)
+
+ @staticmethod
+ def setup(env):
+ g1 = env.g1
+ e1 = env.e1
+ q1 = env.q1
+ q2 = env.q2
+ cs0 = {'CommunitySets':
+ {'CommunitySetList': [{'CommunitySetName': 'cs0', 'CommunityList': [{'Community': '65100:10'}]}]}}
+
+ g1.set_bgp_defined_set(cs0)
+
+ st0 = {'Name': 'st0',
+ 'Conditions': {'BgpConditions': {'MatchCommunitySet': {'CommunitySet': 'cs0'}}}}
+
+ policy = {'name': 'policy0',
+ 'type': 'import',
+ 'statements': [st0]}
+ g1.add_policy(policy, q2)
+
+ # this will be blocked
+ e1.add_route('192.168.100.0/24', community=['65100:10'])
+ # this will pass
+ e1.add_route('192.168.200.0/24', community=['65100:20'])
+
+ for c in [e1, q1, q2]:
+ g1.wait_for(BGP_FSM_ESTABLISHED, c)
+
+
+
+ @staticmethod
+ def check(env):
+ lookup_scenario("ImportPolicy").check(env)
+
+
+@register_scenario
+class ImportPolicyCommunityRegexp(object):
+ """
+ No.16 community condition regexp import-policy test
+ --------------------------------
+ e1 ->(community=65100:10)-> | -> q1-rib -> q1-adj-rib-out | --> q1
+ | |
+ | ->x q2-rib |
+ --------------------------------
+ """
+ @staticmethod
+ def boot(env):
+ lookup_scenario("ImportPolicy").boot(env)
+
+ @staticmethod
+ def setup(env):
+ g1 = env.g1
+ e1 = env.e1
+ q1 = env.q1
+ q2 = env.q2
+ cs0 = {'CommunitySets': {'CommunitySetList': [{'CommunitySetName': 'cs0', 'CommunityList': [{'Community': '6[0-9]+:[0-9]+'}]}]}}
+
+ g1.set_bgp_defined_set(cs0)
+
+ st0 = {'Name': 'st0',
+ 'Conditions': {'BgpConditions': {'MatchCommunitySet': {'CommunitySet': 'cs0'}}}}
+
+ policy = {'name': 'policy0',
+ 'type': 'import',
+ 'statements': [st0]}
+ g1.add_policy(policy, q2)
+
+ # this will be blocked
+ e1.add_route('192.168.100.0/24', community=['65100:10'])
+ # this will pass
+ e1.add_route('192.168.200.0/24', community=['55100:20'])
+
+ for c in [e1, q1, q2]:
+ g1.wait_for(BGP_FSM_ESTABLISHED, c)
+
+ @staticmethod
+ def check(env):
+ lookup_scenario("ImportPolicy").check(env)
-"""
-@scenario(12)
-def boot(env):
- scenarios[1]['boot'](env)
-
-@scenario(12)
-def setup(env):
- g1 = env.g1
- e1 = env.e1
- q1 = env.q1
- q2 = env.q2
- as0 = {'AsPathSets': {'AsPathSetList': [{'AsPathSetName': 'as0', 'AsPathList': [{'AsPath': '65090$'}]}]}}
-
- g1.set_bgp_defined_set(as0)
-
- st0 = {'Name': 'st0',
- 'Conditions':{'BgpConditions':{'MatchAsPathSet':{'AsPathSet': 'as0'}}}}
- policy = {'name': 'policy0',
- 'type': 'import',
- 'statements': [st0]}
- g1.add_policy(policy, q2)
-
- # this will be blocked
- e1.add_route('192.168.100.0/24', aspath=[65000, 65098, 65090])
- # this will pass
- e1.add_route('192.168.200.0/24', aspath=[65000, 65100, 65010])
+def community_exists(path, com):
+ a, b = com.split(':')
+ com = (int(a) << 16) + int(b)
+ for a in path['attrs']:
+ if a['type'] == BGP_ATTR_TYPE_COMMUNITIES and com in a['communities']:
+ return True
+ return False
- for c in [e1, q1, q2]:
- g1.wait_for(BGP_FSM_ESTABLISHED, c)
+@register_scenario
+class ImportPolicyCommunityAction(object):
+ """
+ No.17 community add action import-policy test
+ -------------------------------
+ e1 ->(community=65100:10)-> | -> q1-rib -> q1-adj-rib-out | ->(community=65100:10)-> q1
+ | |
+ | -> q2-rib -> q2-adj-rib-out | ->(community=65100:10,65100:20)-> q2
+ | apply action |
+ -------------------------------
+ """
+ @staticmethod
+ def boot(env):
+ lookup_scenario("ImportPolicy").boot(env)
+
+ @staticmethod
+ def setup(env):
+ g1 = env.g1
+ e1 = env.e1
+ q1 = env.q1
+ q2 = env.q2
+ cs0 = {'CommunitySets': {'CommunitySetList': [{'CommunitySetName': 'cs0', 'CommunityList': [{'Community': '65100:10'}]}]}}
+
+ g1.set_bgp_defined_set(cs0)
+
+ st0 = {'Name': 'st0',
+ 'Conditions': {'BgpConditions': {'MatchCommunitySet': {'CommunitySet': 'cs0'}}},
+ 'Actions': {'RouteDisposition': {'AcceptRoute': True},
+ 'BgpActions': {'SetCommunity': {'Options': 'ADD',
+ 'SetCommunityMethod': {'Communities': ['65100:20']}}}}}
+
+ policy = {'name': 'policy0',
+ 'type': 'import',
+ 'statements': [st0]}
+ g1.add_policy(policy, q2)
+
+ e1.add_route('192.168.100.0/24', community=['65100:10'])
+
+ for c in [e1, q1, q2]:
+ g1.wait_for(BGP_FSM_ESTABLISHED, c)
+
+ @staticmethod
+ def check(env):
+ g1 = env.g1
+ e1 = env.e1
+ q1 = env.q1
+ q2 = env.q2
+ wait_for(lambda: len(g1.get_local_rib(q1)) == 1)
+ wait_for(lambda: len(g1.get_adj_rib_out(q1)) == 1)
+ wait_for(lambda: len(q1.get_global_rib()) == 1)
+ wait_for(lambda: len(g1.get_local_rib(q2)) == 1)
+ wait_for(lambda: len(g1.get_adj_rib_out(q2)) == 1)
+ wait_for(lambda: len(q2.get_global_rib()) == 1)
+
+ @staticmethod
+ def check2(env):
+ g1 = env.g1
+ q1 = env.q1
+ q2 = env.q2
+ path = g1.get_adj_rib_out(q1)[0]
+ env.assertTrue(community_exists(path, '65100:10'))
+ env.assertFalse(community_exists(path, '65100:20'))
+ path = g1.get_adj_rib_out(q2)[0]
+ env.assertTrue(community_exists(path, '65100:10'))
+ env.assertTrue(community_exists(path, '65100:20'))
-@scenario(12)
-def check(env):
- # same check function as previous No.1 scenario
- scenarios[1]['check'](env)
+@register_scenario
+class ImportPolicyCommunityReplace(object):
+ """
+ No.18 community replace action import-policy test
+ -------------------------------
+ e1 ->(community=65100:10)-> | -> q1-rib -> q1-adj-rib-out | ->(community=65100:10)-> q1
+ | |
+ | -> q2-rib -> q2-adj-rib-out | ->(community=65100:20)-> q2
+ | apply action |
+ -------------------------------
+ """
+ @staticmethod
+ def boot(env):
+ lookup_scenario("ImportPolicy").boot(env)
+
+
+ @staticmethod
+ def setup(env):
+ g1 = env.g1
+ e1 = env.e1
+ q1 = env.q1
+ q2 = env.q2
+ cs0 = {'CommunitySets': {'CommunitySetList': [{'CommunitySetName': 'cs0', 'CommunityList': [{'Community': '65100:10'}]}]}}
+
+ g1.set_bgp_defined_set(cs0)
+
+ st0 = {'Name': 'st0',
+ 'Conditions':{'BgpConditions':{'MatchCommunitySet':{'CommunitySet': 'cs0'}}},
+ 'Actions': {'RouteDisposition': {'AcceptRoute': True},
+ 'BgpActions': {'SetCommunity': {'Options': 'REPLACE',
+ 'SetCommunityMethod': {'Communities': ['65100:20']}}}}}
+
+ policy = {'name': 'policy0',
+ 'type': 'import',
+ 'statements': [st0]}
+ g1.add_policy(policy, q2)
+
+ e1.add_route('192.168.100.0/24', community=['65100:10'])
+
+ for c in [e1, q1, q2]:
+ g1.wait_for(BGP_FSM_ESTABLISHED, c)
+
+
+ @staticmethod
+ def check(env):
+ lookup_scenario('ImportPolicyCommunityAction').check(env)
+
+ @staticmethod
+ def check2(env):
+ g1 = env.g1
+ e1 = env.e1
+ q1 = env.q1
+ q2 = env.q2
+ path = g1.get_adj_rib_out(q1)[0]
+ env.assertTrue(community_exists(path, '65100:10'))
+ env.assertFalse(community_exists(path, '65100:20'))
+ path = g1.get_adj_rib_out(q2)[0]
+ env.assertFalse(community_exists(path, '65100:10'))
+ env.assertTrue(community_exists(path, '65100:20'))
-"""
- No.13 aspath only condition import-policy test
- --------------------------------
- e1 -> (aspath=[65100]) -> | -> q1-rib -> q1-adj-rib-out | --> q1
- | |
- | ->x q2-rib |
- --------------------------------
-"""
-@scenario(13)
-def boot(env):
- scenarios[1]['boot'](env)
-
-@scenario(13)
-def setup(env):
- g1 = env.g1
- e1 = env.e1
- q1 = env.q1
- q2 = env.q2
- as0 = {'AsPathSets': {'AsPathSetList': [{'AsPathSetName': 'as0', 'AsPathList': [{'AsPath': '^65100$'}]}]}}
-
- g1.set_bgp_defined_set(as0)
-
- st0 = {'Name': 'st0',
- 'Conditions':{'BgpConditions':{'MatchAsPathSet':{'AsPathSet': 'as0'}}}}
-
- policy = {'name': 'policy0',
- 'type': 'import',
- 'statements': [st0]}
- g1.add_policy(policy, q2)
-
- # this will be blocked
- e1.add_route('192.168.100.0/24', aspath=[65100])
- # this will pass
- e1.add_route('192.168.200.0/24', aspath=[65000, 65100, 65010])
-
- for c in [e1, q1, q2]:
- g1.wait_for(BGP_FSM_ESTABLISHED, c)
-
-@scenario(13)
-def check(env):
- # same check function as previous No.1 scenario
- scenarios[1]['check'](env)
-
-"""
- No.14 aspath condition mismatch import-policy test
- -------------------------------
- exabgp ->(aspath=[...,65090])->| -> q1-rib -> q1-adj-rib-out | --> q1
- | |
- | -> q2-rib -> q2-adj-rib-out | --> q2
- -------------------------------
- This case check if policy passes the path to e1 because of condition mismatch.
-"""
-@scenario(14)
-def boot(env):
- scenarios[1]['boot'](env)
-
-@scenario(14)
-def setup(env):
- g1 = env.g1
- e1 = env.e1
- q1 = env.q1
- q2 = env.q2
- cs0 = {'CommunitySets': {'CommunitySetList': [{'CommunitySetName': 'cs0', 'CommunityList': [{'Community': '65100:10'}]}]}}
-
- g1.set_bgp_defined_set(cs0)
-
- st0 = {'Name': 'st0',
- 'Conditions':{'BgpConditions':{'MatchCommunitySet':{'CommunitySet': 'cs0'}}}}
-
- policy = {'name': 'policy0',
- 'type': 'import',
- 'statements': [st0]}
- g1.add_policy(policy, q2)
-
- # this will be blocked
- e1.add_route('192.168.100.0/24', aspath=[65100, 65090])
- # this will pass
- e1.add_route('192.168.200.0/24', aspath=[65000, 65100, 65010])
-
- for c in [e1, q1, q2]:
- g1.wait_for(BGP_FSM_ESTABLISHED, c)
-
-@scenario(14)
-def check(env):
- g1 = env.g1
- e1 = env.e1
- q1 = env.q1
- q2 = env.q2
- wait_for(lambda : len(g1.get_local_rib(q1)) == 2)
- wait_for(lambda : len(g1.get_adj_rib_out(q1)) == 2)
- wait_for(lambda : len(q1.get_global_rib()) == 2)
- wait_for(lambda : len(g1.get_local_rib(q2)) == 2)
- wait_for(lambda : len(g1.get_adj_rib_out(q2)) == 2)
- wait_for(lambda : len(q2.get_global_rib()) == 2)
-
-
-"""
- No.15 community condition import-policy test
- --------------------------------
- e1 ->(community=65100:10)-> | -> q1-rib -> q1-adj-rib-out | --> q1
- | |
- | ->x q2-rib |
- --------------------------------
-"""
-@scenario(15)
-def boot(env):
- scenarios[1]['boot'](env)
+@register_scenario
+class ImportPolicyCommunityRemove(object):
+ """
+ No.19 community remove action import-policy test
+ -------------------------------
+ e1 ->(community=65100:10)-> | -> q1-rib -> q1-adj-rib-out | ->(community=65100:10)-> q1
+ | |
+ | -> q2-rib -> q2-adj-rib-out | ->(community=null)-> q2
+ | apply action |
+ -------------------------------
+ """
+ @staticmethod
+ def boot(env):
+ lookup_scenario("ImportPolicy").boot(env)
+
+ @staticmethod
+ def setup(env):
+ g1 = env.g1
+ e1 = env.e1
+ q1 = env.q1
+ q2 = env.q2
+ cs0 = {'CommunitySets': {'CommunitySetList': [{'CommunitySetName': 'cs0', 'CommunityList': [{'Community': '65100:10'}]}]}}
+
+ g1.set_bgp_defined_set(cs0)
+
+ st0 = {'Name': 'st0',
+ 'Conditions':{'BgpConditions':{'MatchCommunitySet':{'CommunitySet': 'cs0'}}},
+ 'Actions': {'RouteDisposition': {'AcceptRoute': True},
+ 'BgpActions': {'SetCommunity': {'Options': 'REMOVE',
+ 'SetCommunityMethod': {'Communities': ['65100:10', '65100:20']}}}}}
+
+ policy = {'name': 'policy0',
+ 'type': 'import',
+ 'statements': [st0]}
+ g1.add_policy(policy, q2)
+
+ e1.add_route('192.168.100.0/24', community=['65100:10'])
+ e1.add_route('192.168.110.0/24', community=['65100:10', '65100:20'])
+ e1.add_route('192.168.120.0/24', community=['65100:10', '65100:30'])
+
+ for c in [e1, q1, q2]:
+ g1.wait_for(BGP_FSM_ESTABLISHED, c)
+
+ @staticmethod
+ def check(env):
+ g1 = env.g1
+ e1 = env.e1
+ q1 = env.q1
+ q2 = env.q2
+ wait_for(lambda: len(g1.get_local_rib(q1)) == 3)
+ wait_for(lambda: len(g1.get_adj_rib_out(q1)) == 3)
+ wait_for(lambda: len(q1.get_global_rib()) == 3)
+ wait_for(lambda: len(g1.get_local_rib(q2)) == 3)
+ wait_for(lambda: len(g1.get_adj_rib_out(q2)) == 3)
+ wait_for(lambda: len(q2.get_global_rib()) == 3)
+
+ @staticmethod
+ def check2(env):
+ g1 = env.g1
+ e1 = env.e1
+ q1 = env.q1
+ q2 = env.q2
+ adj_out = g1.get_adj_rib_out(q1)
+ for path in adj_out:
+ env.assertTrue(community_exists(path, '65100:10'))
+ if path['nlri']['prefix'] == '192.168.110.0/24':
+ env.assertTrue(community_exists(path, '65100:20'))
+ if path['nlri']['prefix'] == '192.168.120.0/24':
+ env.assertTrue(community_exists(path, '65100:30'))
+ adj_out = g1.get_adj_rib_out(q2)
+ for path in adj_out:
+ env.assertFalse(community_exists(path, '65100:10'))
+ if path['nlri']['prefix'] == '192.168.110.0/24':
+ env.assertFalse(community_exists(path, '65100:20'))
+ if path['nlri']['prefix'] == '192.168.120.0/24':
+ env.assertTrue(community_exists(path, '65100:30'))
+
+
+@register_scenario
+class ImportPolicyCommunityNull(object):
+ """
+ No.20 community null action import-policy test
+ -------------------------------
+ e1 ->(community=65100:10)-> | -> q1-rib -> q1-adj-rib-out | ->(community=65100:10)-> q1
+ | |
+ | -> q2-rib -> q2-adj-rib-out | ->(community=null)-> q2
+ | apply action |
+ -------------------------------
+ """
+ @staticmethod
+ def boot(env):
+ lookup_scenario("ImportPolicy").boot(env)
+
+ @staticmethod
+ def setup(env):
+ g1 = env.g1
+ e1 = env.e1
+ q1 = env.q1
+ q2 = env.q2
+ cs0 = {'CommunitySets': {'CommunitySetList': [{'CommunitySetName': 'cs0', 'CommunityList': [{'Community': '65100:10'}]}]}}
+
+ g1.set_bgp_defined_set(cs0)
+
+ st0 = {'Name': 'st0',
+ 'Conditions':{'BgpConditions':{'MatchCommunitySet':{'CommunitySet': 'cs0'}}},
+ 'Actions': {'RouteDisposition': {'AcceptRoute': True},
+ 'BgpActions': {'SetCommunity': {'Options': 'REPLACE',
+ 'SetCommunityMethod': {'Communities': []}}}}}
+
+ policy = {'name': 'policy0',
+ 'type': 'import',
+ 'statements': [st0]}
+ g1.add_policy(policy, q2)
+
+ e1.add_route('192.168.100.0/24', community=['65100:10'])
+ e1.add_route('192.168.110.0/24', community=['65100:10', '65100:20'])
+ e1.add_route('192.168.120.0/24', community=['65100:10', '65100:30'])
+
+ for c in [e1, q1, q2]:
+ g1.wait_for(BGP_FSM_ESTABLISHED, c)
+
+ @staticmethod
+ def check(env):
+ lookup_scenario('ImportPolicyCommunityRemove').check(env)
+
+ @staticmethod
+ def check2(env):
+ g1 = env.g1
+ q1 = env.q1
+ q2 = env.q2
+ adj_out = g1.get_adj_rib_out(q1)
+ for path in adj_out:
+ env.assertTrue(community_exists(path, '65100:10'))
+ if path['nlri']['prefix'] == '192.168.110.0/24':
+ env.assertTrue(community_exists(path, '65100:20'))
+ if path['nlri']['prefix'] == '192.168.120.0/24':
+ env.assertTrue(community_exists(path, '65100:30'))
+ adj_out = g1.get_adj_rib_out(q2)
+ for path in adj_out:
+ env.assertFalse(community_exists(path, '65100:10'))
+ if path['nlri']['prefix'] == '192.168.110.0/24':
+ env.assertFalse(community_exists(path, '65100:20'))
+ if path['nlri']['prefix'] == '192.168.120.0/24':
+ env.assertFalse(community_exists(path, '65100:30'))
+
+
+@register_scenario
+class ExportPolicyCommunityAdd(object):
+ """
+ No.21 community add action export-policy test
+ -------------------------------
+ e1 ->(community=65100:10)-> | -> q1-rib -> q1-adj-rib-out | ->(community=65100:10)-> q1
+ | |
+ | -> q2-rib -> q2-adj-rib-out | ->(community=null)-> q2
+ | apply action |
+ -------------------------------
+ """
+ @staticmethod
+ def boot(env):
+ lookup_scenario('ImportPolicy').boot(env)
+
+ @staticmethod
+ def setup(env):
+ g1 = env.g1
+ e1 = env.e1
+ q1 = env.q1
+ q2 = env.q2
+ cs0 = {'CommunitySets': {'CommunitySetList': [{'CommunitySetName': 'cs0', 'CommunityList': [{'Community': '65100:10'}]}]}}
+
+ g1.set_bgp_defined_set(cs0)
+
+ st0 = {'Name': 'st0',
+ 'Conditions':{'BgpConditions':{'MatchCommunitySet':{'CommunitySet': 'cs0'}}},
+ 'Actions': {'RouteDisposition': {'AcceptRoute': True},
+ 'BgpActions': {'SetCommunity': {'Options': 'ADD',
+ 'SetCommunityMethod': {'Communities': ['65100:20']}}}}}
+
+ policy = {'name': 'policy0',
+ 'type': 'export',
+ 'statements': [st0]}
+ g1.add_policy(policy, q2)
+
+ e1.add_route('192.168.100.0/24', community=['65100:10'])
+
+ for c in [e1, q1, q2]:
+ g1.wait_for(BGP_FSM_ESTABLISHED, c)
+
+ @staticmethod
+ def check(env):
+ lookup_scenario('ImportPolicyCommunityAction').check(env)
+
+ @staticmethod
+ def check2(env):
+ g1 = env.g1
+ q1 = env.q1
+ q2 = env.q2
+
+ adj_out = g1.get_adj_rib_out(q1)
+ for path in adj_out:
+ env.assertTrue(community_exists(path, '65100:10'))
+ env.assertFalse(community_exists(path, '65100:20'))
-@scenario(15)
-def setup(env):
- g1 = env.g1
- e1 = env.e1
- q1 = env.q1
- q2 = env.q2
- cs0 = {'CommunitySets': {'CommunitySetList': [{'CommunitySetName': 'cs0', 'CommunityList': [{'Community': '65100:10'}]}]}}
+ local_rib = g1.get_local_rib(q2)
+ for path in local_rib[0]['paths']:
+ env.assertTrue(community_exists(path, '65100:10'))
+ env.assertFalse(community_exists(path, '65100:20'))
- g1.set_bgp_defined_set(cs0)
+ adj_out = g1.get_adj_rib_out(q2)
+ for path in adj_out:
+ env.assertTrue(community_exists(path, '65100:10'))
+ env.assertTrue(community_exists(path, '65100:20'))
- st0 = {'Name': 'st0',
- 'Conditions':{'BgpConditions':{'MatchCommunitySet':{'CommunitySet': 'cs0'}}}}
- policy = {'name': 'policy0',
- 'type': 'import',
- 'statements': [st0]}
- g1.add_policy(policy, q2)
+@register_scenario
+class ExportPolicyCommunityReplace(object):
+ """
+ No.22 community replace action export-policy test
+ -------------------------------
+ e1 ->(community=65100:10)-> | -> q1-rib -> q1-adj-rib-out | ->(community=65100:10)-> q1
+ | |
+ | -> q2-rib -> q2-adj-rib-out | ->(community=65100:20)-> q2
+ | apply action |
+ -------------------------------
+ """
+ @staticmethod
+ def boot(env):
+ lookup_scenario('ImportPolicy').boot(env)
+
+ @staticmethod
+ def setup(env):
+ g1 = env.g1
+ e1 = env.e1
+ q1 = env.q1
+ q2 = env.q2
+ cs0 = {'CommunitySets': {'CommunitySetList': [{'CommunitySetName': 'cs0', 'CommunityList': [{'Community': '65100:10'}]}]}}
+
+ g1.set_bgp_defined_set(cs0)
+
+ st0 = {'Name': 'st0',
+ 'Conditions':{'BgpConditions':{'MatchCommunitySet':{'CommunitySet': 'cs0'}}},
+ 'Actions': {'RouteDisposition': {'AcceptRoute': True},
+ 'BgpActions': {'SetCommunity': {'Options': 'REPLACE',
+ 'SetCommunityMethod': {'Communities': ['65100:20']}}}}}
+
+ policy = {'name': 'policy0',
+ 'type': 'export',
+ 'statements': [st0]}
+ g1.add_policy(policy, q2)
+
+ e1.add_route('192.168.100.0/24', community=['65100:10'])
+
+ for c in [e1, q1, q2]:
+ g1.wait_for(BGP_FSM_ESTABLISHED, c)
+
+ @staticmethod
+ def check(env):
+ lookup_scenario('ImportPolicyCommunityAction').check(env)
+
+ @staticmethod
+ def check2(env):
+ g1 = env.g1
+ q1 = env.q1
+ q2 = env.q2
+
+ adj_out = g1.get_adj_rib_out(q1)
+ for path in adj_out:
+ env.assertTrue(community_exists(path, '65100:10'))
+ env.assertFalse(community_exists(path, '65100:20'))
- # this will be blocked
- e1.add_route('192.168.100.0/24', community=['65100:10'])
- # this will pass
- e1.add_route('192.168.200.0/24', community=['65100:20'])
+ local_rib = g1.get_local_rib(q2)
+ for path in local_rib[0]['paths']:
+ env.assertTrue(community_exists(path, '65100:10'))
+ env.assertFalse(community_exists(path, '65100:20'))
- for c in [e1, q1, q2]:
- g1.wait_for(BGP_FSM_ESTABLISHED, c)
+ adj_out = g1.get_adj_rib_out(q2)
+ for path in adj_out:
+ env.assertFalse(community_exists(path, '65100:10'))
+ env.assertTrue(community_exists(path, '65100:20'))
+@register_scenario
+class ExportPolicyCommunityRemove(object):
+ """
+ No.23 community replace action export-policy test
+ -------------------------------
+ e1 ->(community=65100:10)-> | -> q1-rib -> q1-adj-rib-out | ->(community=65100:10)-> q1
+ | |
+ | -> q2-rib -> q2-adj-rib-out | ->(community=null)-> q2
+ | apply action |
+ -------------------------------
+ """
+ @staticmethod
+ def boot(env):
+ lookup_scenario('ImportPolicy').boot(env)
+
+ @staticmethod
+ def setup(env):
+ g1 = env.g1
+ e1 = env.e1
+ q1 = env.q1
+ q2 = env.q2
+ cs0 = {'CommunitySets': {'CommunitySetList': [{'CommunitySetName': 'cs0', 'CommunityList': [{'Community': '65100:10'}]}]}}
+
+ g1.set_bgp_defined_set(cs0)
+
+ st0 = {'Name': 'st0',
+ 'Conditions':{'BgpConditions':{'MatchCommunitySet':{'CommunitySet': 'cs0'}}},
+ 'Actions': {'RouteDisposition': {'AcceptRoute': True},
+ 'BgpActions': {'SetCommunity': {'Options': 'REMOVE',
+ 'SetCommunityMethod': {'Communities': ['65100:20', '65100:30']}}}}}
+
+ policy = {'name': 'policy0',
+ 'type': 'export',
+ 'statements': [st0]}
+ g1.add_policy(policy, q2)
+
+ e1.add_route('192.168.100.0/24', community=['65100:10', '65100:20', '65100:30'])
+
+ for c in [e1, q1, q2]:
+ g1.wait_for(BGP_FSM_ESTABLISHED, c)
+
+ @staticmethod
+ def check(env):
+ lookup_scenario('ImportPolicyCommunityAction').check(env)
+
+ @staticmethod
+ def check2(env):
+ g1 = env.g1
+ q1 = env.q1
+ q2 = env.q2
+
+ adj_out = g1.get_adj_rib_out(q1)
+ for path in adj_out:
+ env.assertTrue(community_exists(path, '65100:10'))
+ env.assertTrue(community_exists(path, '65100:20'))
+ env.assertTrue(community_exists(path, '65100:30'))
-@scenario(15)
-def check(env):
- # same check function as previous No.1 scenario
- scenarios[1]['check'](env)
+ local_rib = g1.get_local_rib(q2)
+ for path in local_rib[0]['paths']:
+ env.assertTrue(community_exists(path, '65100:10'))
+ env.assertTrue(community_exists(path, '65100:20'))
+ env.assertTrue(community_exists(path, '65100:30'))
-"""
- No.16 community condition regexp import-policy test
- --------------------------------
- e1 ->(community=65100:10)-> | -> q1-rib -> q1-adj-rib-out | --> q1
- | |
- | ->x q2-rib |
- --------------------------------
-"""
-@scenario(16)
-def boot(env):
- scenarios[1]['boot'](env)
-
-@scenario(16)
-def setup(env):
- g1 = env.g1
- e1 = env.e1
- q1 = env.q1
- q2 = env.q2
- cs0 = {'CommunitySets': {'CommunitySetList': [{'CommunitySetName': 'cs0', 'CommunityList': [{'Community': '6[0-9]+:[0-9]+'}]}]}}
-
- g1.set_bgp_defined_set(cs0)
-
- st0 = {'Name': 'st0',
- 'Conditions':{'BgpConditions':{'MatchCommunitySet':{'CommunitySet': 'cs0'}}}}
-
- policy = {'name': 'policy0',
- 'type': 'import',
- 'statements': [st0]}
- g1.add_policy(policy, q2)
-
- # this will be blocked
- e1.add_route('192.168.100.0/24', community=['65100:10'])
- # this will pass
- e1.add_route('192.168.200.0/24', community=['55100:20'])
-
- for c in [e1, q1, q2]:
- g1.wait_for(BGP_FSM_ESTABLISHED, c)
-
-@scenario(16)
-def check(env):
- # same check function as previous No.4 scenario
- scenarios[1]['check'](env)
-
-"""
- No.17 community add action import-policy test
- -------------------------------
- e1 ->(community=65100:10)-> | -> q1-rib -> q1-adj-rib-out | ->(community=65100:10)-> q1
- | |
- | -> q2-rib -> q2-adj-rib-out | ->(community=65100:10,65100:20)-> q2
- | apply action |
- -------------------------------
-"""
-@scenario(17)
-def boot(env):
- scenarios[1]['boot'](env)
-
-@scenario(17)
-def setup(env):
- g1 = env.g1
- e1 = env.e1
- q1 = env.q1
- q2 = env.q2
- cs0 = {'CommunitySets': {'CommunitySetList': [{'CommunitySetName': 'cs0', 'CommunityList': [{'Community': '65100:10'}]}]}}
-
- g1.set_bgp_defined_set(cs0)
-
- st0 = {'Name': 'st0',
- 'Conditions':{'BgpConditions':{'MatchCommunitySet':{'CommunitySet': 'cs0'}}},
- 'Actions': {'RouteDisposition': {'AcceptRoute': True},
- 'BgpActions': {'SetCommunity': {'Options': 'ADD',
- 'SetCommunityMethod': {'Communities': ['65100:20']}}}}}
-
- policy = {'name': 'policy0',
- 'type': 'import',
- 'statements': [st0]}
- g1.add_policy(policy, q2)
-
- e1.add_route('192.168.100.0/24', community=['65100:10'])
-
- for c in [e1, q1, q2]:
- g1.wait_for(BGP_FSM_ESTABLISHED, c)
+ adj_out = g1.get_adj_rib_out(q2)
+ for path in adj_out:
+ env.assertTrue(community_exists(path, '65100:10'))
+ env.assertFalse(community_exists(path, '65100:20'))
+ env.assertFalse(community_exists(path, '65100:30'))
-def community_exists(path, com):
- a, b = com.split(':')
- com = (int(a) << 16) + int(b)
- for a in path['attrs']:
- if a['type'] == BGP_ATTR_TYPE_COMMUNITIES and com in a['communities']:
- return True
- return False
-@scenario(17)
-def check(env):
- g1 = env.g1
- e1 = env.e1
- q1 = env.q1
- q2 = env.q2
- wait_for(lambda : len(g1.get_local_rib(q1)) == 1)
- wait_for(lambda : len(g1.get_adj_rib_out(q1)) == 1)
- wait_for(lambda : len(q1.get_global_rib()) == 1)
- wait_for(lambda : len(g1.get_local_rib(q2)) == 1)
- wait_for(lambda : len(g1.get_adj_rib_out(q2)) == 1)
- wait_for(lambda : len(q2.get_global_rib()) == 1)
-
-@scenario(17)
-def check2(env):
- g1 = env.g1
- q1 = env.q1
- q2 = env.q2
- path = g1.get_adj_rib_out(q1)[0]
- env.assertTrue(community_exists(path, '65100:10'))
- env.assertFalse(community_exists(path, '65100:20'))
- path = g1.get_adj_rib_out(q2)[0]
- env.assertTrue(community_exists(path, '65100:10'))
- env.assertTrue(community_exists(path, '65100:20'))
-
-"""
- No.18 community replace action import-policy test
- -------------------------------
- e1 ->(community=65100:10)-> | -> q1-rib -> q1-adj-rib-out | ->(community=65100:10)-> q1
- | |
- | -> q2-rib -> q2-adj-rib-out | ->(community=65100:20)-> q2
- | apply action |
- -------------------------------
-"""
-@scenario(18)
-def boot(env):
- scenarios[1]['boot'](env)
-
-
-@scenario(18)
-def setup(env):
- g1 = env.g1
- e1 = env.e1
- q1 = env.q1
- q2 = env.q2
- cs0 = {'CommunitySets': {'CommunitySetList': [{'CommunitySetName': 'cs0', 'CommunityList': [{'Community': '65100:10'}]}]}}
-
- g1.set_bgp_defined_set(cs0)
-
- st0 = {'Name': 'st0',
- 'Conditions':{'BgpConditions':{'MatchCommunitySet':{'CommunitySet': 'cs0'}}},
- 'Actions': {'RouteDisposition': {'AcceptRoute': True},
- 'BgpActions': {'SetCommunity': {'Options': 'REPLACE',
- 'SetCommunityMethod': {'Communities': ['65100:20']}}}}}
-
- policy = {'name': 'policy0',
- 'type': 'import',
- 'statements': [st0]}
- g1.add_policy(policy, q2)
-
- e1.add_route('192.168.100.0/24', community=['65100:10'])
-
- for c in [e1, q1, q2]:
- g1.wait_for(BGP_FSM_ESTABLISHED, c)
-
-
-
-@scenario(18)
-def check(env):
- # same check function as previous No.17 scenario
- scenarios[17]['check'](env)
-
-@scenario(18)
-def check2(env):
- g1 = env.g1
- e1 = env.e1
- q1 = env.q1
- q2 = env.q2
- path = g1.get_adj_rib_out(q1)[0]
- env.assertTrue(community_exists(path, '65100:10'))
- env.assertFalse(community_exists(path, '65100:20'))
- path = g1.get_adj_rib_out(q2)[0]
- env.assertFalse(community_exists(path, '65100:10'))
- env.assertTrue(community_exists(path, '65100:20'))
-
-"""
- No.19 community remove action import-policy test
- -------------------------------
- e1 ->(community=65100:10)-> | -> q1-rib -> q1-adj-rib-out | ->(community=65100:10)-> q1
- | |
- | -> q2-rib -> q2-adj-rib-out | ->(community=null)-> q2
- | apply action |
- -------------------------------
-"""
-@scenario(19)
-def boot(env):
- scenarios[1]['boot'](env)
-
-@scenario(19)
-def setup(env):
- g1 = env.g1
- e1 = env.e1
- q1 = env.q1
- q2 = env.q2
- cs0 = {'CommunitySets': {'CommunitySetList': [{'CommunitySetName': 'cs0', 'CommunityList': [{'Community': '65100:10'}]}]}}
-
- g1.set_bgp_defined_set(cs0)
-
- st0 = {'Name': 'st0',
- 'Conditions':{'BgpConditions':{'MatchCommunitySet':{'CommunitySet': 'cs0'}}},
- 'Actions': {'RouteDisposition': {'AcceptRoute': True},
- 'BgpActions': {'SetCommunity': {'Options': 'REMOVE',
- 'SetCommunityMethod': {'Communities': ['65100:10', '65100:20']}}}}}
-
- policy = {'name': 'policy0',
- 'type': 'import',
- 'statements': [st0]}
- g1.add_policy(policy, q2)
-
- e1.add_route('192.168.100.0/24', community=['65100:10'])
- e1.add_route('192.168.110.0/24', community=['65100:10', '65100:20'])
- e1.add_route('192.168.120.0/24', community=['65100:10', '65100:30'])
-
- for c in [e1, q1, q2]:
- g1.wait_for(BGP_FSM_ESTABLISHED, c)
-
-@scenario(19)
-def check(env):
- g1 = env.g1
- e1 = env.e1
- q1 = env.q1
- q2 = env.q2
- wait_for(lambda : len(g1.get_local_rib(q1)) == 3)
- wait_for(lambda : len(g1.get_adj_rib_out(q1)) == 3)
- wait_for(lambda : len(q1.get_global_rib()) == 3)
- wait_for(lambda : len(g1.get_local_rib(q2)) == 3)
- wait_for(lambda : len(g1.get_adj_rib_out(q2)) == 3)
- wait_for(lambda : len(q2.get_global_rib()) == 3)
-
-@scenario(19)
-def check2(env):
- g1 = env.g1
- e1 = env.e1
- q1 = env.q1
- q2 = env.q2
- adj_out = g1.get_adj_rib_out(q1)
- for path in adj_out:
- env.assertTrue(community_exists(path, '65100:10'))
- if path['nlri']['prefix'] == '192.168.110.0/24':
+@register_scenario
+class ExportPolicyCommunityNull(object):
+ """
+ No.24 community null action export-policy test
+ -------------------------------
+ e1 ->(community=65100:10)-> | -> q1-rib -> q1-adj-rib-out | ->(community=65100:10)-> q1
+ | |
+ | -> q2-rib -> q2-adj-rib-out | ->(community=null)-> q2
+ | apply action |
+ -------------------------------
+ """
+ @staticmethod
+ def boot(env):
+ lookup_scenario('ImportPolicy').boot(env)
+
+ @staticmethod
+ def setup(env):
+ g1 = env.g1
+ e1 = env.e1
+ q1 = env.q1
+ q2 = env.q2
+ cs0 = {'CommunitySets': {'CommunitySetList': [{'CommunitySetName': 'cs0', 'CommunityList': [{'Community': '65100:10'}]}]}}
+
+ g1.set_bgp_defined_set(cs0)
+
+ st0 = {'Name': 'st0',
+ 'Conditions':{'BgpConditions':{'MatchCommunitySet':{'CommunitySet': 'cs0'}}},
+ 'Actions': {'RouteDisposition': {'AcceptRoute': True},
+ 'BgpActions': {'SetCommunity': {'Options': 'REPLACE',
+ 'SetCommunityMethod': {'Communities': []}}}}}
+
+ policy = {'name': 'policy0',
+ 'type': 'export',
+ 'statements': [st0]}
+ g1.add_policy(policy, q2)
+
+ e1.add_route('192.168.100.0/24', community=['65100:10', '65100:20', '65100:30'])
+
+ for c in [e1, q1, q2]:
+ g1.wait_for(BGP_FSM_ESTABLISHED, c)
+
+ @staticmethod
+ def check(env):
+ lookup_scenario('ImportPolicyCommunityAction').check(env)
+
+ @staticmethod
+ def check2(env):
+ g1 = env.g1
+ q1 = env.q1
+ q2 = env.q2
+
+ adj_out = g1.get_adj_rib_out(q1)
+ for path in adj_out:
+ env.assertTrue(community_exists(path, '65100:10'))
env.assertTrue(community_exists(path, '65100:20'))
- if path['nlri']['prefix'] == '192.168.120.0/24':
- env.assertTrue(community_exists(path, '65100:30'))
- adj_out = g1.get_adj_rib_out(q2)
- for path in adj_out:
- env.assertFalse(community_exists(path, '65100:10'))
- if path['nlri']['prefix'] == '192.168.110.0/24':
- env.assertFalse(community_exists(path, '65100:20'))
- if path['nlri']['prefix'] == '192.168.120.0/24':
env.assertTrue(community_exists(path, '65100:30'))
-"""
- No.20 community null action import-policy test
- -------------------------------
- e1 ->(community=65100:10)-> | -> q1-rib -> q1-adj-rib-out | ->(community=65100:10)-> q1
- | |
- | -> q2-rib -> q2-adj-rib-out | ->(community=null)-> q2
- | apply action |
- -------------------------------
-"""
-@scenario(20)
-def boot(env):
- scenarios[1]['boot'](env)
-
-@scenario(20)
-def setup(env):
- g1 = env.g1
- e1 = env.e1
- q1 = env.q1
- q2 = env.q2
- cs0 = {'CommunitySets': {'CommunitySetList': [{'CommunitySetName': 'cs0', 'CommunityList': [{'Community': '65100:10'}]}]}}
-
- g1.set_bgp_defined_set(cs0)
-
- st0 = {'Name': 'st0',
- 'Conditions':{'BgpConditions':{'MatchCommunitySet':{'CommunitySet': 'cs0'}}},
- 'Actions': {'RouteDisposition': {'AcceptRoute': True},
- 'BgpActions': {'SetCommunity': {'Options': 'REPLACE',
- 'SetCommunityMethod': {'Communities': []}}}}}
-
- policy = {'name': 'policy0',
- 'type': 'import',
- 'statements': [st0]}
- g1.add_policy(policy, q2)
-
- e1.add_route('192.168.100.0/24', community=['65100:10'])
- e1.add_route('192.168.110.0/24', community=['65100:10', '65100:20'])
- e1.add_route('192.168.120.0/24', community=['65100:10', '65100:30'])
-
- for c in [e1, q1, q2]:
- g1.wait_for(BGP_FSM_ESTABLISHED, c)
-
-@scenario(20)
-def check(env):
- scenarios[19]['check'](env)
-
-@scenario(20)
-def check2(env):
- g1 = env.g1
- q1 = env.q1
- q2 = env.q2
- adj_out = g1.get_adj_rib_out(q1)
- for path in adj_out:
- env.assertTrue(community_exists(path, '65100:10'))
- if path['nlri']['prefix'] == '192.168.110.0/24':
+ local_rib = g1.get_local_rib(q2)
+ for path in local_rib[0]['paths']:
+ env.assertTrue(community_exists(path, '65100:10'))
env.assertTrue(community_exists(path, '65100:20'))
- if path['nlri']['prefix'] == '192.168.120.0/24':
env.assertTrue(community_exists(path, '65100:30'))
- adj_out = g1.get_adj_rib_out(q2)
- for path in adj_out:
- env.assertFalse(community_exists(path, '65100:10'))
- if path['nlri']['prefix'] == '192.168.110.0/24':
+
+ adj_out = g1.get_adj_rib_out(q2)
+ for path in adj_out:
+ env.assertFalse(community_exists(path, '65100:10'))
env.assertFalse(community_exists(path, '65100:20'))
- if path['nlri']['prefix'] == '192.168.120.0/24':
env.assertFalse(community_exists(path, '65100:30'))
+def metric(path):
+ for a in path['attrs']:
+ if 'metric' in a:
+ return a['metric']
+ return -1
-"""
- No.21 community add action export-policy test
- -------------------------------
- e1 ->(community=65100:10)-> | -> q1-rib -> q1-adj-rib-out | ->(community=65100:10)-> q1
- | |
- | -> q2-rib -> q2-adj-rib-out | ->(community=null)-> q2
- | apply action |
- -------------------------------
-"""
-@scenario(21)
-def boot(env):
- scenarios[1]['boot'](env)
-
-@scenario(21)
-def setup(env):
- g1 = env.g1
- e1 = env.e1
- q1 = env.q1
- q2 = env.q2
- cs0 = {'CommunitySets': {'CommunitySetList': [{'CommunitySetName': 'cs0', 'CommunityList': [{'Community': '65100:10'}]}]}}
-
- g1.set_bgp_defined_set(cs0)
-
- st0 = {'Name': 'st0',
- 'Conditions':{'BgpConditions':{'MatchCommunitySet':{'CommunitySet': 'cs0'}}},
- 'Actions': {'RouteDisposition': {'AcceptRoute': True},
- 'BgpActions': {'SetCommunity': {'Options': 'ADD',
- 'SetCommunityMethod': {'Communities': ['65100:20']}}}}}
-
- policy = {'name': 'policy0',
- 'type': 'export',
- 'statements': [st0]}
- g1.add_policy(policy, q2)
-
- e1.add_route('192.168.100.0/24', community=['65100:10'])
-
- for c in [e1, q1, q2]:
- g1.wait_for(BGP_FSM_ESTABLISHED, c)
-
-@scenario(21)
-def check(env):
- scenarios[17]['check'](env)
-
-@scenario(21)
-def check2(env):
- g1 = env.g1
- q1 = env.q1
- q2 = env.q2
-
- adj_out = g1.get_adj_rib_out(q1)
- for path in adj_out:
- env.assertTrue(community_exists(path, '65100:10'))
- env.assertFalse(community_exists(path, '65100:20'))
- local_rib = g1.get_local_rib(q2)
- for path in local_rib[0]['paths']:
- env.assertTrue(community_exists(path, '65100:10'))
- env.assertFalse(community_exists(path, '65100:20'))
+@register_scenario
+class ImportPolicyMedReplace(object):
+ """
+ No.25 med replace action import-policy test
+ -------------------------------
+ e1 ->(med=300)-> | -> q1-rib -> q1-adj-rib-out | ->(med=300)-> q1
+ | |
+ | -> q2-rib -> q2-adj-rib-out | ->(med=100)-> q2
+ | apply action |
+ -------------------------------
+ """
+ @staticmethod
+ def boot(env):
+ lookup_scenario('ImportPolicy').boot(env)
+
+ @staticmethod
+ def setup(env):
+ g1 = env.g1
+ e1 = env.e1
+ q1 = env.q1
+ q2 = env.q2
+ st0 = {'Name': 'st0',
+ 'Actions': {'RouteDisposition': {'AcceptRoute': True},
+ 'BgpActions': {'SetMed': '100'}}}
+
+ policy = {'name': 'policy0',
+ 'type': 'import',
+ 'statements': [st0]}
+ g1.add_policy(policy, q2)
+
+ e1.add_route('192.168.100.0/24', med=300)
+
+ for c in [e1, q1, q2]:
+ g1.wait_for(BGP_FSM_ESTABLISHED, c)
+
+ @staticmethod
+ def check(env):
+ lookup_scenario('ImportPolicyCommunityAction').check(env)
+
+ @staticmethod
+ def check2(env):
+ g1 = env.g1
+ q1 = env.q1
+ q2 = env.q2
+
+ adj_out = g1.get_adj_rib_out(q1)
+ env.assertTrue(metric(adj_out[0]) == 300)
+
+ local_rib = g1.get_local_rib(q2)
+ env.assertTrue(metric(local_rib[0]['paths'][0]) == 100)
+
+ adj_out = g1.get_adj_rib_out(q2)
+ env.assertTrue(metric(adj_out[0]) == 100)
- adj_out = g1.get_adj_rib_out(q2)
- for path in adj_out:
- env.assertTrue(community_exists(path, '65100:10'))
- env.assertTrue(community_exists(path, '65100:20'))
-"""
- No.22 community replace action export-policy test
- -------------------------------
- e1 ->(community=65100:10)-> | -> q1-rib -> q1-adj-rib-out | ->(community=65100:10)-> q1
- | |
- | -> q2-rib -> q2-adj-rib-out | ->(community=65100:20)-> q2
- | apply action |
- -------------------------------
-"""
-@scenario(22)
-def boot(env):
- scenarios[1]['boot'](env)
-
-
-@scenario(22)
-def setup(env):
- g1 = env.g1
- e1 = env.e1
- q1 = env.q1
- q2 = env.q2
- cs0 = {'CommunitySets': {'CommunitySetList': [{'CommunitySetName': 'cs0', 'CommunityList': [{'Community': '65100:10'}]}]}}
-
- g1.set_bgp_defined_set(cs0)
-
- st0 = {'Name': 'st0',
- 'Conditions':{'BgpConditions':{'MatchCommunitySet':{'CommunitySet': 'cs0'}}},
- 'Actions': {'RouteDisposition': {'AcceptRoute': True},
- 'BgpActions': {'SetCommunity': {'Options': 'REPLACE',
- 'SetCommunityMethod': {'Communities': ['65100:20']}}}}}
-
- policy = {'name': 'policy0',
- 'type': 'export',
- 'statements': [st0]}
- g1.add_policy(policy, q2)
-
- e1.add_route('192.168.100.0/24', community=['65100:10'])
-
- for c in [e1, q1, q2]:
- g1.wait_for(BGP_FSM_ESTABLISHED, c)
-
-@scenario(22)
-def check(env):
- scenarios[17]['check'](env)
-
-@scenario(22)
-def check2(env):
- g1 = env.g1
- q1 = env.q1
- q2 = env.q2
-
- adj_out = g1.get_adj_rib_out(q1)
- for path in adj_out:
- env.assertTrue(community_exists(path, '65100:10'))
- env.assertFalse(community_exists(path, '65100:20'))
+@register_scenario
+class ImportPolicyMedAdd(object):
+ """
+ No.26 med add action import-policy test
+ -------------------------------
+ e1 ->(med=300)-> | -> q1-rib -> q1-adj-rib-out | ->(med=300)-> q1
+ | |
+ | -> q2-rib -> q2-adj-rib-out | ->(med=300+100)-> q2
+ | apply action |
+ -------------------------------
+ """
+ @staticmethod
+ def boot(env):
+ lookup_scenario('ImportPolicy').boot(env)
+
+ @staticmethod
+ def setup(env):
+ g1 = env.g1
+ e1 = env.e1
+ q1 = env.q1
+ q2 = env.q2
+ st0 = {'Name': 'st0',
+ 'Actions': {'RouteDisposition': {'AcceptRoute': True},
+ 'BgpActions': {'SetMed': '+100'}}}
+
+ policy = {'name': 'policy0',
+ 'type': 'import',
+ 'statements': [st0]}
+ g1.add_policy(policy, q2)
+
+ e1.add_route('192.168.100.0/24', med=300)
+
+ for c in [e1, q1, q2]:
+ g1.wait_for(BGP_FSM_ESTABLISHED, c)
+
+ @staticmethod
+ def check(env):
+ lookup_scenario('ImportPolicyCommunityAction').check(env)
+
+ @staticmethod
+ def check2(env):
+ g1 = env.g1
+ q1 = env.q1
+ q2 = env.q2
+
+ adj_out = g1.get_adj_rib_out(q1)
+ env.assertTrue(metric(adj_out[0]) == 300)
+
+ local_rib = g1.get_local_rib(q2)
+ env.assertTrue(metric(local_rib[0]['paths'][0]) == 400)
+
+ adj_out = g1.get_adj_rib_out(q2)
+ env.assertTrue(metric(adj_out[0]) == 400)
+
+
+@register_scenario
+class ImportPolicyMedSub(object):
+ """
+ No.27 med subtract action import-policy test
+ -------------------------------
+ e1 ->(med=300)-> | -> q1-rib -> q1-adj-rib-out | ->(med=300)-> q1
+ | |
+ | -> q2-rib -> q2-adj-rib-out | ->(med=300-100)-> q2
+ | apply action |
+ -------------------------------
+ """
+ @staticmethod
+ def boot(env):
+ lookup_scenario('ImportPolicy').boot(env)
+
+ @staticmethod
+ def setup(env):
+ g1 = env.g1
+ e1 = env.e1
+ q1 = env.q1
+ q2 = env.q2
+ st0 = {'Name': 'st0',
+ 'Actions': {'RouteDisposition': {'AcceptRoute': True},
+ 'BgpActions': {'SetMed': '-100'}}}
+
+ policy = {'name': 'policy0',
+ 'type': 'import',
+ 'statements': [st0]}
+ g1.add_policy(policy, q2)
+
+ e1.add_route('192.168.100.0/24', med=300)
+
+ for c in [e1, q1, q2]:
+ g1.wait_for(BGP_FSM_ESTABLISHED, c)
+
+ @staticmethod
+ def check(env):
+ lookup_scenario('ImportPolicyCommunityAction').check(env)
+
+ @staticmethod
+ def check2(env):
+ g1 = env.g1
+ q1 = env.q1
+ q2 = env.q2
+
+ adj_out = g1.get_adj_rib_out(q1)
+ env.assertTrue(metric(adj_out[0]) == 300)
+
+ local_rib = g1.get_local_rib(q2)
+ env.assertTrue(metric(local_rib[0]['paths'][0]) == 200)
+
+ adj_out = g1.get_adj_rib_out(q2)
+ env.assertTrue(metric(adj_out[0]) == 200)
+
+
+@register_scenario
+class ExportPolicyMedReplace(object):
+ """
+ No.28 med replace action export-policy test
+ -------------------------------
+ e1 ->(med=300)-> | -> q1-rib -> q1-adj-rib-out | ->(med=300)-> q1
+ | |
+ | -> q2-rib -> q2-adj-rib-out | ->(med=100)-> q2
+ | apply action |
+ -------------------------------
+ """
+ @staticmethod
+ def boot(env):
+ lookup_scenario('ImportPolicy').boot(env)
+
+ @staticmethod
+ def setup(env):
+ g1 = env.g1
+ e1 = env.e1
+ q1 = env.q1
+ q2 = env.q2
+ st0 = {'Name': 'st0',
+ 'Actions': {'RouteDisposition': {'AcceptRoute': True},
+ 'BgpActions': {'SetMed': '100'}}}
+
+ policy = {'name': 'policy0',
+ 'type': 'export',
+ 'statements': [st0]}
+ g1.add_policy(policy, q2)
+
+ e1.add_route('192.168.100.0/24', med=300)
+
+ for c in [e1, q1, q2]:
+ g1.wait_for(BGP_FSM_ESTABLISHED, c)
+
+ @staticmethod
+ def check(env):
+ lookup_scenario('ImportPolicyCommunityAction').check(env)
+
+ @staticmethod
+ def check2(env):
+ g1 = env.g1
+ q1 = env.q1
+ q2 = env.q2
+
+ adj_out = g1.get_adj_rib_out(q1)
+ env.assertTrue(metric(adj_out[0]) == 300)
+
+ local_rib = g1.get_local_rib(q2)
+ env.assertTrue(metric(local_rib[0]['paths'][0]) == 300)
+
+ adj_out = g1.get_adj_rib_out(q2)
+ env.assertTrue(metric(adj_out[0]) == 100)
- local_rib = g1.get_local_rib(q2)
- for path in local_rib[0]['paths']:
- env.assertTrue(community_exists(path, '65100:10'))
- env.assertFalse(community_exists(path, '65100:20'))
- adj_out = g1.get_adj_rib_out(q2)
- for path in adj_out:
- env.assertFalse(community_exists(path, '65100:10'))
- env.assertTrue(community_exists(path, '65100:20'))
+@register_scenario
+class ExportPolicyMedAdd(object):
+ """
+ No.29 med add action export-policy test
+ -------------------------------
+ e1 ->(med=300)-> | -> q1-rib -> q1-adj-rib-out | ->(med=300)-> q1
+ | |
+ | -> q2-rib -> q2-adj-rib-out | ->(med=300+100)-> q2
+ | apply action |
+ -------------------------------
+ """
+ @staticmethod
+ def boot(env):
+ lookup_scenario('ImportPolicy').boot(env)
+
+ @staticmethod
+ def setup(env):
+ g1 = env.g1
+ e1 = env.e1
+ q1 = env.q1
+ q2 = env.q2
+ st0 = {'Name': 'st0',
+ 'Actions': {'RouteDisposition': {'AcceptRoute': True},
+ 'BgpActions': {'SetMed': '+100'}}}
+
+ policy = {'name': 'policy0',
+ 'type': 'export',
+ 'statements': [st0]}
+ g1.add_policy(policy, q2)
+
+ e1.add_route('192.168.100.0/24', med=300)
+
+ for c in [e1, q1, q2]:
+ g1.wait_for(BGP_FSM_ESTABLISHED, c)
+
+ @staticmethod
+ def check(env):
+ lookup_scenario('ImportPolicyCommunityAction').check(env)
+
+ @scenario(29)
+ def check2(env):
+ g1 = env.g1
+ q1 = env.q1
+ q2 = env.q2
+
+ adj_out = g1.get_adj_rib_out(q1)
+ env.assertTrue(metric(adj_out[0]) == 300)
+
+ local_rib = g1.get_local_rib(q2)
+ env.assertTrue(metric(local_rib[0]['paths'][0]) == 300)
+
+ adj_out = g1.get_adj_rib_out(q2)
+ env.assertTrue(metric(adj_out[0]) == 400)
+
+
+@register_scenario
+class ExportPolicyMedSub(object):
+ """
+ No.30 med subtract action export-policy test
+ -------------------------------
+ e1 ->(med=300)-> | -> q1-rib -> q1-adj-rib-out | ->(med=300)-> q1
+ | |
+ | -> q2-rib -> q2-adj-rib-out | ->(med=300-100)-> q2
+ | apply action |
+ -------------------------------
+ """
+ @staticmethod
+ def boot(env):
+ lookup_scenario('ImportPolicy').boot(env)
+
+ @staticmethod
+ def setup(env):
+ g1 = env.g1
+ e1 = env.e1
+ q1 = env.q1
+ q2 = env.q2
+ st0 = {'Name': 'st0',
+ 'Actions': {'RouteDisposition': {'AcceptRoute': True},
+ 'BgpActions': {'SetMed': '-100'}}}
+
+ policy = {'name': 'policy0',
+ 'type': 'export',
+ 'statements': [st0]}
+ g1.add_policy(policy, q2)
+
+ e1.add_route('192.168.100.0/24', med=300)
+
+ for c in [e1, q1, q2]:
+ g1.wait_for(BGP_FSM_ESTABLISHED, c)
+
+ @staticmethod
+ def check(env):
+ lookup_scenario('ImportPolicyCommunityAction').check(env)
+
+ @staticmethod
+ def check2(env):
+ g1 = env.g1
+ q1 = env.q1
+ q2 = env.q2
+
+ adj_out = g1.get_adj_rib_out(q1)
+ env.assertTrue(metric(adj_out[0]) == 300)
+
+ local_rib = g1.get_local_rib(q2)
+ env.assertTrue(metric(local_rib[0]['paths'][0]) == 300)
+
+ adj_out = g1.get_adj_rib_out(q2)
+ env.assertTrue(metric(adj_out[0]) == 200)
+
+
+@register_scenario
+class InPolicyReject(object):
+ """
+ No.31 in-policy reject test
+ ----------------
+ e1 ->r1(community=65100:10) -> x | -> q1-rib -> | -> r2 --> q1
+ r2(192.168.10.0/24) -> o | |
+ | -> q2-rib -> | -> r2 --> q2
+ ----------------
+ """
+ @staticmethod
+ def boot(env):
+ lookup_scenario('ImportPolicy').boot(env)
+
+ @staticmethod
+ def setup(env):
+ g1 = env.g1
+ e1 = env.e1
+ q1 = env.q1
+ q2 = env.q2
+ cs0 = {'CommunitySets': {'CommunitySetList': [{'CommunitySetName': 'cs0', 'CommunityList': [{'Community': '65100:10'}]}]}}
+
+ g1.set_bgp_defined_set(cs0)
+
+ st0 = {'Name': 'st0',
+ 'Conditions':{'BgpConditions':{'MatchCommunitySet':{'CommunitySet': 'cs0'}}}}
+
+ policy = {'name': 'policy0',
+ 'type': 'in',
+ 'statements': [st0]}
+ g1.add_policy(policy, e1)
+
+ e1.add_route('192.168.100.0/24', community=['65100:10'])
+ e1.add_route('192.168.10.0/24')
+
+ for c in [e1, q1, q2]:
+ g1.wait_for(BGP_FSM_ESTABLISHED, c)
+
+ @staticmethod
+ def check(env):
+ g1 = env.g1
+ e1 = env.e1
+ q1 = env.q1
+ q2 = env.q2
+ wait_for(lambda: len(g1.get_adj_rib_in(e1)) == 2)
+ wait_for(lambda: len(g1.get_local_rib(q1)) == 1)
+ wait_for(lambda: len(g1.get_adj_rib_out(q1)) == 1)
+ wait_for(lambda: len(q1.get_global_rib()) == 1)
+ wait_for(lambda: len(g1.get_local_rib(q2)) == 1)
+ wait_for(lambda: len(g1.get_adj_rib_out(q2)) == 1)
+ wait_for(lambda: len(q2.get_global_rib()) == 1)
+
+
+@register_scenario
+class InPolicyAccept(object):
+ """
+ No.32 in-policy accept test
+ ----------------
+ e1 ->r1(community=65100:10) -> x | -> q1-rib -> | -> r2 --> q1
+ r2(192.168.10.0/24) -> o | |
+ | -> q2-rib -> | -> r2 --> q2
+ ----------------
+ """
+ @staticmethod
+ def boot(env):
+ lookup_scenario('ImportPolicy').boot(env)
+
+ @staticmethod
+ def setup(env):
+ g1 = env.g1
+ e1 = env.e1
+ q1 = env.q1
+ q2 = env.q2
+ cs0 = {'CommunitySets': {'CommunitySetList': [{'CommunitySetName': 'cs0', 'CommunityList': [{'Community': '65100:10'}]}]}}
+
+ g1.set_bgp_defined_set(cs0)
+
+ st0 = {'Name': 'st0',
+ 'Conditions':{'BgpConditions':{'MatchCommunitySet':{'CommunitySet': 'cs0'}}},
+ 'Actions':{'RouteDisposition': {'AcceptRoute': True}}}
+
+ policy = {'name': 'policy0',
+ 'type': 'in',
+ 'statements': [st0],
+ 'default': 'reject'}
+ g1.add_policy(policy, e1)
+
+ e1.add_route('192.168.100.0/24', community=['65100:10'])
+ e1.add_route('192.168.10.0/24')
+
+ for c in [e1, q1, q2]:
+ g1.wait_for(BGP_FSM_ESTABLISHED, c)
+
+ @staticmethod
+ def check(env):
+ lookup_scenario('InPolicyReject').check(env)
+
+
+@register_scenario
+class InPolicySetCommunity(object):
+ """
+ No.33 in-policy set community action
+ ----------------
+ e1 ->r1(community=65100:10) -> o | -> q1-rib -> | -> r1(community=65100:10, 65100:20), r2 --> q1
+ r2(192.168.10.0/24) -> o | |
+ | -> q2-rib -> | -> r1(community=65100:10, 65100:20), r2 --> q2
+ ----------------
+ """
+ @staticmethod
+ def boot(env):
+ lookup_scenario('ImportPolicy').boot(env)
+
+ @staticmethod
+ def setup(env):
+ g1 = env.g1
+ e1 = env.e1
+ q1 = env.q1
+ q2 = env.q2
+ cs0 = {'CommunitySets': {'CommunitySetList': [{'CommunitySetName': 'cs0', 'CommunityList': [{'Community': '65100:10'}]}]}}
+
+ g1.set_bgp_defined_set(cs0)
+
+ st0 = {'Name': 'st0',
+ 'Conditions':{'BgpConditions':{'MatchCommunitySet':{'CommunitySet': 'cs0'}}},
+ 'Actions': {'RouteDisposition': {'AcceptRoute': True},
+ 'BgpActions': {'SetCommunity': {'Options': 'ADD',
+ 'SetCommunityMethod': {'Communities': ['65100:20']}}}}}
+
+ policy = {'name': 'policy0',
+ 'type': 'in',
+ 'statements': [st0]}
+ g1.add_policy(policy, e1)
+
+ e1.add_route('192.168.100.0/24', community=['65100:10'])
+ e1.add_route('192.168.10.0/24')
+
+ for c in [e1, q1, q2]:
+ g1.wait_for(BGP_FSM_ESTABLISHED, c)
+
+ @staticmethod
+ def check(env):
+ g1 = env.g1
+ e1 = env.e1
+ q1 = env.q1
+ q2 = env.q2
+ wait_for(lambda: len(g1.get_adj_rib_in(e1)) == 2)
+ wait_for(lambda: len(g1.get_local_rib(q1)) == 2)
+ wait_for(lambda: len(g1.get_adj_rib_out(q1)) == 2)
+ wait_for(lambda: len(q1.get_global_rib()) == 2)
+ wait_for(lambda: len(g1.get_local_rib(q2)) == 2)
+ wait_for(lambda: len(g1.get_adj_rib_out(q2)) == 2)
+ wait_for(lambda: len(q2.get_global_rib()) == 2)
+
+ @staticmethod
+ def check2(env):
+ g1 = env.g1
+ q1 = env.q1
+ q2 = env.q2
+ for q in [q1, q2]:
+ adj_out = g1.get_adj_rib_out(q, prefix='192.168.100.0/24')
+ env.assertTrue(len(adj_out) == 1)
+ env.assertTrue(community_exists(adj_out[0], '65100:10'))
+ env.assertTrue(community_exists(adj_out[0], '65100:20'))
+
+ adj_out = g1.get_adj_rib_out(q, prefix='192.168.10.0/24')
+ env.assertTrue(len(adj_out) == 1)
+ env.assertFalse(community_exists(adj_out[0], '65100:10'))
+ env.assertFalse(community_exists(adj_out[0], '65100:20'))
+
+
+@register_scenario
+class InPolicyMedAdd(object):
+ """
+ No.34 in-policy med add action
+ -----------------
+ e1 -> r1(med=300) -> o | -> q1-rib -> | -> r1(med=400), r2 --> q1
+ r2(192.168.10.0/24) -> o | |
+ | -> q2-rib -> | -> r1(med=400), r2 --> q2
+ -----------------
+ """
+ @staticmethod
+ def boot(env):
+ lookup_scenario('ImportPolicy').boot(env)
+
+ @staticmethod
+ def setup(env):
+ g1 = env.g1
+ e1 = env.e1
+ q1 = env.q1
+ q2 = env.q2
+ cs0 = {'CommunitySets': {'CommunitySetList': [{'CommunitySetName': 'cs0', 'CommunityList': [{'Community': '65100:10'}]}]}}
+
+ g1.set_bgp_defined_set(cs0)
+
+ st0 = {'Name': 'st0',
+ 'Conditions':{'BgpConditions':{'MatchCommunitySet':{'CommunitySet': 'cs0'}}},
+ 'Actions': {'RouteDisposition': {'AcceptRoute': True},
+ 'BgpActions': {'SetMed': '+100'}}}
+
+ policy = {'name': 'policy0',
+ 'type': 'in',
+ 'statements': [st0]}
+ g1.add_policy(policy, e1)
+
+ e1.add_route('192.168.100.0/24', community=['65100:10'])
+ e1.add_route('192.168.10.0/24')
+
+ for c in [e1, q1, q2]:
+ g1.wait_for(BGP_FSM_ESTABLISHED, c)
+
+ @staticmethod
+ def check(env):
+ lookup_scenario('InPolicySetCommunity').check(env)
+
+ @staticmethod
+ def check2(env):
+ g1 = env.g1
+ q1 = env.q1
+ q2 = env.q2
+ for q in [q1, q2]:
+ adj_out = g1.get_adj_rib_out(q, prefix='192.168.100.0/24')
+ env.assertTrue(len(adj_out) == 1)
+ env.assertTrue(metric(adj_out[0]) == 100)
+
+ adj_out = g1.get_adj_rib_out(q, prefix='192.168.10.0/24')
+ env.assertTrue(len(adj_out) == 1)
+ env.assertTrue(metric(adj_out[0]) == -1)
+
+
+@register_scenario
+class InPolicyUpdate(object):
+ """
+ No.35 in-policy update test
+ r1:192.168.2.0
+ r2:192.168.20.0
+ r3:192.168.200.0
+ -------------------------------------
+ | q1 |
+ e1 ->(r1,r2,r3)-> | ->(r1)-> rib ->(r1)-> adj-rib-out | ->(r1)-> q1
+ | |
+ | q2 |
+ | ->(r1)-> rib ->(r1)-> adj-rib-out | ->(r1)-> q2
+ -------------------------------------
+ |
+ update distribute policy
+ |
+ V
+ -------------------------------------------
+ | q1 |
+ e1 ->(r1,r2,r3)-> | ->(r1,r2)-> rib ->(r1,r2)-> adj-rib-out | ->(r1,r2)-> q1
+ | |
+ | q2 |
+ | ->(r1,r3)-> rib ->(r1,r3)-> adj-rib-out | ->(r1,r3)-> q2
+ -------------------------------------------
+ """
+ @staticmethod
+ def boot(env):
+ lookup_scenario('ImportPolicy').boot(env)
+
+ @staticmethod
+ def setup(env):
+ g1 = env.g1
+ e1 = env.e1
+ q1 = env.q1
+ q2 = env.q2
+
+ p0 = {'IpPrefix': '192.168.20.0/24'}
+ p1 = {'IpPrefix': '192.168.200.0/24'}
+
+ ps0 = {'PrefixSetName': 'ps0',
+ 'PrefixList': [p0, p1]}
+ g1.set_prefix_set(ps0)
+
+ n0 = {'Address': g1.peers[e1]['neigh_addr'].split('/')[0]}
+
+ ns0 = {'NeighborSetName': 'ns0',
+ 'NeighborInfoList': [n0]}
+ g1.set_neighbor_set(ns0)
+
+ st0 = {'Name': 'st0',
+ 'Conditions': {
+ 'MatchPrefixSet': {'PrefixSet': ps0['PrefixSetName']},
+ 'MatchNeighborSet': {'NeighborSet': ns0['NeighborSetName']}}}
+
+ policy = {'name': 'policy0',
+ 'type': 'in',
+ 'statements': [st0]}
+ g1.add_policy(policy, e1)
+
+ e1.add_route('192.168.2.0/24')
+ e1.add_route('192.168.20.0/24')
+ e1.add_route('192.168.200.0/24')
+
+ for c in [e1, q1, q2]:
+ g1.wait_for(BGP_FSM_ESTABLISHED, c)
+
+ @staticmethod
+ def check(env):
+ g1 = env.g1
+ e1 = env.e1
+ q1 = env.q1
+ q2 = env.q2
+ wait_for(lambda: len(g1.get_adj_rib_in(e1)) == 3)
+ wait_for(lambda: len(g1.get_local_rib(q1)) == 1)
+ wait_for(lambda: len(g1.get_adj_rib_out(q1)) == 1)
+ wait_for(lambda: len(q1.get_global_rib()) == 1)
+ wait_for(lambda: len(g1.get_local_rib(q2)) == 1)
+ wait_for(lambda: len(g1.get_adj_rib_out(q2)) == 1)
+ wait_for(lambda: len(q2.get_global_rib()) == 1)
+
+ @staticmethod
+ def setup2(env):
+ g1 = env.g1
+ e1 = env.e1
+ q1 = env.q1
+ q2 = env.q2
+ g1.clear_policy()
+
+ p0 = {'IpPrefix': '192.168.20.0/24'}
+
+ ps0 = {'PrefixSetName': 'ps0',
+ 'PrefixList': [p0]}
+ g1.set_prefix_set(ps0)
+
+ n0 = {'Address': g1.peers[e1]['neigh_addr'].split('/')[0]}
+
+ ns0 = {'NeighborSetName': 'ns0',
+ 'NeighborInfoList': [n0]}
+ g1.set_neighbor_set(ns0)
+
+ st0 = {'Name': 'st0',
+ 'Conditions': {'MatchPrefixSet': {'PrefixSet': ps0['PrefixSetName']},
+ 'MatchNeighborSet': {'NeighborSet': ns0['NeighborSetName']}}}
-"""
- No.23 community replace action export-policy test
- -------------------------------
- e1 ->(community=65100:10)-> | -> q1-rib -> q1-adj-rib-out | ->(community=65100:10)-> q1
- | |
- | -> q2-rib -> q2-adj-rib-out | ->(community=null)-> q2
- | apply action |
- -------------------------------
-"""
-@scenario(23)
-def boot(env):
- scenarios[1]['boot'](env)
-
-@scenario(23)
-def setup(env):
- g1 = env.g1
- e1 = env.e1
- q1 = env.q1
- q2 = env.q2
- cs0 = {'CommunitySets': {'CommunitySetList': [{'CommunitySetName': 'cs0', 'CommunityList': [{'Community': '65100:10'}]}]}}
-
- g1.set_bgp_defined_set(cs0)
-
- st0 = {'Name': 'st0',
- 'Conditions':{'BgpConditions':{'MatchCommunitySet':{'CommunitySet': 'cs0'}}},
- 'Actions': {'RouteDisposition': {'AcceptRoute': True},
- 'BgpActions': {'SetCommunity': {'Options': 'REMOVE',
- 'SetCommunityMethod': {'Communities': ['65100:20', '65100:30']}}}}}
-
- policy = {'name': 'policy0',
- 'type': 'export',
- 'statements': [st0]}
- g1.add_policy(policy, q2)
-
- e1.add_route('192.168.100.0/24', community=['65100:10', '65100:20', '65100:30'])
-
- for c in [e1, q1, q2]:
- g1.wait_for(BGP_FSM_ESTABLISHED, c)
-
-@scenario(23)
-def check(env):
- scenarios[17]['check'](env)
-
-@scenario(23)
-def check2(env):
- g1 = env.g1
- q1 = env.q1
- q2 = env.q2
-
- adj_out = g1.get_adj_rib_out(q1)
- for path in adj_out:
- env.assertTrue(community_exists(path, '65100:10'))
- env.assertTrue(community_exists(path, '65100:20'))
- env.assertTrue(community_exists(path, '65100:30'))
+ policy = {'name': 'policy0',
+ 'type': 'in',
+ 'statements': [st0]}
+ g1.add_policy(policy, e1)
+ g1.softreset(e1)
+
+ @staticmethod
+ def check2(env):
+ g1 = env.g1
+ e1 = env.e1
+ q1 = env.q1
+ q2 = env.q2
+ wait_for(lambda: len(g1.get_adj_rib_in(e1)) == 3)
+ wait_for(lambda: len(g1.get_local_rib(q1)) == 2)
+ wait_for(lambda: len(g1.get_adj_rib_out(q1)) == 2)
+ wait_for(lambda: len(q1.get_global_rib()) == 2)
+ wait_for(lambda: len(g1.get_local_rib(q2)) == 2)
+ wait_for(lambda: len(g1.get_adj_rib_out(q2)) == 2)
+ wait_for(lambda: len(q2.get_global_rib()) == 2)
+
+
+@register_scenario
+class InPolicyAsPathPrepend(object):
+ """
+ No.36 aspath prepend action import
+ --------------------------------
+ e1 ->(aspath=[65001])-> | -> p1-rib -> p1-adj-rib-out | -> p1
+ | |
+ | -> p2-rib -> p2-adj-rib-out | -> p2
+ | apply action |
+ --------------------------------
+ """
+ @staticmethod
+ def boot(env):
+ lookup_scenario("ImportPolicy").boot(env)
+
+ @staticmethod
+ def setup(env):
+ g1 = env.g1
+ e1 = env.e1
+ q1 = env.q1
+ q2 = env.q2
+
+ p0 = {'IpPrefix': '192.168.20.0/24'}
+
+ ps0 = {'PrefixSetName': 'ps0',
+ 'PrefixList': [p0]}
+ g1.set_prefix_set(ps0)
+
+ st0 = {'Name': 'st0',
+ 'Conditions': {'MatchPrefixSet': {'PrefixSet': ps0['PrefixSetName']}},
+ 'Actions': {'RouteDisposition': {'AcceptRoute': True},
+ 'BgpActions': {'SetAsPathPrepend': {'RepeatN': 5, 'As': "65005"}}}}
+
+ policy = {'name': 'policy0',
+ 'type': 'import',
+ 'statements': [st0]}
+ g1.add_policy(policy, q2)
+
+ e1.add_route('192.168.20.0/24')
+ e1.add_route('192.168.200.0/24')
+
+ for c in [e1, q1, q2]:
+ g1.wait_for(BGP_FSM_ESTABLISHED, c)
+
+ @staticmethod
+ def check(env):
+ lookup_scenario('InPolicySetCommunity').check(env)
+
+ @staticmethod
+ def check2(env):
+ g1 = env.g1
+ e1 = env.e1
+ q1 = env.q1
+ q2 = env.q2
+ path = g1.get_adj_rib_out(q1, prefix='192.168.20.0/24')[0]
+ env.assertTrue(path['as_path'] == [e1.asn])
+
+ path = g1.get_adj_rib_out(q1, prefix='192.168.200.0/24')[0]
+ env.assertTrue(path['as_path'] == [e1.asn])
+
+ path = g1.get_local_rib(q2, prefix='192.168.20.0/24')[0]['paths'][0]
+ env.assertTrue(path['as_path'] == [65005]*5 + [e1.asn])
+
+ path = g1.get_adj_rib_out(q2, prefix='192.168.20.0/24')[0]
+ env.assertTrue(path['as_path'] == [65005]*5 + [e1.asn])
+
+ path = g1.get_adj_rib_out(q2, prefix='192.168.200.0/24')[0]
+ env.assertTrue(path['as_path'] == [e1.asn])
+
+
+@register_scenario
+class ExportPolicyAsPathPrepend(object):
+ """
+ No.37 aspath prepend action export
+ --------------------------------
+ e1 ->(aspath=[65001])-> | -> p1-rib -> p1-adj-rib-out | -> p1
+ | |
+ | -> p2-rib -> p2-adj-rib-out | -> p2
+ | apply action |
+ --------------------------------
+ """
+ @staticmethod
+ def boot(env):
+ lookup_scenario("ImportPolicy").boot(env)
- local_rib = g1.get_local_rib(q2)
- for path in local_rib[0]['paths']:
- env.assertTrue(community_exists(path, '65100:10'))
- env.assertTrue(community_exists(path, '65100:20'))
- env.assertTrue(community_exists(path, '65100:30'))
+ @staticmethod
+ def setup(env):
+ g1 = env.g1
+ e1 = env.e1
+ q1 = env.q1
+ q2 = env.q2
- adj_out = g1.get_adj_rib_out(q2)
- for path in adj_out:
- env.assertTrue(community_exists(path, '65100:10'))
- env.assertFalse(community_exists(path, '65100:20'))
- env.assertFalse(community_exists(path, '65100:30'))
-
-"""
- No.24 community null action export-policy test
- -------------------------------
- e1 ->(community=65100:10)-> | -> q1-rib -> q1-adj-rib-out | ->(community=65100:10)-> q1
- | |
- | -> q2-rib -> q2-adj-rib-out | ->(community=null)-> q2
- | apply action |
- -------------------------------
-"""
-@scenario(24)
-def boot(env):
- scenarios[1]['boot'](env)
-
-@scenario(24)
-def setup(env):
- g1 = env.g1
- e1 = env.e1
- q1 = env.q1
- q2 = env.q2
- cs0 = {'CommunitySets': {'CommunitySetList': [{'CommunitySetName': 'cs0', 'CommunityList': [{'Community': '65100:10'}]}]}}
-
- g1.set_bgp_defined_set(cs0)
-
- st0 = {'Name': 'st0',
- 'Conditions':{'BgpConditions':{'MatchCommunitySet':{'CommunitySet': 'cs0'}}},
- 'Actions': {'RouteDisposition': {'AcceptRoute': True},
- 'BgpActions': {'SetCommunity': {'Options': 'REPLACE',
- 'SetCommunityMethod': {'Communities': []}}}}}
-
- policy = {'name': 'policy0',
- 'type': 'export',
- 'statements': [st0]}
- g1.add_policy(policy, q2)
-
- e1.add_route('192.168.100.0/24', community=['65100:10', '65100:20', '65100:30'])
-
- for c in [e1, q1, q2]:
- g1.wait_for(BGP_FSM_ESTABLISHED, c)
-
-@scenario(24)
-def check(env):
- scenarios[17]['check'](env)
-
-@scenario(24)
-def check2(env):
- g1 = env.g1
- q1 = env.q1
- q2 = env.q2
-
- adj_out = g1.get_adj_rib_out(q1)
- for path in adj_out:
- env.assertTrue(community_exists(path, '65100:10'))
- env.assertTrue(community_exists(path, '65100:20'))
- env.assertTrue(community_exists(path, '65100:30'))
+ p0 = {'IpPrefix': '192.168.20.0/24'}
- local_rib = g1.get_local_rib(q2)
- for path in local_rib[0]['paths']:
- env.assertTrue(community_exists(path, '65100:10'))
- env.assertTrue(community_exists(path, '65100:20'))
- env.assertTrue(community_exists(path, '65100:30'))
+ ps0 = {'PrefixSetName': 'ps0',
+ 'PrefixList': [p0]}
+ g1.set_prefix_set(ps0)
- adj_out = g1.get_adj_rib_out(q2)
- for path in adj_out:
- env.assertFalse(community_exists(path, '65100:10'))
- env.assertFalse(community_exists(path, '65100:20'))
- env.assertFalse(community_exists(path, '65100:30'))
-
-"""
- No.25 med replace action import-policy test
- -------------------------------
- e1 ->(med=300)-> | -> q1-rib -> q1-adj-rib-out | ->(med=300)-> q1
- | |
- | -> q2-rib -> q2-adj-rib-out | ->(med=100)-> q2
- | apply action |
- -------------------------------
-"""
-@scenario(25)
-def boot(env):
- scenarios[1]['boot'](env)
-
-@scenario(25)
-def setup(env):
- g1 = env.g1
- e1 = env.e1
- q1 = env.q1
- q2 = env.q2
- st0 = {'Name': 'st0',
- 'Actions': {'RouteDisposition': {'AcceptRoute': True},
- 'BgpActions': {'SetMed': '100'}}}
-
- policy = {'name': 'policy0',
- 'type': 'import',
- 'statements': [st0]}
- g1.add_policy(policy, q2)
-
- e1.add_route('192.168.100.0/24', med=300)
-
- for c in [e1, q1, q2]:
- g1.wait_for(BGP_FSM_ESTABLISHED, c)
+ st0 = {'Name': 'st0',
+ 'Conditions': {'MatchPrefixSet': {'PrefixSet': ps0['PrefixSetName']}},
+ 'Actions': {'RouteDisposition': {'AcceptRoute': True},
+ 'BgpActions': {'SetAsPathPrepend': {'RepeatN': 5, 'As': "65005"}}}}
+ policy = {'name': 'policy0',
+ 'type': 'export',
+ 'statements': [st0]}
+ g1.add_policy(policy, q2)
+ e1.add_route('192.168.20.0/24')
+ e1.add_route('192.168.200.0/24')
-def metric(path):
- for a in path['attrs']:
- if 'metric' in a:
- return a['metric']
- return -1
+ for c in [e1, q1, q2]:
+ g1.wait_for(BGP_FSM_ESTABLISHED, c)
-@scenario(25)
-def check(env):
- scenarios[17]['check'](env)
-
-@scenario(25)
-def check2(env):
- g1 = env.g1
- q1 = env.q1
- q2 = env.q2
-
- adj_out = g1.get_adj_rib_out(q1)
- env.assertTrue(metric(adj_out[0]) == 300)
-
- local_rib = g1.get_local_rib(q2)
- env.assertTrue(metric(local_rib[0]['paths'][0]) == 100)
-
- adj_out = g1.get_adj_rib_out(q2)
- env.assertTrue(metric(adj_out[0]) == 100)
-
-"""
- No.26 med add action import-policy test
- -------------------------------
- e1 ->(med=300)-> | -> q1-rib -> q1-adj-rib-out | ->(med=300)-> q1
- | |
- | -> q2-rib -> q2-adj-rib-out | ->(med=300+100)-> q2
- | apply action |
- -------------------------------
-"""
-@scenario(26)
-def boot(env):
- scenarios[1]['boot'](env)
-
-@scenario(26)
-def setup(env):
- g1 = env.g1
- e1 = env.e1
- q1 = env.q1
- q2 = env.q2
- st0 = {'Name': 'st0',
- 'Actions': {'RouteDisposition': {'AcceptRoute': True},
- 'BgpActions': {'SetMed': '+100'}}}
-
- policy = {'name': 'policy0',
- 'type': 'import',
- 'statements': [st0]}
- g1.add_policy(policy, q2)
-
- e1.add_route('192.168.100.0/24', med=300)
-
- for c in [e1, q1, q2]:
- g1.wait_for(BGP_FSM_ESTABLISHED, c)
-
-@scenario(26)
-def check(env):
- scenarios[17]['check'](env)
-
-@scenario(26)
-def check2(env):
- g1 = env.g1
- q1 = env.q1
- q2 = env.q2
-
- adj_out = g1.get_adj_rib_out(q1)
- env.assertTrue(metric(adj_out[0]) == 300)
-
- local_rib = g1.get_local_rib(q2)
- env.assertTrue(metric(local_rib[0]['paths'][0]) == 400)
-
- adj_out = g1.get_adj_rib_out(q2)
- env.assertTrue(metric(adj_out[0]) == 400)
-
-"""
- No.27 med subtract action import-policy test
- -------------------------------
- e1 ->(med=300)-> | -> q1-rib -> q1-adj-rib-out | ->(med=300)-> q1
- | |
- | -> q2-rib -> q2-adj-rib-out | ->(med=300-100)-> q2
- | apply action |
- -------------------------------
-"""
-@scenario(27)
-def boot(env):
- scenarios[1]['boot'](env)
-
-
-@scenario(27)
-def setup(env):
- g1 = env.g1
- e1 = env.e1
- q1 = env.q1
- q2 = env.q2
- st0 = {'Name': 'st0',
- 'Actions': {'RouteDisposition': {'AcceptRoute': True},
- 'BgpActions': {'SetMed': '-100'}}}
-
- policy = {'name': 'policy0',
- 'type': 'import',
- 'statements': [st0]}
- g1.add_policy(policy, q2)
-
- e1.add_route('192.168.100.0/24', med=300)
-
- for c in [e1, q1, q2]:
- g1.wait_for(BGP_FSM_ESTABLISHED, c)
-
-@scenario(27)
-def check(env):
- scenarios[17]['check'](env)
-
-@scenario(27)
-def check2(env):
- g1 = env.g1
- q1 = env.q1
- q2 = env.q2
-
- adj_out = g1.get_adj_rib_out(q1)
- env.assertTrue(metric(adj_out[0]) == 300)
-
- local_rib = g1.get_local_rib(q2)
- env.assertTrue(metric(local_rib[0]['paths'][0]) == 200)
-
- adj_out = g1.get_adj_rib_out(q2)
- env.assertTrue(metric(adj_out[0]) == 200)
-
-"""
- No.28 med replace action export-policy test
- -------------------------------
- e1 ->(med=300)-> | -> q1-rib -> q1-adj-rib-out | ->(med=300)-> q1
- | |
- | -> q2-rib -> q2-adj-rib-out | ->(med=100)-> q2
- | apply action |
- -------------------------------
-"""
-@scenario(28)
-def boot(env):
- scenarios[1]['boot'](env)
-
-
-@scenario(28)
-def setup(env):
- g1 = env.g1
- e1 = env.e1
- q1 = env.q1
- q2 = env.q2
- st0 = {'Name': 'st0',
- 'Actions': {'RouteDisposition': {'AcceptRoute': True},
- 'BgpActions': {'SetMed': '100'}}}
-
- policy = {'name': 'policy0',
- 'type': 'export',
- 'statements': [st0]}
- g1.add_policy(policy, q2)
-
- e1.add_route('192.168.100.0/24', med=300)
-
- for c in [e1, q1, q2]:
- g1.wait_for(BGP_FSM_ESTABLISHED, c)
-
-@scenario(28)
-def check(env):
- scenarios[17]['check'](env)
-
-@scenario(28)
-def check2(env):
- g1 = env.g1
- q1 = env.q1
- q2 = env.q2
-
- adj_out = g1.get_adj_rib_out(q1)
- env.assertTrue(metric(adj_out[0]) == 300)
-
- local_rib = g1.get_local_rib(q2)
- env.assertTrue(metric(local_rib[0]['paths'][0]) == 300)
-
- adj_out = g1.get_adj_rib_out(q2)
- env.assertTrue(metric(adj_out[0]) == 100)
-
-"""
- No.29 med add action export-policy test
- -------------------------------
- e1 ->(med=300)-> | -> q1-rib -> q1-adj-rib-out | ->(med=300)-> q1
- | |
- | -> q2-rib -> q2-adj-rib-out | ->(med=300+100)-> q2
- | apply action |
- -------------------------------
-"""
-@scenario(29)
-def boot(env):
- scenarios[1]['boot'](env)
-
-
-@scenario(29)
-def setup(env):
- g1 = env.g1
- e1 = env.e1
- q1 = env.q1
- q2 = env.q2
- st0 = {'Name': 'st0',
- 'Actions': {'RouteDisposition': {'AcceptRoute': True},
- 'BgpActions': {'SetMed': '+100'}}}
-
- policy = {'name': 'policy0',
- 'type': 'export',
- 'statements': [st0]}
- g1.add_policy(policy, q2)
-
- e1.add_route('192.168.100.0/24', med=300)
-
- for c in [e1, q1, q2]:
- g1.wait_for(BGP_FSM_ESTABLISHED, c)
-
-@scenario(29)
-def check(env):
- scenarios[17]['check'](env)
-
-@scenario(29)
-def check2(env):
- g1 = env.g1
- q1 = env.q1
- q2 = env.q2
-
- adj_out = g1.get_adj_rib_out(q1)
- env.assertTrue(metric(adj_out[0]) == 300)
-
- local_rib = g1.get_local_rib(q2)
- env.assertTrue(metric(local_rib[0]['paths'][0]) == 300)
-
- adj_out = g1.get_adj_rib_out(q2)
- env.assertTrue(metric(adj_out[0]) == 400)
-
-"""
- No.30 med subtract action export-policy test
- -------------------------------
- e1 ->(med=300)-> | -> q1-rib -> q1-adj-rib-out | ->(med=300)-> q1
- | |
- | -> q2-rib -> q2-adj-rib-out | ->(med=300-100)-> q2
- | apply action |
- -------------------------------
-"""
-@scenario(30)
-def boot(env):
- scenarios[1]['boot'](env)
-
-
-@scenario(30)
-def setup(env):
- g1 = env.g1
- e1 = env.e1
- q1 = env.q1
- q2 = env.q2
- st0 = {'Name': 'st0',
- 'Actions': {'RouteDisposition': {'AcceptRoute': True},
- 'BgpActions': {'SetMed': '-100'}}}
-
- policy = {'name': 'policy0',
- 'type': 'export',
- 'statements': [st0]}
- g1.add_policy(policy, q2)
-
- e1.add_route('192.168.100.0/24', med=300)
-
- for c in [e1, q1, q2]:
- g1.wait_for(BGP_FSM_ESTABLISHED, c)
-
-@scenario(30)
-def check(env):
- scenarios[17]['check'](env)
-
-@scenario(30)
-def check2(env):
- g1 = env.g1
- q1 = env.q1
- q2 = env.q2
-
- adj_out = g1.get_adj_rib_out(q1)
- env.assertTrue(metric(adj_out[0]) == 300)
-
- local_rib = g1.get_local_rib(q2)
- env.assertTrue(metric(local_rib[0]['paths'][0]) == 300)
-
- adj_out = g1.get_adj_rib_out(q2)
- env.assertTrue(metric(adj_out[0]) == 200)
-
-"""
- No.31 in-policy reject test
- ----------------
- e1 ->r1(community=65100:10) -> x | -> q1-rib -> | -> r2 --> q1
- r2(192.168.10.0/24) -> o | |
- | -> q2-rib -> | -> r2 --> q2
- ----------------
-"""
-@scenario(31)
-def boot(env):
- scenarios[1]['boot'](env)
-
-
-@scenario(31)
-def setup(env):
- g1 = env.g1
- e1 = env.e1
- q1 = env.q1
- q2 = env.q2
- cs0 = {'CommunitySets': {'CommunitySetList': [{'CommunitySetName': 'cs0', 'CommunityList': [{'Community': '65100:10'}]}]}}
-
- g1.set_bgp_defined_set(cs0)
-
- st0 = {'Name': 'st0',
- 'Conditions':{'BgpConditions':{'MatchCommunitySet':{'CommunitySet': 'cs0'}}}}
-
- policy = {'name': 'policy0',
- 'type': 'in',
- 'statements': [st0]}
- g1.add_policy(policy, e1)
-
- e1.add_route('192.168.100.0/24', community=['65100:10'])
- e1.add_route('192.168.10.0/24')
-
- for c in [e1, q1, q2]:
- g1.wait_for(BGP_FSM_ESTABLISHED, c)
-
-@scenario(31)
-def check(env):
- g1 = env.g1
- e1 = env.e1
- q1 = env.q1
- q2 = env.q2
- wait_for(lambda : len(g1.get_adj_rib_in(e1)) == 2)
- wait_for(lambda : len(g1.get_local_rib(q1)) == 1)
- wait_for(lambda : len(g1.get_adj_rib_out(q1)) == 1)
- wait_for(lambda : len(q1.get_global_rib()) == 1)
- wait_for(lambda : len(g1.get_local_rib(q2)) == 1)
- wait_for(lambda : len(g1.get_adj_rib_out(q2)) == 1)
- wait_for(lambda : len(q2.get_global_rib()) == 1)
-
-"""
- No.32 in-policy accept test
- ----------------
- e1 ->r1(community=65100:10) -> x | -> q1-rib -> | -> r2 --> q1
- r2(192.168.10.0/24) -> o | |
- | -> q2-rib -> | -> r2 --> q2
- ----------------
-"""
-@scenario(32)
-def boot(env):
- scenarios[1]['boot'](env)
-
-@scenario(32)
-def setup(env):
- g1 = env.g1
- e1 = env.e1
- q1 = env.q1
- q2 = env.q2
- cs0 = {'CommunitySets': {'CommunitySetList': [{'CommunitySetName': 'cs0', 'CommunityList': [{'Community': '65100:10'}]}]}}
-
- g1.set_bgp_defined_set(cs0)
-
- st0 = {'Name': 'st0',
- 'Conditions':{'BgpConditions':{'MatchCommunitySet':{'CommunitySet': 'cs0'}}},
- 'Actions':{'RouteDisposition': {'AcceptRoute': True}}}
-
- policy = {'name': 'policy0',
- 'type': 'in',
- 'statements': [st0],
- 'default': 'reject'}
- g1.add_policy(policy, e1)
-
- e1.add_route('192.168.100.0/24', community=['65100:10'])
- e1.add_route('192.168.10.0/24')
-
- for c in [e1, q1, q2]:
- g1.wait_for(BGP_FSM_ESTABLISHED, c)
-
-@scenario(32)
-def check(env):
- scenarios[31]['check'](env)
-
-"""
- No.33 in-policy set community action
- ----------------
- e1 ->r1(community=65100:10) -> o | -> q1-rib -> | -> r1(community=65100:10, 65100:20), r2 --> q1
- r2(192.168.10.0/24) -> o | |
- | -> q2-rib -> | -> r1(community=65100:10, 65100:20), r2 --> q2
- ----------------
-"""
-@scenario(33)
-def boot(env):
- scenarios[1]['boot'](env)
-
-
-@scenario(33)
-def setup(env):
- g1 = env.g1
- e1 = env.e1
- q1 = env.q1
- q2 = env.q2
- cs0 = {'CommunitySets': {'CommunitySetList': [{'CommunitySetName': 'cs0', 'CommunityList': [{'Community': '65100:10'}]}]}}
-
- g1.set_bgp_defined_set(cs0)
-
- st0 = {'Name': 'st0',
- 'Conditions':{'BgpConditions':{'MatchCommunitySet':{'CommunitySet': 'cs0'}}},
- 'Actions': {'RouteDisposition': {'AcceptRoute': True},
- 'BgpActions': {'SetCommunity': {'Options': 'ADD',
- 'SetCommunityMethod': {'Communities': ['65100:20']}}}}}
-
- policy = {'name': 'policy0',
- 'type': 'in',
- 'statements': [st0]}
- g1.add_policy(policy, e1)
-
- e1.add_route('192.168.100.0/24', community=['65100:10'])
- e1.add_route('192.168.10.0/24')
-
- for c in [e1, q1, q2]:
- g1.wait_for(BGP_FSM_ESTABLISHED, c)
-
-@scenario(33)
-def check(env):
- g1 = env.g1
- e1 = env.e1
- q1 = env.q1
- q2 = env.q2
- wait_for(lambda : len(g1.get_adj_rib_in(e1)) == 2)
- wait_for(lambda : len(g1.get_local_rib(q1)) == 2)
- wait_for(lambda : len(g1.get_adj_rib_out(q1)) == 2)
- wait_for(lambda : len(q1.get_global_rib()) == 2)
- wait_for(lambda : len(g1.get_local_rib(q2)) == 2)
- wait_for(lambda : len(g1.get_adj_rib_out(q2)) == 2)
- wait_for(lambda : len(q2.get_global_rib()) == 2)
-
-@scenario(33)
-def check2(env):
- g1 = env.g1
- q1 = env.q1
- q2 = env.q2
- for q in [q1, q2]:
- adj_out = g1.get_adj_rib_out(q, prefix='192.168.100.0/24')
- env.assertTrue(len(adj_out) == 1)
- env.assertTrue(community_exists(adj_out[0], '65100:10'))
- env.assertTrue(community_exists(adj_out[0], '65100:20'))
-
- adj_out = g1.get_adj_rib_out(q, prefix='192.168.10.0/24')
- env.assertTrue(len(adj_out) == 1)
- env.assertFalse(community_exists(adj_out[0], '65100:10'))
- env.assertFalse(community_exists(adj_out[0], '65100:20'))
-
-"""
- No.34 in-policy med add action
- -----------------
- e1 -> r1(med=300) -> o | -> q1-rib -> | -> r1(med=400), r2 --> q1
- r2(192.168.10.0/24) -> o | |
- | -> q2-rib -> | -> r1(med=400), r2 --> q2
- -----------------
-"""
-@scenario(34)
-def boot(env):
- scenarios[1]['boot'](env)
-
-@scenario(34)
-def setup(env):
- g1 = env.g1
- e1 = env.e1
- q1 = env.q1
- q2 = env.q2
- cs0 = {'CommunitySets': {'CommunitySetList': [{'CommunitySetName': 'cs0', 'CommunityList': [{'Community': '65100:10'}]}]}}
-
- g1.set_bgp_defined_set(cs0)
-
- st0 = {'Name': 'st0',
- 'Conditions':{'BgpConditions':{'MatchCommunitySet':{'CommunitySet': 'cs0'}}},
- 'Actions': {'RouteDisposition': {'AcceptRoute': True},
- 'BgpActions': {'SetMed': '+100'}}}
-
- policy = {'name': 'policy0',
- 'type': 'in',
- 'statements': [st0]}
- g1.add_policy(policy, e1)
-
- e1.add_route('192.168.100.0/24', community=['65100:10'])
- e1.add_route('192.168.10.0/24')
-
- for c in [e1, q1, q2]:
- g1.wait_for(BGP_FSM_ESTABLISHED, c)
-
-@scenario(34)
-def check(env):
- scenarios[33]['check'](env)
-
-@scenario(34)
-def check2(env):
- g1 = env.g1
- q1 = env.q1
- q2 = env.q2
- for q in [q1, q2]:
- adj_out = g1.get_adj_rib_out(q, prefix='192.168.100.0/24')
- env.assertTrue(len(adj_out) == 1)
- env.assertTrue(metric(adj_out[0]) == 100)
+ @staticmethod
+ def check(env):
+ lookup_scenario('InPolicySetCommunity').check(env)
- adj_out = g1.get_adj_rib_out(q, prefix='192.168.10.0/24')
- env.assertTrue(len(adj_out) == 1)
- env.assertTrue(metric(adj_out[0]) == -1)
-
-"""
- No.35 in-policy update test
- r1:192.168.2.0
- r2:192.168.20.0
- r3:192.168.200.0
- -------------------------------------
- | q1 |
- e1 ->(r1,r2,r3)-> | ->(r1)-> rib ->(r1)-> adj-rib-out | ->(r1)-> q1
- | |
- | q2 |
- | ->(r1)-> rib ->(r1)-> adj-rib-out | ->(r1)-> q2
- -------------------------------------
- |
- update distribute policy
- |
- V
- -------------------------------------------
- | q1 |
- e1 ->(r1,r2,r3)-> | ->(r1,r2)-> rib ->(r1,r2)-> adj-rib-out | ->(r1,r2)-> q1
- | |
- | q2 |
- | ->(r1,r3)-> rib ->(r1,r3)-> adj-rib-out | ->(r1,r3)-> q2
- -------------------------------------------
-"""
-@scenario(35)
-def boot(env):
- scenarios[1]['boot'](env)
-
-@scenario(35)
-def setup(env):
- g1 = env.g1
- e1 = env.e1
- q1 = env.q1
- q2 = env.q2
-
- p0 = {'IpPrefix': '192.168.20.0/24'}
- p1 = {'IpPrefix': '192.168.200.0/24'}
-
- ps0 = {'PrefixSetName': 'ps0',
- 'PrefixList': [p0, p1]}
- g1.set_prefix_set(ps0)
-
- n0 = {'Address': g1.peers[e1]['neigh_addr'].split('/')[0]}
-
- ns0 = {'NeighborSetName': 'ns0',
- 'NeighborInfoList': [n0]}
- g1.set_neighbor_set(ns0)
-
- st0 = {'Name': 'st0',
- 'Conditions': {
- 'MatchPrefixSet': {'PrefixSet': ps0['PrefixSetName']},
- 'MatchNeighborSet': {'NeighborSet': ns0['NeighborSetName']}}}
-
- policy = {'name': 'policy0',
- 'type': 'in',
- 'statements': [st0]}
- g1.add_policy(policy, e1)
-
- e1.add_route('192.168.2.0/24')
- e1.add_route('192.168.20.0/24')
- e1.add_route('192.168.200.0/24')
-
- for c in [e1, q1, q2]:
- g1.wait_for(BGP_FSM_ESTABLISHED, c)
-
-@scenario(35)
-def check(env):
- g1 = env.g1
- e1 = env.e1
- q1 = env.q1
- q2 = env.q2
- wait_for(lambda : len(g1.get_adj_rib_in(e1)) == 3)
- wait_for(lambda : len(g1.get_local_rib(q1)) == 1)
- wait_for(lambda : len(g1.get_adj_rib_out(q1)) == 1)
- wait_for(lambda : len(q1.get_global_rib()) == 1)
- wait_for(lambda : len(g1.get_local_rib(q2)) == 1)
- wait_for(lambda : len(g1.get_adj_rib_out(q2)) == 1)
- wait_for(lambda : len(q2.get_global_rib()) == 1)
-
-@scenario(35)
-def setup2(env):
- g1 = env.g1
- e1 = env.e1
- q1 = env.q1
- q2 = env.q2
- g1.clear_policy()
-
- p0 = {'IpPrefix': '192.168.20.0/24'}
-
- ps0 = {'PrefixSetName': 'ps0',
- 'PrefixList': [p0]}
- g1.set_prefix_set(ps0)
-
- n0 = {'Address': g1.peers[e1]['neigh_addr'].split('/')[0]}
-
- ns0 = {'NeighborSetName': 'ns0',
- 'NeighborInfoList': [n0]}
- g1.set_neighbor_set(ns0)
-
- st0 = {'Name': 'st0',
- 'Conditions': {'MatchPrefixSet': {'PrefixSet': ps0['PrefixSetName']},
- 'MatchNeighborSet': {'NeighborSet': ns0['NeighborSetName']}}}
+ @staticmethod
+ def check2(env):
+ g1 = env.g1
+ e1 = env.e1
+ q1 = env.q1
+ q2 = env.q2
- policy = {'name': 'policy0',
- 'type': 'in',
- 'statements': [st0]}
- g1.add_policy(policy, e1)
- g1.softreset(e1)
-
-@scenario(35)
-def check2(env):
- g1 = env.g1
- e1 = env.e1
- q1 = env.q1
- q2 = env.q2
- wait_for(lambda : len(g1.get_adj_rib_in(e1)) == 3)
- wait_for(lambda : len(g1.get_local_rib(q1)) == 2)
- wait_for(lambda : len(g1.get_adj_rib_out(q1)) == 2)
- wait_for(lambda : len(q1.get_global_rib()) == 2)
- wait_for(lambda : len(g1.get_local_rib(q2)) == 2)
- wait_for(lambda : len(g1.get_adj_rib_out(q2)) == 2)
- wait_for(lambda : len(q2.get_global_rib()) == 2)
-
-"""
- No.36 aspath prepend action import
- --------------------------------
- e1 ->(aspath=[65001])-> | -> p1-rib -> p1-adj-rib-out | -> p1
- | |
- | -> p2-rib -> p2-adj-rib-out | -> p2
- | apply action |
- --------------------------------
-"""
-@scenario(36)
-def boot(env):
- scenarios[1]['boot'](env)
-
-@scenario(36)
-def setup(env):
- g1 = env.g1
- e1 = env.e1
- q1 = env.q1
- q2 = env.q2
-
- p0 = {'IpPrefix': '192.168.20.0/24'}
-
- ps0 = {'PrefixSetName': 'ps0',
- 'PrefixList': [p0]}
- g1.set_prefix_set(ps0)
-
- st0 = {'Name': 'st0',
- 'Conditions': {'MatchPrefixSet': {'PrefixSet': ps0['PrefixSetName']}},
- 'Actions': {'RouteDisposition': {'AcceptRoute': True},
- 'BgpActions': {'SetAsPathPrepend': {'RepeatN': 5, 'As': "65005"}}}}
-
- policy = {'name': 'policy0',
- 'type': 'import',
- 'statements': [st0]}
- g1.add_policy(policy, q2)
-
- e1.add_route('192.168.20.0/24')
- e1.add_route('192.168.200.0/24')
-
- for c in [e1, q1, q2]:
- g1.wait_for(BGP_FSM_ESTABLISHED, c)
-
-@scenario(36)
-def check(env):
- scenarios[33]['check'](env)
-
-@scenario(36)
-def check2(env):
- g1 = env.g1
- e1 = env.e1
- q1 = env.q1
- q2 = env.q2
- path = g1.get_adj_rib_out(q1, prefix='192.168.20.0/24')[0]
- env.assertTrue(path['as_path'] == [e1.asn])
-
- path = g1.get_adj_rib_out(q1, prefix='192.168.200.0/24')[0]
- env.assertTrue(path['as_path'] == [e1.asn])
-
- path = g1.get_local_rib(q2, prefix='192.168.20.0/24')[0]['paths'][0]
- env.assertTrue(path['as_path'] == [65005]*5 + [e1.asn])
-
- path = g1.get_adj_rib_out(q2, prefix='192.168.20.0/24')[0]
- env.assertTrue(path['as_path'] == [65005]*5 + [e1.asn])
-
- path = g1.get_adj_rib_out(q2, prefix='192.168.200.0/24')[0]
- env.assertTrue(path['as_path'] == [e1.asn])
-
-
-"""
- No.37 aspath prepend action export
- --------------------------------
- e1 ->(aspath=[65001])-> | -> p1-rib -> p1-adj-rib-out | -> p1
- | |
- | -> p2-rib -> p2-adj-rib-out | -> p2
- | apply action |
- --------------------------------
-"""
-@scenario(37)
-def boot(env):
- scenarios[1]['boot'](env)
-
-@scenario(37)
-def setup(env):
- g1 = env.g1
- e1 = env.e1
- q1 = env.q1
- q2 = env.q2
-
- p0 = {'IpPrefix': '192.168.20.0/24'}
-
- ps0 = {'PrefixSetName': 'ps0',
- 'PrefixList': [p0]}
- g1.set_prefix_set(ps0)
-
- st0 = {'Name': 'st0',
- 'Conditions': {'MatchPrefixSet': {'PrefixSet': ps0['PrefixSetName']}},
- 'Actions': {'RouteDisposition': {'AcceptRoute': True},
- 'BgpActions': {'SetAsPathPrepend': {'RepeatN': 5, 'As': "65005"}}}}
-
- policy = {'name': 'policy0',
- 'type': 'export',
- 'statements': [st0]}
- g1.add_policy(policy, q2)
-
- e1.add_route('192.168.20.0/24')
- e1.add_route('192.168.200.0/24')
-
- for c in [e1, q1, q2]:
- g1.wait_for(BGP_FSM_ESTABLISHED, c)
-
-@scenario(37)
-def check(env):
- scenarios[33]['check'](env)
-
-@scenario(37)
-def check2(env):
- g1 = env.g1
- e1 = env.e1
- q1 = env.q1
- q2 = env.q2
-
- path = g1.get_adj_rib_out(q1, prefix='192.168.20.0/24')[0]
- env.assertTrue(path['as_path'] == [e1.asn])
-
- path = g1.get_adj_rib_out(q1, prefix='192.168.200.0/24')[0]
- env.assertTrue(path['as_path'] == [e1.asn])
-
- path = g1.get_local_rib(q2, prefix='192.168.20.0/24')[0]['paths'][0]
- env.assertTrue(path['as_path'] == [e1.asn])
-
- path = g1.get_adj_rib_out(q2, prefix='192.168.20.0/24')[0]
- env.assertTrue(path['as_path'] == [65005]*5 + [e1.asn])
-
- path = g1.get_adj_rib_out(q2, prefix='192.168.200.0/24')[0]
- env.assertTrue(path['as_path'] == [e1.asn])
-
-"""
- No.38 aspath prepend action lastas import
- --------------------------------
- e1 ->(aspath=[65001])-> | -> p1-rib -> p1-adj-rib-out | -> p1
- | |
- | -> p2-rib -> p2-adj-rib-out | -> p2
- | apply action |
- --------------------------------
-"""
-@scenario(38)
-def boot(env):
- scenarios[1]['boot'](env)
-
-@scenario(38)
-def setup(env):
- g1 = env.g1
- e1 = env.e1
- q1 = env.q1
- q2 = env.q2
-
- p0 = {'IpPrefix': '192.168.20.0/24'}
-
- ps0 = {'PrefixSetName': 'ps0',
- 'PrefixList': [p0]}
- g1.set_prefix_set(ps0)
-
- st0 = {'Name': 'st0',
- 'Conditions': {'MatchPrefixSet': {'PrefixSet': ps0['PrefixSetName']}},
- 'Actions': {'RouteDisposition': {'AcceptRoute': True},
- 'BgpActions': {'SetAsPathPrepend': {'RepeatN': 5, 'As': "last-as"}}}}
-
- policy = {'name': 'policy0',
- 'type': 'import',
- 'statements': [st0]}
- g1.add_policy(policy, q2)
-
- e1.add_route('192.168.20.0/24')
- e1.add_route('192.168.200.0/24')
-
- for c in [e1, q1, q2]:
- g1.wait_for(BGP_FSM_ESTABLISHED, c)
-
-@scenario(38)
-def check(env):
- scenarios[33]['check'](env)
-
-@scenario(38)
-def check2(env):
- g1 = env.g1
- e1 = env.e1
- q1 = env.q1
- q2 = env.q2
-
- path = g1.get_adj_rib_out(q1, prefix='192.168.20.0/24')[0]
- env.assertTrue(path['as_path'] == [e1.asn])
-
- path = g1.get_adj_rib_out(q1, prefix='192.168.200.0/24')[0]
- env.assertTrue(path['as_path'] == [e1.asn])
-
- path = g1.get_local_rib(q2, prefix='192.168.20.0/24')[0]['paths'][0]
- env.assertTrue(path['as_path'] == [e1.asn]*5 + [e1.asn])
-
- path = g1.get_adj_rib_out(q2, prefix='192.168.20.0/24')[0]
- env.assertTrue(path['as_path'] == [e1.asn]*5 + [e1.asn])
-
- path = g1.get_adj_rib_out(q2, prefix='192.168.200.0/24')[0]
- env.assertTrue(path['as_path'] == [e1.asn])
-
-"""
- No.39 aspath prepend action lastas export
- --------------------------------
- e1 ->(aspath=[65001])-> | -> p1-rib -> p1-adj-rib-out | -> p1
- | |
- | -> p2-rib -> p2-adj-rib-out | -> p2
- | apply action |
- --------------------------------
-"""
-@scenario(39)
-def boot(env):
- scenarios[1]['boot'](env)
-
-@scenario(39)
-def setup(env):
- g1 = env.g1
- e1 = env.e1
- q1 = env.q1
- q2 = env.q2
-
- p0 = {'IpPrefix': '192.168.20.0/24'}
-
- ps0 = {'PrefixSetName': 'ps0',
- 'PrefixList': [p0]}
- g1.set_prefix_set(ps0)
-
- st0 = {'Name': 'st0',
- 'Conditions': {'MatchPrefixSet': {'PrefixSet': ps0['PrefixSetName']}},
- 'Actions': {'RouteDisposition': {'AcceptRoute': True},
- 'BgpActions': {'SetAsPathPrepend': {'RepeatN': 5, 'As': "last-as"}}}}
-
- policy = {'name': 'policy0',
- 'type': 'export',
- 'statements': [st0]}
- g1.add_policy(policy, q2)
-
- e1.add_route('192.168.20.0/24')
- e1.add_route('192.168.200.0/24')
-
- for c in [e1, q1, q2]:
- g1.wait_for(BGP_FSM_ESTABLISHED, c)
-
-@scenario(39)
-def check(env):
- scenarios[33]['check'](env)
-
-@scenario(39)
-def check2(env):
- g1 = env.g1
- e1 = env.e1
- q1 = env.q1
- q2 = env.q2
-
- path = g1.get_adj_rib_out(q1, prefix='192.168.20.0/24')[0]
- env.assertTrue(path['as_path'] == [e1.asn])
-
- path = g1.get_adj_rib_out(q1, prefix='192.168.200.0/24')[0]
- env.assertTrue(path['as_path'] == [e1.asn])
-
- path = g1.get_local_rib(q2, prefix='192.168.20.0/24')[0]['paths'][0]
- env.assertTrue(path['as_path'] == [e1.asn])
-
- path = g1.get_adj_rib_out(q2, prefix='192.168.20.0/24')[0]
- env.assertTrue(path['as_path'] == [e1.asn]*5 + [e1.asn])
-
- path = g1.get_adj_rib_out(q2, prefix='192.168.200.0/24')[0]
- env.assertTrue(path['as_path'] == [e1.asn])
-
-
-"""
- No.40 extended community origin condition import
- --------------------------------
- e1 ->(extcommunity=origin:65001.65100:200)-> | -> q1-rib -> q1-adj-rib-out | --> q1
- | |
- | ->x q2-rib |
- --------------------------------
-"""
-@scenario(40)
-def boot(env):
- scenarios[1]['boot'](env)
-
-@scenario(40)
-def setup(env):
- g1 = env.g1
- e1 = env.e1
- q1 = env.q1
- q2 = env.q2
-
- es0 = {'ExtCommunitySets': {'ExtCommunitySetList': [{'ExtCommunitySetName': 'es0',
- 'ExtCommunityList': [{'ExtCommunity': 'SoO:65001.65100:200'}]}]}}
-
- g1.set_bgp_defined_set(es0)
-
- st0 = {'Name': 'st0',
- 'Conditions': {'BgpConditions':{'MatchExtCommunitySet':{'ExtCommunitySet': 'es0'}}}}
-
- policy = {'name': 'policy0',
- 'type': 'import',
- 'statements': [st0]}
- g1.add_policy(policy, q2)
-
- e1.add_route('192.168.20.0/24', extendedcommunity='origin:{0}:200'.format((65001 << 16) + 65100))
- e1.add_route('192.168.200.0/24', extendedcommunity='origin:{0}:100'.format((65001 << 16) + 65200))
-
- for c in [e1, q1, q2]:
- g1.wait_for(BGP_FSM_ESTABLISHED, c)
-
-@scenario(40)
-def check(env):
- scenarios[1]['check'](env)
-
-"""
- No.41 extended community origin condition import
- --------------------------------
- e1 ->(extcommunity=target:65010:320)-> | -> q1-rib -> q1-adj-rib-out | --> q1
- | |
- | ->x q2-rib |
- --------------------------------
-"""
-@scenario(41)
-def boot(env):
- scenarios[1]['boot'](env)
-
-@scenario(41)
-def setup(env):
- g1 = env.g1
- e1 = env.e1
- q1 = env.q1
- q2 = env.q2
+ path = g1.get_adj_rib_out(q1, prefix='192.168.20.0/24')[0]
+ env.assertTrue(path['as_path'] == [e1.asn])
- es0 = {'ExtCommunitySets': {'ExtCommunitySetList': [{'ExtCommunitySetName': 'es0',
- 'ExtCommunityList': [{'ExtCommunity': 'RT:6[0-9]+:3[0-9]+'}]}]}}
-
- g1.set_bgp_defined_set(es0)
+ path = g1.get_adj_rib_out(q1, prefix='192.168.200.0/24')[0]
+ env.assertTrue(path['as_path'] == [e1.asn])
- st0 = {'Name': 'st0',
- 'Conditions': {'BgpConditions':{'MatchExtCommunitySet':{'ExtCommunitySet': 'es0'}}}}
+ path = g1.get_local_rib(q2, prefix='192.168.20.0/24')[0]['paths'][0]
+ env.assertTrue(path['as_path'] == [e1.asn])
- policy = {'name': 'policy0',
- 'type': 'import',
- 'statements': [st0]}
- g1.add_policy(policy, q2)
-
- e1.add_route('192.168.20.0/24', extendedcommunity='target:65010:320')
- e1.add_route('192.168.200.0/24', extendedcommunity='target:55000:320')
+ path = g1.get_adj_rib_out(q2, prefix='192.168.20.0/24')[0]
+ env.assertTrue(path['as_path'] == [65005]*5 + [e1.asn])
- for c in [e1, q1, q2]:
- g1.wait_for(BGP_FSM_ESTABLISHED, c)
-
-@scenario(41)
-def check(env):
- scenarios[1]['check'](env)
+ path = g1.get_adj_rib_out(q2, prefix='192.168.200.0/24')[0]
+ env.assertTrue(path['as_path'] == [e1.asn])
-"""
- No.42 prefix only condition accept in
- -----------------
- e1 ->r1(192.168.100.0/24) -> o | -> q1-rib -> | -> r2 --> q1
- r2(192.168.10.0/24) -> x | |
- | -> q2-rib -> | -> r2 --> q2
- -----------------
-"""
-@scenario(42)
-def boot(env):
- scenarios[1]['boot'](env)
-
-@scenario(42)
-def setup(env):
- g1 = env.g1
- e1 = env.e1
- q1 = env.q1
- q2 = env.q2
-
- p0 = {'IpPrefix': '192.168.10.0/24'}
-
- ps0 = {'PrefixSetName': 'ps0',
- 'PrefixList': [p0]}
- g1.set_prefix_set(ps0)
-
- st0 = {'Name': 'st0',
- 'Conditions': {
- 'MatchPrefixSet': {'PrefixSet': ps0['PrefixSetName']}}}
-
- policy = {'name': 'policy0',
- 'type': 'in',
- 'statements': [st0]}
- g1.add_policy(policy, e1)
-
- # this will be blocked
- e1.add_route('192.168.100.0/24')
- # this will pass
- e1.add_route('192.168.10.0/24')
-
- for c in [e1, q1, q2]:
- g1.wait_for(BGP_FSM_ESTABLISHED, c)
-
-@scenario(42)
-def check(env):
- scenarios[31]['check'](env)
-
-
-"""
- No.43 extended community add action import-policy test
- ---------------------------------
- e1 ->(extcommunity=none) ->| -> q1-rib -> q1-adj-rib-out | --> q1
- | |
- | -> q2-rib -> q2-adj-rib-out | --> q2
- | add ext-community |
- ---------------------------------
-"""
-@scenario(43)
-def boot(env):
- scenarios[1]['boot'](env)
-
-@scenario(43)
-def setup(env):
- g1 = env.g1
- e1 = env.e1
- q1 = env.q1
- q2 = env.q2
-
- p0 = {'IpPrefix': '192.168.10.0/24'}
-
- ps0 = {'PrefixSetName': 'ps0',
- 'PrefixList': [p0]}
- g1.set_prefix_set(ps0)
-
- st0 = {
- 'Name': 'st0',
- 'Conditions': {
- 'MatchPrefixSet': {
- 'PrefixSet': ps0['PrefixSetName']
- }
- },
- 'Actions': {
- 'RouteDisposition': {'AcceptRoute': True},
- 'BgpActions': {
- 'SetExtCommunity': {
- 'Options': 'ADD',
- 'SetExtCommunityMethod': {
- 'Communities': ['0:2:0xfd:0xe8:0:0:0:1']
- }
- },
- }
- }
- }
+@register_scenario
+class ImportPolicyAsPathPrependLastAS(object):
+ """
+ No.38 aspath prepend action lastas import
+ --------------------------------
+ e1 ->(aspath=[65001])-> | -> p1-rib -> p1-adj-rib-out | -> p1
+ | |
+ | -> p2-rib -> p2-adj-rib-out | -> p2
+ | apply action |
+ --------------------------------
+ """
+ @staticmethod
+ def boot(env):
+ lookup_scenario("ImportPolicy").boot(env)
+
+ @staticmethod
+ def setup(env):
+ g1 = env.g1
+ e1 = env.e1
+ q1 = env.q1
+ q2 = env.q2
+
+ p0 = {'IpPrefix': '192.168.20.0/24'}
+
+ ps0 = {'PrefixSetName': 'ps0',
+ 'PrefixList': [p0]}
+ g1.set_prefix_set(ps0)
+
+ st0 = {'Name': 'st0',
+ 'Conditions': {'MatchPrefixSet': {'PrefixSet': ps0['PrefixSetName']}},
+ 'Actions': {'RouteDisposition': {'AcceptRoute': True},
+ 'BgpActions': {'SetAsPathPrepend': {'RepeatN': 5, 'As': "last-as"}}}}
+
+ policy = {'name': 'policy0',
+ 'type': 'import',
+ 'statements': [st0]}
+ g1.add_policy(policy, q2)
+
+ e1.add_route('192.168.20.0/24')
+ e1.add_route('192.168.200.0/24')
+
+ for c in [e1, q1, q2]:
+ g1.wait_for(BGP_FSM_ESTABLISHED, c)
+
+ @staticmethod
+ def check(env):
+ lookup_scenario('InPolicySetCommunity').check(env)
+
+ @staticmethod
+ def check2(env):
+ g1 = env.g1
+ e1 = env.e1
+ q1 = env.q1
+ q2 = env.q2
+
+ path = g1.get_adj_rib_out(q1, prefix='192.168.20.0/24')[0]
+ env.assertTrue(path['as_path'] == [e1.asn])
- policy = {'name': 'policy0',
- 'type': 'import',
- 'statements': [st0]}
- g1.add_policy(policy, q2)
+ path = g1.get_adj_rib_out(q1, prefix='192.168.200.0/24')[0]
+ env.assertTrue(path['as_path'] == [e1.asn])
- e1.add_route('192.168.10.0/24')
+ path = g1.get_local_rib(q2, prefix='192.168.20.0/24')[0]['paths'][0]
+ env.assertTrue(path['as_path'] == [e1.asn]*5 + [e1.asn])
- for c in [e1, q1, q2]:
- g1.wait_for(BGP_FSM_ESTABLISHED, c)
+ path = g1.get_adj_rib_out(q2, prefix='192.168.20.0/24')[0]
+ env.assertTrue(path['as_path'] == [e1.asn]*5 + [e1.asn])
+
+ path = g1.get_adj_rib_out(q2, prefix='192.168.200.0/24')[0]
+ env.assertTrue(path['as_path'] == [e1.asn])
+
+
+@register_scenario
+class ExportPolicyAsPathPrependLastAS(object):
+ """
+ No.39 aspath prepend action lastas export
+ --------------------------------
+ e1 ->(aspath=[65001])-> | -> p1-rib -> p1-adj-rib-out | -> p1
+ | |
+ | -> p2-rib -> p2-adj-rib-out | -> p2
+ | apply action |
+ --------------------------------
+ """
+ @staticmethod
+ def boot(env):
+ lookup_scenario("ImportPolicy").boot(env)
+
+ @staticmethod
+ def setup(env):
+ g1 = env.g1
+ e1 = env.e1
+ q1 = env.q1
+ q2 = env.q2
+
+ p0 = {'IpPrefix': '192.168.20.0/24'}
+
+ ps0 = {'PrefixSetName': 'ps0',
+ 'PrefixList': [p0]}
+ g1.set_prefix_set(ps0)
+
+ st0 = {'Name': 'st0',
+ 'Conditions': {'MatchPrefixSet': {'PrefixSet': ps0['PrefixSetName']}},
+ 'Actions': {'RouteDisposition': {'AcceptRoute': True},
+ 'BgpActions': {'SetAsPathPrepend': {'RepeatN': 5, 'As': "last-as"}}}}
+
+ policy = {'name': 'policy0',
+ 'type': 'export',
+ 'statements': [st0]}
+ g1.add_policy(policy, q2)
+
+ e1.add_route('192.168.20.0/24')
+ e1.add_route('192.168.200.0/24')
+
+ for c in [e1, q1, q2]:
+ g1.wait_for(BGP_FSM_ESTABLISHED, c)
+
+ @staticmethod
+ def check(env):
+ lookup_scenario('InPolicySetCommunity').check(env)
+
+ @staticmethod
+ def check2(env):
+ g1 = env.g1
+ e1 = env.e1
+ q1 = env.q1
+ q2 = env.q2
+
+ path = g1.get_adj_rib_out(q1, prefix='192.168.20.0/24')[0]
+ env.assertTrue(path['as_path'] == [e1.asn])
+
+ path = g1.get_adj_rib_out(q1, prefix='192.168.200.0/24')[0]
+ env.assertTrue(path['as_path'] == [e1.asn])
+
+ path = g1.get_local_rib(q2, prefix='192.168.20.0/24')[0]['paths'][0]
+ env.assertTrue(path['as_path'] == [e1.asn])
+
+ path = g1.get_adj_rib_out(q2, prefix='192.168.20.0/24')[0]
+ env.assertTrue(path['as_path'] == [e1.asn]*5 + [e1.asn])
+
+ path = g1.get_adj_rib_out(q2, prefix='192.168.200.0/24')[0]
+ env.assertTrue(path['as_path'] == [e1.asn])
+
+
+@register_scenario
+class ImportPolicyExCommunityOriginCondition(object):
+ """
+ No.40 extended community origin condition import
+ --------------------------------
+ e1 ->(extcommunity=origin:65001.65100:200)-> | -> q1-rib -> q1-adj-rib-out | --> q1
+ | |
+ | ->x q2-rib |
+ --------------------------------
+ """
+ @staticmethod
+ def boot(env):
+ lookup_scenario("ImportPolicy").boot(env)
+
+ @staticmethod
+ def setup(env):
+ g1 = env.g1
+ e1 = env.e1
+ q1 = env.q1
+ q2 = env.q2
+
+ es0 = {'ExtCommunitySets': {'ExtCommunitySetList': [{'ExtCommunitySetName': 'es0',
+ 'ExtCommunityList': [{'ExtCommunity': 'SoO:65001.65100:200'}]}]}}
+
+ g1.set_bgp_defined_set(es0)
+
+ st0 = {'Name': 'st0',
+ 'Conditions': {'BgpConditions':{'MatchExtCommunitySet':{'ExtCommunitySet': 'es0'}}}}
+
+ policy = {'name': 'policy0',
+ 'type': 'import',
+ 'statements': [st0]}
+ g1.add_policy(policy, q2)
+
+ e1.add_route('192.168.20.0/24', extendedcommunity='origin:{0}:200'.format((65001 << 16) + 65100))
+ e1.add_route('192.168.200.0/24', extendedcommunity='origin:{0}:100'.format((65001 << 16) + 65200))
+
+ for c in [e1, q1, q2]:
+ g1.wait_for(BGP_FSM_ESTABLISHED, c)
+
+ @staticmethod
+ def check(env):
+ lookup_scenario("ImportPolicy").check(env)
+
+
+@register_scenario
+class ImportPolicyExCommunityTargetCondition(object):
+ """
+ No.41 extended community origin condition import
+ --------------------------------
+ e1 ->(extcommunity=target:65010:320)-> | -> q1-rib -> q1-adj-rib-out | --> q1
+ | |
+ | ->x q2-rib |
+ --------------------------------
+ """
+ @staticmethod
+ def boot(env):
+ lookup_scenario('ImportPolicy').boot(env)
+
+ @staticmethod
+ def setup(env):
+ g1 = env.g1
+ e1 = env.e1
+ q1 = env.q1
+ q2 = env.q2
+
+ es0 = {'ExtCommunitySets': {'ExtCommunitySetList': [{'ExtCommunitySetName': 'es0',
+ 'ExtCommunityList': [{'ExtCommunity': 'RT:6[0-9]+:3[0-9]+'}]}]}}
+
+ g1.set_bgp_defined_set(es0)
+
+ st0 = {'Name': 'st0',
+ 'Conditions': {'BgpConditions':{'MatchExtCommunitySet':{'ExtCommunitySet': 'es0'}}}}
+
+ policy = {'name': 'policy0',
+ 'type': 'import',
+ 'statements': [st0]}
+ g1.add_policy(policy, q2)
+
+ e1.add_route('192.168.20.0/24', extendedcommunity='target:65010:320')
+ e1.add_route('192.168.200.0/24', extendedcommunity='target:55000:320')
+
+ for c in [e1, q1, q2]:
+ g1.wait_for(BGP_FSM_ESTABLISHED, c)
+
+ @staticmethod
+ def check(env):
+ lookup_scenario("ImportPolicy").check(env)
+
+
+@register_scenario
+class InPolicyPrefixCondition(object):
+ """
+ No.42 prefix only condition accept in
+ -----------------
+ e1 ->r1(192.168.100.0/24) -> o | -> q1-rib -> | -> r2 --> q1
+ r2(192.168.10.0/24) -> x | |
+ | -> q2-rib -> | -> r2 --> q2
+ -----------------
+ """
+ @staticmethod
+ def boot(env):
+ lookup_scenario('ImportPolicy').boot(env)
+
+ @staticmethod
+ def setup(env):
+ g1 = env.g1
+ e1 = env.e1
+ q1 = env.q1
+ q2 = env.q2
+
+ p0 = {'IpPrefix': '192.168.10.0/24'}
+
+ ps0 = {'PrefixSetName': 'ps0',
+ 'PrefixList': [p0]}
+ g1.set_prefix_set(ps0)
+
+ st0 = {'Name': 'st0',
+ 'Conditions': {
+ 'MatchPrefixSet': {'PrefixSet': ps0['PrefixSetName']}}}
+
+ policy = {'name': 'policy0',
+ 'type': 'in',
+ 'statements': [st0]}
+ g1.add_policy(policy, e1)
+
+ # this will be blocked
+ e1.add_route('192.168.100.0/24')
+ # this will pass
+ e1.add_route('192.168.10.0/24')
+
+ for c in [e1, q1, q2]:
+ g1.wait_for(BGP_FSM_ESTABLISHED, c)
+
+ @staticmethod
+ def check(env):
+ lookup_scenario('InPolicyReject').check(env)
-@scenario(43)
-def check(env):
- scenarios[17]['check'](env)
def ext_community_exists(path, extcomm):
typ = extcomm.split(':')[0]
@@ -2869,241 +2913,313 @@ def ext_community_exists(path, extcomm):
return True
return False
-@scenario(43)
-def check2(env):
- g1 = env.g1
- e1 = env.e1
- q1 = env.q1
- q2 = env.q2
- path = g1.get_adj_rib_out(q1)[0]
- env.assertFalse(ext_community_exists(path, 'RT:65000:1'))
- path = g1.get_adj_rib_out(q2)[0]
- env.assertTrue(ext_community_exists(path, 'RT:65000:1'))
-
-"""
- No.44 extended community add action import-policy test
- --------------------------------
- e1 ->(extcommunity=RT:65000:1) -> | -> q1-rib -> q1-adj-rib-out | --> q1
- | |
- | -> q2-rib -> q2-adj-rib-out | --> q2
- | add ext-community |
- --------------------------------
-"""
-@scenario(44)
-def boot(env):
- scenarios[1]['boot'](env)
-
-@scenario(44)
-def setup(env):
- g1 = env.g1
- e1 = env.e1
- q1 = env.q1
- q2 = env.q2
-
- p0 = {'IpPrefix': '192.168.10.0/24'}
-
- ps0 = {'PrefixSetName': 'ps0',
- 'PrefixList': [p0]}
- g1.set_prefix_set(ps0)
-
- st0 = {
+
+@register_scenario
+class ImportPolicyExCommunityAdd(object):
+ """
+ No.43 extended community add action import-policy test
+ ---------------------------------
+ e1 ->(extcommunity=none) ->| -> q1-rib -> q1-adj-rib-out | --> q1
+ | |
+ | -> q2-rib -> q2-adj-rib-out | --> q2
+ | add ext-community |
+ ---------------------------------
+ """
+ @staticmethod
+ def boot(env):
+ lookup_scenario('ImportPolicy').boot(env)
+
+ @staticmethod
+ def setup(env):
+ g1 = env.g1
+ e1 = env.e1
+ q1 = env.q1
+ q2 = env.q2
+
+ p0 = {'IpPrefix': '192.168.10.0/24'}
+
+ ps0 = {'PrefixSetName': 'ps0',
+ 'PrefixList': [p0]}
+ g1.set_prefix_set(ps0)
+
+ st0 = {
'Name': 'st0',
'Conditions': {
'MatchPrefixSet': {
'PrefixSet': ps0['PrefixSetName']
- }
- },
- 'Actions': {
- 'RouteDisposition': {'AcceptRoute': True},
- 'BgpActions': {
- 'SetExtCommunity': {
- 'Options': 'ADD',
- 'SetExtCommunityMethod': {
- 'Communities': ['0:2:0xfe:0x4c:0:0:0:0x64']
- }
- },
+ }
+ },
+ 'Actions': {
+ 'RouteDisposition': {'AcceptRoute': True},
+ 'BgpActions': {
+ 'SetExtCommunity': {
+ 'Options': 'ADD',
+ 'SetExtCommunityMethod': {
+ 'Communities': ['0:2:0xfd:0xe8:0:0:0:1']
+ }
+ },
+ }
}
}
- }
-
- policy = {'name': 'policy0',
- 'type': 'import',
- 'statements': [st0]}
- g1.add_policy(policy, q2)
-
- e1.add_route('192.168.10.0/24', extendedcommunity='target:65000:1')
-
- for c in [e1, q1, q2]:
- g1.wait_for(BGP_FSM_ESTABLISHED, c)
-
-@scenario(44)
-def check(env):
- scenarios[17]['check'](env)
-
-@scenario(44)
-def check2(env):
- g1 = env.g1
- e1 = env.e1
- q1 = env.q1
- q2 = env.q2
- path = g1.get_adj_rib_out(q1)[0]
- env.assertTrue(ext_community_exists(path, 'RT:65000:1'))
- env.assertFalse(ext_community_exists(path, 'RT:65100:100'))
- path = g1.get_local_rib(q2)[0]['paths'][0]
- env.assertTrue(ext_community_exists(path, 'RT:65000:1'))
- env.assertTrue(ext_community_exists(path, 'RT:65100:100'))
- path = g1.get_adj_rib_out(q2)[0]
- env.assertTrue(ext_community_exists(path, 'RT:65000:1'))
- env.assertTrue(ext_community_exists(path, 'RT:65100:100'))
-
-"""
- No.45 extended community add action multiple import-policy test
- ---------------------------------------
- exabgp ->(extcommunity=none) ->| -> peer1-rib -> peer1-adj-rib-out | --> peer1
- | |
- | -> peer2-rib -> peer2-adj-rib-out | --> peer2
- | add ext-community |
- ---------------------------------------
-"""
-@scenario(45)
-def boot(env):
- scenarios[1]['boot'](env)
-
-@scenario(45)
-def setup(env):
- g1 = env.g1
- e1 = env.e1
- q1 = env.q1
- q2 = env.q2
-
- p0 = {'IpPrefix': '192.168.10.0/24'}
-
- ps0 = {'PrefixSetName': 'ps0',
- 'PrefixList': [p0]}
- g1.set_prefix_set(ps0)
-
- st0 = {
+
+ policy = {'name': 'policy0',
+ 'type': 'import',
+ 'statements': [st0]}
+ g1.add_policy(policy, q2)
+
+ e1.add_route('192.168.10.0/24')
+
+ for c in [e1, q1, q2]:
+ g1.wait_for(BGP_FSM_ESTABLISHED, c)
+
+ @staticmethod
+ def check(env):
+ lookup_scenario('ImportPolicyCommunityAction').check(env)
+
+ @staticmethod
+ def check2(env):
+ g1 = env.g1
+ e1 = env.e1
+ q1 = env.q1
+ q2 = env.q2
+ path = g1.get_adj_rib_out(q1)[0]
+ env.assertFalse(ext_community_exists(path, 'RT:65000:1'))
+ path = g1.get_adj_rib_out(q2)[0]
+ env.assertTrue(ext_community_exists(path, 'RT:65000:1'))
+
+
+@register_scenario
+class ImportPolicyExCommunityAdd2(object):
+ """
+ No.44 extended community add action import-policy test
+ --------------------------------
+ e1 ->(extcommunity=RT:65000:1) -> | -> q1-rib -> q1-adj-rib-out | --> q1
+ | |
+ | -> q2-rib -> q2-adj-rib-out | --> q2
+ | add ext-community |
+ --------------------------------
+ """
+ @staticmethod
+ def boot(env):
+ lookup_scenario('ImportPolicy').boot(env)
+
+ @staticmethod
+ def setup(env):
+ g1 = env.g1
+ e1 = env.e1
+ q1 = env.q1
+ q2 = env.q2
+
+ p0 = {'IpPrefix': '192.168.10.0/24'}
+
+ ps0 = {'PrefixSetName': 'ps0',
+ 'PrefixList': [p0]}
+ g1.set_prefix_set(ps0)
+
+ st0 = {
'Name': 'st0',
'Conditions': {
'MatchPrefixSet': {
'PrefixSet': ps0['PrefixSetName']
- }
- },
- 'Actions': {
- 'RouteDisposition': {'AcceptRoute': True},
- 'BgpActions': {
- 'SetExtCommunity': {
- 'Options': 'ADD',
- 'SetExtCommunityMethod': {
- 'Communities': ['0:2:0xfe:0x4c:0:0:0:0x64', '0:2:0:0x64:0:0:0:0x64']
- }
- },
+ }
+ },
+ 'Actions': {
+ 'RouteDisposition': {'AcceptRoute': True},
+ 'BgpActions': {
+ 'SetExtCommunity': {
+ 'Options': 'ADD',
+ 'SetExtCommunityMethod': {
+ 'Communities': ['0:2:0xfe:0x4c:0:0:0:0x64']
+ }
+ },
+ }
}
}
- }
-
- policy = {'name': 'policy0',
- 'type': 'import',
- 'statements': [st0]}
- g1.add_policy(policy, q2)
-
- e1.add_route('192.168.10.0/24')
-
- for c in [e1, q1, q2]:
- g1.wait_for(BGP_FSM_ESTABLISHED, c)
-
-@scenario(45)
-def check(env):
- scenarios[17]['check'](env)
-
-@scenario(45)
-def check2(env):
- g1 = env.g1
- e1 = env.e1
- q1 = env.q1
- q2 = env.q2
- path = g1.get_adj_rib_out(q1)[0]
- env.assertFalse(ext_community_exists(path, 'RT:65100:100'))
- env.assertFalse(ext_community_exists(path, 'RT:100:100'))
- path = g1.get_local_rib(q2)[0]['paths'][0]
- env.assertTrue(ext_community_exists(path, 'RT:65100:100'))
- env.assertTrue(ext_community_exists(path, 'RT:100:100'))
- path = g1.get_adj_rib_out(q2)[0]
- env.assertTrue(ext_community_exists(path, 'RT:65100:100'))
- env.assertTrue(ext_community_exists(path, 'RT:100:100'))
-
-"""
- No.46 extended comunity add action export-policy test
- ------------------------------------
- e1 ->(extcommunity=none) ->| -> q1-rib -> q1-adj-rib-out | --> q1
- | |
- | -> q2-rib -> q2-adj-rib-out | --> q2
- | add ext-community |
- ------------------------------------
-"""
-@scenario(46)
-def boot(env):
- scenarios[1]['boot'](env)
-
-@scenario(46)
-def setup(env):
- g1 = env.g1
- e1 = env.e1
- q1 = env.q1
- q2 = env.q2
-
- p0 = {'IpPrefix': '192.168.10.0/24'}
-
- ps0 = {'PrefixSetName': 'ps0',
- 'PrefixList': [p0]}
- g1.set_prefix_set(ps0)
-
- st0 = {
+
+ policy = {'name': 'policy0',
+ 'type': 'import',
+ 'statements': [st0]}
+ g1.add_policy(policy, q2)
+
+ e1.add_route('192.168.10.0/24', extendedcommunity='target:65000:1')
+
+ for c in [e1, q1, q2]:
+ g1.wait_for(BGP_FSM_ESTABLISHED, c)
+
+ @staticmethod
+ def check(env):
+ lookup_scenario('ImportPolicyCommunityAction').check(env)
+
+ @staticmethod
+ def check2(env):
+ g1 = env.g1
+ e1 = env.e1
+ q1 = env.q1
+ q2 = env.q2
+ path = g1.get_adj_rib_out(q1)[0]
+ env.assertTrue(ext_community_exists(path, 'RT:65000:1'))
+ env.assertFalse(ext_community_exists(path, 'RT:65100:100'))
+ path = g1.get_local_rib(q2)[0]['paths'][0]
+ env.assertTrue(ext_community_exists(path, 'RT:65000:1'))
+ env.assertTrue(ext_community_exists(path, 'RT:65100:100'))
+ path = g1.get_adj_rib_out(q2)[0]
+ env.assertTrue(ext_community_exists(path, 'RT:65000:1'))
+ env.assertTrue(ext_community_exists(path, 'RT:65100:100'))
+
+
+@register_scenario
+class ImportPolicyExCommunityMultipleAdd(object):
+ """
+ No.45 extended community add action multiple import-policy test
+ ---------------------------------------
+ exabgp ->(extcommunity=none) ->| -> peer1-rib -> peer1-adj-rib-out | --> peer1
+ | |
+ | -> peer2-rib -> peer2-adj-rib-out | --> peer2
+ | add ext-community |
+ ---------------------------------------
+ """
+ @staticmethod
+ def boot(env):
+ lookup_scenario('ImportPolicy').boot(env)
+
+ @staticmethod
+ def setup(env):
+ g1 = env.g1
+ e1 = env.e1
+ q1 = env.q1
+ q2 = env.q2
+
+ p0 = {'IpPrefix': '192.168.10.0/24'}
+
+ ps0 = {'PrefixSetName': 'ps0',
+ 'PrefixList': [p0]}
+ g1.set_prefix_set(ps0)
+
+ st0 = {
'Name': 'st0',
'Conditions': {
'MatchPrefixSet': {
'PrefixSet': ps0['PrefixSetName']
+ }
+ },
+ 'Actions': {
+ 'RouteDisposition': {'AcceptRoute': True},
+ 'BgpActions': {
+ 'SetExtCommunity': {
+ 'Options': 'ADD',
+ 'SetExtCommunityMethod': {
+ 'Communities': ['0:2:0xfe:0x4c:0:0:0:0x64', '0:2:0:0x64:0:0:0:0x64']
+ }
+ },
+ }
}
- },
- 'Actions': {
- 'RouteDisposition': {'AcceptRoute': True},
- 'BgpActions': {
- 'SetExtCommunity': {
- 'Options': 'ADD',
- 'SetExtCommunityMethod': {
- 'Communities': ['0:2:0xfd:0xe8:0:0:0:1'],
- }
- },
+ }
+
+ policy = {'name': 'policy0',
+ 'type': 'import',
+ 'statements': [st0]}
+ g1.add_policy(policy, q2)
+
+ e1.add_route('192.168.10.0/24')
+
+ for c in [e1, q1, q2]:
+ g1.wait_for(BGP_FSM_ESTABLISHED, c)
+
+ @staticmethod
+ def check(env):
+ lookup_scenario('ImportPolicyCommunityAction').check(env)
+
+ @staticmethod
+ def check2(env):
+ g1 = env.g1
+ e1 = env.e1
+ q1 = env.q1
+ q2 = env.q2
+ path = g1.get_adj_rib_out(q1)[0]
+ env.assertFalse(ext_community_exists(path, 'RT:65100:100'))
+ env.assertFalse(ext_community_exists(path, 'RT:100:100'))
+ path = g1.get_local_rib(q2)[0]['paths'][0]
+ env.assertTrue(ext_community_exists(path, 'RT:65100:100'))
+ env.assertTrue(ext_community_exists(path, 'RT:100:100'))
+ path = g1.get_adj_rib_out(q2)[0]
+ env.assertTrue(ext_community_exists(path, 'RT:65100:100'))
+ env.assertTrue(ext_community_exists(path, 'RT:100:100'))
+
+
+@register_scenario
+class ExportPolicyExCommunityAdd(object):
+ """
+ No.46 extended comunity add action export-policy test
+ ------------------------------------
+ e1 ->(extcommunity=none) ->| -> q1-rib -> q1-adj-rib-out | --> q1
+ | |
+ | -> q2-rib -> q2-adj-rib-out | --> q2
+ | add ext-community |
+ ------------------------------------
+ """
+ @staticmethod
+ def boot(env):
+ lookup_scenario('ImportPolicy').boot(env)
+
+ @staticmethod
+ def setup(env):
+ g1 = env.g1
+ e1 = env.e1
+ q1 = env.q1
+ q2 = env.q2
+
+ p0 = {'IpPrefix': '192.168.10.0/24'}
+
+ ps0 = {'PrefixSetName': 'ps0',
+ 'PrefixList': [p0]}
+ g1.set_prefix_set(ps0)
+
+ st0 = {
+ 'Name': 'st0',
+ 'Conditions': {
+ 'MatchPrefixSet': {
+ 'PrefixSet': ps0['PrefixSetName']
+ }
+ },
+ 'Actions': {
+ 'RouteDisposition': {'AcceptRoute': True},
+ 'BgpActions': {
+ 'SetExtCommunity': {
+ 'Options': 'ADD',
+ 'SetExtCommunityMethod': {
+ 'Communities': ['0:2:0xfd:0xe8:0:0:0:1'],
+ }
+ },
+ }
}
}
- }
- policy = {'name': 'policy0',
- 'type': 'export',
- 'statements': [st0]}
- g1.add_policy(policy, q2)
+ policy = {'name': 'policy0',
+ 'type': 'export',
+ 'statements': [st0]}
+ g1.add_policy(policy, q2)
- e1.add_route('192.168.10.0/24')
+ e1.add_route('192.168.10.0/24')
- for c in [e1, q1, q2]:
- g1.wait_for(BGP_FSM_ESTABLISHED, c)
+ for c in [e1, q1, q2]:
+ g1.wait_for(BGP_FSM_ESTABLISHED, c)
-@scenario(46)
-def check(env):
- scenarios[17]['check'](env)
+ @staticmethod
+ def check(env):
+ lookup_scenario('ImportPolicyCommunityAction').check(env)
-@scenario(46)
-def check2(env):
- g1 = env.g1
- e1 = env.e1
- q1 = env.q1
- q2 = env.q2
- path = g1.get_adj_rib_out(q1)[0]
- env.assertFalse(ext_community_exists(path, 'RT:65000:1'))
- path = g1.get_local_rib(q2)[0]['paths'][0]
- env.assertFalse(ext_community_exists(path, 'RT:65000:1'))
- path = g1.get_adj_rib_out(q2)[0]
- env.assertTrue(ext_community_exists(path, 'RT:65000:1'))
+ @staticmethod
+ def check2(env):
+ g1 = env.g1
+ e1 = env.e1
+ q1 = env.q1
+ q2 = env.q2
+ path = g1.get_adj_rib_out(q1)[0]
+ env.assertFalse(ext_community_exists(path, 'RT:65000:1'))
+ path = g1.get_local_rib(q2)[0]['paths'][0]
+ env.assertFalse(ext_community_exists(path, 'RT:65000:1'))
+ path = g1.get_adj_rib_out(q2)[0]
+ env.assertTrue(ext_community_exists(path, 'RT:65000:1'))
class GoBGPTestBase(unittest.TestCase):
@@ -3117,18 +3233,25 @@ class GoBGPTestBase(unittest.TestCase):
base.TEST_PREFIX = parser_option.test_prefix
cls.parser_option = parser_option
- if idx not in scenarios:
- print 'invalid test-index. # of scenarios: {0}'.format(len(scenarios))
+ if idx not in _SCENARIOS:
+ print 'invalid test-index. # of scenarios: {0}'.format(len(_SCENARIOS))
sys.exit(1)
- cls.boot = scenarios[idx]['boot']
- cls.setup = scenarios[idx]['setup']
- cls.check = scenarios[idx]['check']
- cls.setup2 = scenarios[idx]['setup2'] if 'setup2' in scenarios[idx] else None
- cls.check2 = scenarios[idx]['check2'] if 'check2' in scenarios[idx] else None
+ cls.setup2 = None
+ cls.check2 = None
+ for k, m in inspect.getmembers(_SCENARIOS[idx], inspect.isfunction):
+ if k == 'boot':
+ cls.boot = m
+ elif k == 'setup':
+ cls.setup = m
+ elif k == 'check':
+ cls.check = m
+ elif k == 'setup2':
+ cls.setup2 = m
+ elif k == 'check2':
+ cls.check2 = m
def test(self):
-
self.boot()
self.setup()