diff options
Diffstat (limited to 'tests/integrated/bgp')
-rw-r--r-- | tests/integrated/bgp/__init__.py | 0 | ||||
-rw-r--r-- | tests/integrated/bgp/base.py | 84 | ||||
-rw-r--r-- | tests/integrated/bgp/base_ip6.py | 84 | ||||
-rw-r--r-- | tests/integrated/bgp/test_basic.py | 49 | ||||
-rw-r--r-- | tests/integrated/bgp/test_ip6_basic.py | 49 |
5 files changed, 266 insertions, 0 deletions
diff --git a/tests/integrated/bgp/__init__.py b/tests/integrated/bgp/__init__.py new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/tests/integrated/bgp/__init__.py diff --git a/tests/integrated/bgp/base.py b/tests/integrated/bgp/base.py new file mode 100644 index 00000000..9d057075 --- /dev/null +++ b/tests/integrated/bgp/base.py @@ -0,0 +1,84 @@ +# Copyright (C) 2016 Nippon Telegraph and Telephone Corporation. +# Copyright (C) 2016 Fumihiko Kakuma <kakuma at valinux co jp> +# +# 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. + +from __future__ import absolute_import + +import logging +import sys +import unittest + +from tests.integrated.common import docker_base as ctn_base +from tests.integrated.common import ryubgp +from tests.integrated.common import quagga + + +LOG = logging.getLogger(__name__) + + +class BgpSpeakerTestBase(unittest.TestCase): + images = [] + containers = [] + bridges = [] + checktime = 120 + + @classmethod + def setUpClass(cls): + cls.brdc1 = ctn_base.Bridge(name='brdc1', + subnet='192.168.10.0/24') + cls.bridges.append(cls.brdc1) + + cls.dockerimg = ctn_base.DockerImage() + image = 'python:%d.%d' % ( + sys.version_info.major, sys.version_info.minor) + cls.r_img = cls.dockerimg.create_ryu(image=image, check_exist=True) + cls.images.append(cls.r_img) + cls.q_img = 'osrg/quagga' + cls.images.append(cls.q_img) + + cls.r1 = ryubgp.RyuBGPContainer(name='r1', asn=64512, + router_id='192.168.0.1', + ctn_image_name=cls.r_img) + cls.containers.append(cls.r1) + cls.r1.add_route('10.10.0.0/28') + cls.r1.run(wait=True) + cls.r1_ip_cidr = cls.brdc1.addif(cls.r1) + cls.r1_ip = cls.r1_ip_cidr.split('/')[0] + + cls.q1 = quagga.QuaggaBGPContainer(name='q1', asn=64522, + router_id='192.168.0.2', + ctn_image_name=cls.q_img) + cls.containers.append(cls.q1) + cls.q1.add_route('192.168.160.0/24') + cls.q1.run(wait=True) + cls.q1_ip_cidr = cls.brdc1.addif(cls.q1) + cls.q1_ip = cls.q1_ip_cidr.split('/')[0] + + cls.r1.add_peer(cls.q1, bridge=cls.brdc1.name) + cls.q1.add_peer(cls.r1, bridge=cls.brdc1.name) + + super(BgpSpeakerTestBase, cls).setUpClass() + + @classmethod + def tearDownClass(cls): + for ctn in cls.containers: + try: + ctn.stop() + except ctn_base.CommandError as e: + LOG.exception('Exception when stopping containers: %s', e) + ctn.remove() + for br in cls.bridges: + br.delete() + super(BgpSpeakerTestBase, cls).tearDownClass() diff --git a/tests/integrated/bgp/base_ip6.py b/tests/integrated/bgp/base_ip6.py new file mode 100644 index 00000000..8d3ef419 --- /dev/null +++ b/tests/integrated/bgp/base_ip6.py @@ -0,0 +1,84 @@ +# Copyright (C) 2016 Nippon Telegraph and Telephone Corporation. +# Copyright (C) 2016 Fumihiko Kakuma <kakuma at valinux co jp> +# +# 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. + +from __future__ import absolute_import + +import logging +import sys +import unittest + +from tests.integrated.common import docker_base as ctn_base +from tests.integrated.common import ryubgp +from tests.integrated.common import quagga + + +LOG = logging.getLogger(__name__) + + +class BgpSpeakerTestBase(unittest.TestCase): + images = [] + containers = [] + bridges = [] + checktime = 120 + + @classmethod + def setUpClass(cls): + cls.brdc1 = ctn_base.Bridge(name='brip6dc1', + subnet='2001:10::/32') + cls.bridges.append(cls.brdc1) + + cls.dockerimg = ctn_base.DockerImage() + image = 'python:%d.%d' % ( + sys.version_info.major, sys.version_info.minor) + cls.r_img = cls.dockerimg.create_ryu(image=image, check_exist=True) + cls.images.append(cls.r_img) + cls.q_img = 'osrg/quagga' + cls.images.append(cls.q_img) + + cls.r1 = ryubgp.RyuBGPContainer(name='r1', asn=64512, + router_id='192.168.0.1', + ctn_image_name=cls.r_img) + cls.containers.append(cls.r1) + cls.r1.add_route('fc00:10::/64', route_info={'rf': 'ipv6'}) + cls.r1.run(wait=True) + cls.r1_ip_cidr = cls.brdc1.addif(cls.r1) + cls.r1_ip = cls.r1_ip_cidr.split('/')[0] + + cls.q1 = quagga.QuaggaBGPContainer(name='q1', asn=64522, + router_id='192.168.0.2', + ctn_image_name=cls.q_img) + cls.containers.append(cls.q1) + cls.q1.add_route('fc00:100::/64', route_info={'rf': 'ipv6'}) + cls.q1.run(wait=True) + cls.q1_ip_cidr = cls.brdc1.addif(cls.q1) + cls.q1_ip = cls.q1_ip_cidr.split('/')[0] + + cls.r1.add_peer(cls.q1, bridge=cls.brdc1.name, v6=True) + cls.q1.add_peer(cls.r1, bridge=cls.brdc1.name, v6=True) + + super(BgpSpeakerTestBase, cls).setUpClass() + + @classmethod + def tearDownClass(cls): + for ctn in cls.containers: + try: + ctn.stop() + except ctn_base.CommandError as e: + LOG.exception('Exception when stopping containers: %s', e) + ctn.remove() + for br in cls.bridges: + br.delete() + super(BgpSpeakerTestBase, cls).tearDownClass() diff --git a/tests/integrated/bgp/test_basic.py b/tests/integrated/bgp/test_basic.py new file mode 100644 index 00000000..9ef430c7 --- /dev/null +++ b/tests/integrated/bgp/test_basic.py @@ -0,0 +1,49 @@ +# Copyright (C) 2016 Nippon Telegraph and Telephone Corporation. +# Copyright (C) 2016 Fumihiko Kakuma <kakuma at valinux co jp> +# +# 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. + +from __future__ import absolute_import + +import time + +from tests.integrated.common import docker_base as ctn_base +from . import base + + +class BgpSpeakerBasicTest(base.BgpSpeakerTestBase): + def setUp(self): + super(BgpSpeakerBasicTest, self).setUp() + self.r1.stop_ryubgp(retry=True) + self.r1.start_ryubgp(retry=True) + + def test_check_neighbor_established(self): + neighbor_state = ctn_base.BGP_FSM_IDLE + for _ in range(0, self.checktime): + neighbor_state = self.q1.get_neighbor_state(self.r1) + if neighbor_state == ctn_base.BGP_FSM_ESTABLISHED: + break + time.sleep(1) + self.assertEqual(neighbor_state, ctn_base.BGP_FSM_ESTABLISHED) + + def test_check_rib_nexthop(self): + neighbor_state = ctn_base.BGP_FSM_IDLE + for _ in range(0, self.checktime): + neighbor_state = self.q1.get_neighbor_state(self.r1) + if neighbor_state == ctn_base.BGP_FSM_ESTABLISHED: + break + time.sleep(1) + self.assertEqual(neighbor_state, ctn_base.BGP_FSM_ESTABLISHED) + rib = self.q1.get_global_rib(prefix='10.10.0.0/28') + self.assertEqual(self.r1_ip, rib[0]['nexthop']) diff --git a/tests/integrated/bgp/test_ip6_basic.py b/tests/integrated/bgp/test_ip6_basic.py new file mode 100644 index 00000000..a92e4edb --- /dev/null +++ b/tests/integrated/bgp/test_ip6_basic.py @@ -0,0 +1,49 @@ +# Copyright (C) 2016 Nippon Telegraph and Telephone Corporation. +# Copyright (C) 2016 Fumihiko Kakuma <kakuma at valinux co jp> +# +# 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. + +from __future__ import absolute_import + +import time + +from tests.integrated.common import docker_base as ctn_base +from . import base_ip6 as base + + +class BgpSpeakerBasicTest(base.BgpSpeakerTestBase): + def setUp(self): + super(BgpSpeakerBasicTest, self).setUp() + self.r1.stop_ryubgp(retry=True) + self.r1.start_ryubgp(retry=True) + + def test_check_neighbor_established(self): + neighbor_state = ctn_base.BGP_FSM_IDLE + for _ in range(0, self.checktime): + neighbor_state = self.q1.get_neighbor_state(self.r1) + if neighbor_state == ctn_base.BGP_FSM_ESTABLISHED: + break + time.sleep(1) + self.assertEqual(neighbor_state, ctn_base.BGP_FSM_ESTABLISHED) + + def test_check_rib_nexthop(self): + neighbor_state = ctn_base.BGP_FSM_IDLE + for _ in range(0, self.checktime): + neighbor_state = self.q1.get_neighbor_state(self.r1) + if neighbor_state == ctn_base.BGP_FSM_ESTABLISHED: + break + time.sleep(1) + self.assertEqual(neighbor_state, ctn_base.BGP_FSM_ESTABLISHED) + rib = self.q1.get_global_rib(prefix='fc00:10::/64', rf='ipv6') + self.assertEqual(self.r1_ip, rib[0]['nexthop']) |