summaryrefslogtreecommitdiffhomepage
path: root/test/scenario_test/route_server_test.py
diff options
context:
space:
mode:
Diffstat (limited to 'test/scenario_test/route_server_test.py')
-rw-r--r--test/scenario_test/route_server_test.py401
1 files changed, 401 insertions, 0 deletions
diff --git a/test/scenario_test/route_server_test.py b/test/scenario_test/route_server_test.py
new file mode 100644
index 00000000..9b9b1991
--- /dev/null
+++ b/test/scenario_test/route_server_test.py
@@ -0,0 +1,401 @@
+# Copyright (C) 2014 Nippon Telegraph and Telephone Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import unittest
+import requests
+import json
+import toml
+import os
+import quagga_access as qaccess
+from ciscoconfparse import CiscoConfParse
+import docker_control as fab
+
+
+class GoBGPTest(unittest.TestCase):
+
+ gobgp_ip = "10.0.255.1"
+ gobgp_port = "8080"
+ base_dir = "/usr/local/gobgp/"
+ gobgp_config_file = "/usr/local/gobgp/gobgpd.conf"
+ gobgp_config = None
+ quagga_num = 3
+ appending_quagga = 10
+ deleting_quagga = 10
+ appending_quagga_best = 20
+ fab.init_test_env_executor(quagga_num)
+
+ def __init__(self, *args, **kwargs):
+ super(GoBGPTest, self).__init__(*args, **kwargs)
+
+ def setUp(self):
+ self.quagga_configs = []
+ self.load_gobgp_config()
+ self.load_quagga_config()
+
+ # test each neighbor state is turned establish
+ def test_01_neighbor_established(self):
+ print "test_neighbor_established"
+ if self.check_load_config() is False:
+ return
+ addresses = self.get_neighbor_address(self.gobgp_config)
+
+ for address in addresses:
+ # get neighbor state and remote ip from gobgp connections
+ print "check of [ " + address + " ]"
+ url = "http://" + self.gobgp_ip + ":" + self.gobgp_port + "/v1/bgp/neighbor/" + address
+ r = requests.get(url)
+ neighbor = json.loads(r.text)
+ state = neighbor['info']['bgp_state']
+ remote_ip = neighbor['conf']['remote_ip']
+ self.assertEqual(address, remote_ip)
+ self.assertEqual(state, "BGP_FSM_ESTABLISHED")
+
+ # Test of advertised route gobgp from each quagga
+ def test_02_received_route(self):
+ print "test_received_route"
+ if self.check_load_config() is False:
+ return
+
+ for address in self.get_neighbor_address(self.gobgp_config):
+ print "check of [ " + address + " ]"
+ # get local-rib per peer
+ url = "http://" + self.gobgp_ip + ":" + self.gobgp_port + "/v1/bgp/neighbor/" + address + "/local-rib"
+ r = requests.get(url)
+ local_rib = json.loads(r.text)
+
+ for quagga_config in self.quagga_configs:
+ if quagga_config.peer_ip == address:
+ for c_dest in quagga_config.destinations.itervalues():
+ # print "config : ", c_dest.prefix, "my ip !!!"
+ g_dests = local_rib['Destinations']
+ exist_n = 0
+ for g_dest in g_dests:
+ # print "gobgp : ", g_dest['Prefix']
+ if c_dest.prefix == g_dest['Prefix']:
+ exist_n += 1
+ self.assertEqual(exist_n, 0)
+ else:
+ for c_dest in quagga_config.destinations.itervalues():
+ # print "config : ", c_dest.prefix"
+ g_dests = local_rib['Destinations']
+ exist_n = 0
+ for g_dest in g_dests:
+ # print "gobgp : ", g_dest['Prefix']
+ if c_dest.prefix == g_dest['Prefix']:
+ exist_n += 1
+ self.assertEqual(exist_n, 1)
+
+ # Test of advertising route to each quagga form gobgp
+ def test_03_advertising_route(self):
+ print "test_advertising_route"
+ if self.check_load_config() is False:
+ return
+
+ for address in self.get_neighbor_address(self.gobgp_config):
+ print "check of [ " + address + " ]"
+ tn = qaccess.login(address)
+ q_rib = qaccess.show_rib(tn)
+ for quagga_config in self.quagga_configs:
+ if quagga_config.peer_ip == address:
+ for c_dest in quagga_config.destinations.itervalues():
+ exist_n = 0
+ for c_path in c_dest.paths:
+ # print "conf : ", c_path.network, c_path.nexthop, "my ip !!!"
+ for q_path in q_rib:
+ # print "quag : ", q_path['Network'], q_path['Next Hop']
+ if c_path.network.split("/")[0] == q_path['Network'] and "0.0.0.0" == q_path['Next Hop']:
+ exist_n += 1
+ self.assertEqual(exist_n, 1)
+ else:
+ for c_dest in quagga_config.destinations.itervalues():
+ exist_n = 0
+ for c_path in c_dest.paths:
+ # print "conf : ", c_path.network, c_path.nexthop
+ for q_path in q_rib:
+ # print "quag : ", q_path['Network'], q_path['Next Hop']
+ if c_path.network.split("/")[0] == q_path['Network'] and c_path.nexthop == q_path['Next Hop']:
+ exist_n += 1
+ self.assertEqual(exist_n, 1)
+
+ # check if quagga that is appended can establish connection with gobgp
+ def test_04_established_with_appended_quagga(self):
+ print "test_established_with_appended_quagga"
+
+ # append new quagga container
+ fab.docker_container_append(self.appending_quagga)
+ append_quagga_address = "10.0.0." + str(self.appending_quagga)
+
+ # get neighbor state and remote ip of new quagga
+ print "check of [" + append_quagga_address + " ]"
+ url = "http://" + self.gobgp_ip + ":" + self.gobgp_port + "/v1/bgp/neighbor/" + append_quagga_address
+ r = requests.get(url)
+ neighbor = json.loads(r.text)
+ state = neighbor['info']['bgp_state']
+ remote_ip = neighbor['conf']['remote_ip']
+ self.assertEqual(append_quagga_address, remote_ip)
+ self.assertEqual(state, "BGP_FSM_ESTABLISHED")
+
+ # Test of advertised route gobgp from each quagga when append quagga container
+ def test_05_received_route_when_appended_quagga(self):
+ print "test_received_route_by_appended_quagga"
+ if self.check_load_config() is False:
+ return
+
+ for address in self.get_neighbor_address(self.gobgp_config):
+ print "check of [ " + address + " ]"
+ # get local-rib per peer
+ url = "http://" + self.gobgp_ip + ":" + self.gobgp_port + "/v1/bgp/neighbor/" + address + "/local-rib"
+ r = requests.get(url)
+ local_rib = json.loads(r.text)
+
+ for quagga_config in self.quagga_configs:
+ if quagga_config.peer_ip == address:
+ for c_dest in quagga_config.destinations.itervalues():
+ # print "config : ", c_dest.prefix, "my ip !!!"
+ g_dests = local_rib['Destinations']
+ exist_n = 0
+ for g_dest in g_dests:
+ # print "gobgp : ", g_dest['Prefix']
+ if c_dest.prefix == g_dest['Prefix']:
+ exist_n += 1
+ self.assertEqual(exist_n, 0)
+ else:
+ for c_dest in quagga_config.destinations.itervalues():
+ # print "config : ", c_dest.prefix,"
+ g_dests = local_rib['Destinations']
+ exist_n = 0
+ for g_dest in g_dests:
+ # print "gobgp : ", g_dest['Prefix']
+ if c_dest.prefix == g_dest['Prefix']:
+ exist_n += 1
+ self.assertEqual(exist_n, 1)
+
+ # Test of advertising route to each quagga form gobgp when append quagga container
+ def test_06_advertising_route_when_appended_quagga(self):
+ print "test_advertising_route_to_appended_quagga"
+ if self.check_load_config() is False:
+ return
+
+ for address in self.get_neighbor_address(self.gobgp_config):
+ print "check of [ " + address + " ]"
+ tn = qaccess.login(address)
+ q_rib = qaccess.show_rib(tn)
+ for quagga_config in self.quagga_configs:
+ if quagga_config.peer_ip == address:
+ for c_dest in quagga_config.destinations.itervalues():
+ exist_n = 0
+ for c_path in c_dest.paths:
+ # print "conf : ", c_path.network, c_path.nexthop, "my ip !!!"
+ for q_path in q_rib:
+ # print "quag : ", q_path['Network'], q_path['Next Hop']
+ if c_path.network.split("/")[0] == q_path['Network'] and "0.0.0.0" == q_path['Next Hop']:
+ exist_n += 1
+ self.assertEqual(exist_n, 1)
+ else:
+ for c_dest in quagga_config.destinations.itervalues():
+ exist_n = 0
+ for c_path in c_dest.paths:
+ # print "conf : ", c_path.network, c_path.nexthop
+ for q_path in q_rib:
+ # print "quag : ", q_path['Network'], q_path['Next Hop']
+ if c_path.network.split("/")[0] == q_path['Network'] and c_path.nexthop == q_path['Next Hop']:
+ exist_n += 1
+ self.assertEqual(exist_n, 1)
+
+ def test_07_active_when_depend_quagga(self):
+ print "test_active_when_depend_quagga"
+
+ # remove quagga container
+ fab.docker_container_depend(self.deleting_quagga)
+ depend_quagga_address = "10.0.0." + str(self.deleting_quagga)
+
+ # get neighbor state and remote ip of depend quagga
+ print "check of [" + depend_quagga_address + " ]"
+ url = "http://" + self.gobgp_ip + ":" + self.gobgp_port + "/v1/bgp/neighbor/" + depend_quagga_address
+ r = requests.get(url)
+ neighbor = json.loads(r.text)
+ state = neighbor['info']['bgp_state']
+ remote_ip = neighbor['conf']['remote_ip']
+ self.assertEqual(depend_quagga_address, remote_ip)
+ self.assertEqual(state, "BGP_FSM_ACTIVE")
+
+ def test_08_received_route_when_depend_quagga(self):
+ print "test_received_route_when_depend_quagga"
+ if self.check_load_config() is False:
+ return
+
+ deleting_quagga_address = "10.0.0." + str(self.deleting_quagga)
+ for address in self.get_neighbor_address(self.gobgp_config):
+ if deleting_quagga_address == address:
+ continue
+
+ print "check of [ " + address + " ]"
+ # get local-rib per peer
+ url = "http://" + self.gobgp_ip + ":" + self.gobgp_port + "/v1/bgp/neighbor/" + address + "/local-rib"
+ r = requests.get(url)
+ local_rib = json.loads(r.text)
+
+ for quagga_config in self.quagga_configs:
+ if quagga_config.peer_ip == address:
+ for c_dest in quagga_config.destinations.itervalues():
+ # print "config : ", c_dest.prefix, "my ip !!!"
+ g_dests = local_rib['Destinations']
+ exist_n = 0
+ for g_dest in g_dests:
+ # print "gobgp : ", g_dest['Prefix']
+ if c_dest.prefix == g_dest['Prefix']:
+ exist_n += 1
+ self.assertEqual(exist_n, 0)
+ else:
+ for c_dest in quagga_config.destinations.itervalues():
+ # print "config : ", c_dest.prefix,"
+ g_dests = local_rib['Destinations']
+ exist_n = 0
+ for g_dest in g_dests:
+ # print "gobgp : ", g_dest['Prefix']
+ if c_dest.prefix == g_dest['Prefix']:
+ exist_n += 1
+ self.assertEqual(exist_n, 1)
+
+ def test_09_advertising_route_when_depend_quagga(self):
+ print "test_advertising_route_when_depend_quagga"
+ if self.check_load_config() is False:
+ return
+
+ deleting_quagga_address = "10.0.0." + str(self.deleting_quagga)
+ for address in self.get_neighbor_address(self.gobgp_config):
+ if deleting_quagga_address == address:
+ continue
+
+ print "check of [ " + address + " ]"
+ tn = qaccess.login(address)
+ q_rib = qaccess.show_rib(tn)
+ for quagga_config in self.quagga_configs:
+ if quagga_config.peer_ip == address:
+ for c_dest in quagga_config.destinations.itervalues():
+ exist_n = 0
+ for c_path in c_dest.paths:
+ # print "conf : ", c_path.network, c_path.nexthop, "my ip !!!"
+ for q_path in q_rib:
+ # print "quag : ", q_path['Network'], q_path['Next Hop']
+ if c_path.network.split("/")[0] == q_path['Network'] and "0.0.0.0" == q_path['Next Hop']:
+ exist_n += 1
+ self.assertEqual(exist_n, 1)
+ else:
+ for c_dest in quagga_config.destinations.itervalues():
+ exist_n = 0
+ for c_path in c_dest.paths:
+ # print "conf : ", c_path.network, c_path.nexthop
+ for q_path in q_rib:
+ # print "quag : ", q_path['Network'], q_path['Next Hop']
+ if c_path.network.split("/")[0] == q_path['Network'] and c_path.nexthop == q_path['Next Hop']:
+ exist_n += 1
+ self.assertEqual(exist_n, 1)
+
+ def test_10_bestpath_selection_by_received_route(self):
+ pass
+
+ # load configration from gobgp(gobgpd.conf)
+ def load_gobgp_config(self):
+ try:
+ self.gobgp_config = toml.loads(open(self.gobgp_config_file).read())
+ except IOError, (errno, strerror):
+ print "I/O error(%s): %s" % (errno, strerror)
+
+ # load configration from quagga(bgpd.conf)
+ def load_quagga_config(self):
+ dirs = []
+ try:
+ content = os.listdir(self.base_dir)
+ for item in content:
+ if os.path.isdir(os.path.join(self.base_dir, item)):
+ dirs.append(item)
+ except OSError, (errno, strerror):
+ print "I/O error(%s): %s" % (errno, strerror)
+
+ for dir in dirs:
+ config_path = self.base_dir + dir + "/bgpd.conf"
+ config = CiscoConfParse(config_path)
+ peer_ip = "10.0.0." + str(dir).replace("q", "")
+ peer_id = config.find_objects(r"^bgp\srouter-id")[0].text
+ peer_as = config.find_objects(r"^router\sbgp")[0].text
+ quagga_config = Peer(peer_ip, peer_id, peer_as)
+
+ networks = config.find_objects(r"^network")
+ if len(networks) == 0:
+ continue
+ for network in networks:
+ elems = network.text.split(" ")
+ prefix = elems[1].split("/")[0]
+ network = elems[1]
+ nexthop = peer_ip
+ path = Path(network, nexthop)
+ dest = Destination(prefix)
+ dest.paths.append(path)
+ quagga_config.destinations[prefix] = dest
+
+ neighbors = config.find_objects(r"^neighbor\s.*\sremote-as")
+ if len(neighbors) == 0:
+ continue
+ for neighbor in neighbors:
+ elems = neighbor.text.split(" ")
+ neighbor = Peer(elems[1], None, elems[3])
+ quagga_config.neighbors.append(neighbor)
+
+ self.quagga_configs.append(quagga_config)
+
+ # get address of each neighbor from gobpg configration
+ def get_neighbor_address(self, config):
+ address = []
+ neighbors_config = config['NeighborList']
+ for neighbor_config in neighbors_config:
+ neighbor_ip = neighbor_config['NeighborAddress']
+ address.append(neighbor_ip)
+ return address
+
+ def check_load_config(self):
+ if self.gobgp_config is None:
+ print "Failed to read the gobgp configuration file"
+ return False
+ if len(self.quagga_configs) == 0:
+ print "Failed to read the quagga configuration file"
+ return False
+ return True
+
+
+class Peer:
+ def __init__(self, peer_ip, peer_id, peer_as):
+ self.peer_ip = peer_ip
+ self.peer_id = peer_id
+ self.peer_as = peer_as
+ self.neighbors = []
+ self.destinations = {}
+
+
+class Destination:
+ def __init__(self, prefix):
+ self.prefix = prefix
+ self.paths = []
+
+
+class Path:
+ def __init__(self, network, nexthop):
+ self.network = network
+ self.nexthop = nexthop
+ self.origin = None
+ self.as_path = []
+ self.metric = None
+
+