]> git.puffer.fish Git - mirror/frr.git/commitdiff
tests: tests for bgpd listing on multiple addresses 7748/head
authorAdriano Marto Reis <adrianomarto@gmail.com>
Sun, 3 Jan 2021 05:02:29 +0000 (15:02 +1000)
committerAdriano Marto Reis <adrianomarto@gmail.com>
Mon, 11 Jan 2021 08:33:52 +0000 (08:33 +0000)
* Added a new topotest to test bgpd listening on multiple addresses.
* Updated the existing bgpd tests according to the parameter added to
bgp_master_init.

Signed-off-by: "Adriano Marto Reis" <adrianomarto@gmail.com>
tests/bgpd/test_aspath.c
tests/bgpd/test_capability.c
tests/bgpd/test_mp_attr.c
tests/bgpd/test_mpath.c
tests/bgpd/test_packet.c
tests/bgpd/test_peer_attr.c
tests/topotests/bgp_listen_on_multiple_addresses/bgp_listen_on_multiple_addresses.json [new file with mode: 0644]
tests/topotests/bgp_listen_on_multiple_addresses/test_bgp_listen_on_multiple_addresses.py [new file with mode: 0755]

index 439891b559da5935b1199d9ab18d8e08e94ca1d0..936ffaaad58d4ec96605e4955d147e51a0a74767 100644 (file)
@@ -1265,7 +1265,8 @@ int main(void)
 {
        int i = 0;
        qobj_init();
-       bgp_master_init(thread_master_create(NULL), BGP_SOCKET_SNDBUF_SIZE);
+       bgp_master_init(thread_master_create(NULL), BGP_SOCKET_SNDBUF_SIZE,
+                       list_new());
        master = bm->master;
        bgp_option_set(BGP_OPT_NO_LISTEN);
        bgp_attr_init();
index 1b3f90434bd56735df74df7a550b91dce3b24d96..153b83897d988b3ed11a76656e43b356a1e8959c 100644 (file)
@@ -912,7 +912,7 @@ int main(void)
 
        qobj_init();
        master = thread_master_create(NULL);
-       bgp_master_init(master, BGP_SOCKET_SNDBUF_SIZE);
+       bgp_master_init(master, BGP_SOCKET_SNDBUF_SIZE, list_new());
        vrf_init(NULL, NULL, NULL, NULL, NULL);
        bgp_option_set(BGP_OPT_NO_LISTEN);
 
index 7fabaad7fa659a9c0f146c4ef3f5d3e2055b718a..f51076091357f83cd4083a658d6a14959ff0eab3 100644 (file)
@@ -1086,7 +1086,7 @@ int main(void)
        cmd_init(0);
        bgp_vty_init();
        master = thread_master_create("test mp attr");
-       bgp_master_init(master, BGP_SOCKET_SNDBUF_SIZE);
+       bgp_master_init(master, BGP_SOCKET_SNDBUF_SIZE, list_new());
        vrf_init(NULL, NULL, NULL, NULL, NULL);
        bgp_option_set(BGP_OPT_NO_LISTEN);
        bgp_attr_init();
index 520c460f159096d71e1e43c268827300b9549c38..92efd4c3d612b3a0e9d61ff7526cf005303eb0be 100644 (file)
@@ -393,7 +393,7 @@ static int global_test_init(void)
        qobj_init();
        master = thread_master_create(NULL);
        zclient = zclient_new(master, &zclient_options_default);
-       bgp_master_init(master, BGP_SOCKET_SNDBUF_SIZE);
+       bgp_master_init(master, BGP_SOCKET_SNDBUF_SIZE, list_new());
        vrf_init(NULL, NULL, NULL, NULL, NULL);
        bgp_option_set(BGP_OPT_NO_LISTEN);
 
index d2c093fbea2487eb600904825db89ddf4767180a..db5918745d6d8943aa40e5542c8e066492d0fc21 100644 (file)
@@ -59,7 +59,7 @@ int main(int argc, char *argv[])
        qobj_init();
        bgp_attr_init();
        master = thread_master_create(NULL);
-       bgp_master_init(master, BGP_SOCKET_SNDBUF_SIZE);
+       bgp_master_init(master, BGP_SOCKET_SNDBUF_SIZE, list_new());
        vrf_init(NULL, NULL, NULL, NULL, NULL);
        bgp_option_set(BGP_OPT_NO_LISTEN);
 
index 0a15886c108858faf35d8bf1328c363e2bc59a8b..123d97bc9700eeadd8a195e3be0468e5a106dd66 100644 (file)
@@ -1399,7 +1399,7 @@ static void bgp_startup(void)
        master = thread_master_create(NULL);
        yang_init(true);
        nb_init(master, bgpd_yang_modules, array_size(bgpd_yang_modules), false);
-       bgp_master_init(master, BGP_SOCKET_SNDBUF_SIZE);
+       bgp_master_init(master, BGP_SOCKET_SNDBUF_SIZE, list_new());
        bgp_option_set(BGP_OPT_NO_LISTEN);
        vrf_init(NULL, NULL, NULL, NULL, NULL);
        frr_pthread_init();
diff --git a/tests/topotests/bgp_listen_on_multiple_addresses/bgp_listen_on_multiple_addresses.json b/tests/topotests/bgp_listen_on_multiple_addresses/bgp_listen_on_multiple_addresses.json
new file mode 100644 (file)
index 0000000..95de8cc
--- /dev/null
@@ -0,0 +1,154 @@
+{
+    "ipv4base": "10.0.0.0",
+    "ipv4mask": 24,
+    "ipv6base": "fd00::",
+    "ipv6mask": 64,
+    "link_ip_start": {
+        "ipv4": "10.0.0.0",
+        "v4mask": 24,
+        "ipv6": "fd00::",
+        "v6mask": 64
+    },
+    "lo_prefix": {
+        "ipv4": "1.0.",
+        "v4mask": 32,
+        "ipv6": "2001:DB8:F::",
+        "v6mask": 128
+    },
+    "routers": {
+        "r1": {
+            "links": {
+                "lo": {
+                    "ipv4": "auto",
+                    "ipv6": "auto",
+                    "type": "loopback"
+                },
+                "r2": {
+                    "ipv4": "auto",
+                    "ipv6": "auto"
+                }
+            },
+            "bgp": {
+                       "local_as": "1000",
+                       "address_family": {
+                           "ipv4": {
+                               "unicast": {
+                                   "neighbor": {
+                                       "r2": {
+                                           "dest_link": {
+                                               "r1": {}
+                                           }
+                                       }
+                                   }
+                               }
+                           }
+                       }
+                   }
+        },
+        "r2": {
+            "links": {
+                "lo": {
+                    "ipv4": "auto",
+                    "ipv6": "auto",
+                    "type": "loopback"
+                },
+                "r1": {
+                    "ipv4": "auto",
+                    "ipv6": "auto"
+                },
+                "r3": {
+                    "ipv4": "auto",
+                    "ipv6": "auto"
+                }
+            },
+            "bgp": {
+                "local_as": "2000",
+                "address_family": {
+                    "ipv4": {
+                        "unicast": {
+                            "neighbor": {
+                                "r1": {
+                                    "dest_link": {
+                                        "r2": {}
+                                    }
+                                },
+                                "r3": {
+                                    "dest_link": {
+                                        "r2": {}
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+           },
+        "r3": {
+            "links": {
+                "lo": {
+                    "ipv4": "auto",
+                    "ipv6": "auto",
+                    "type": "loopback"
+                },
+                "r2": {
+                    "ipv4": "auto",
+                    "ipv6": "auto"
+                },
+                "r4": {
+                    "ipv4": "auto",
+                    "ipv6": "auto"
+                }
+            },
+            "bgp": {
+                "local_as": "2000",
+                "address_family": {
+                    "ipv4": {
+                        "unicast": {
+                            "neighbor": {
+                                "r2": {
+                                    "dest_link": {
+                                        "r3": {}
+                                    }
+                                },
+                                "r4": {
+                                    "dest_link": {
+                                        "r3": {}
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        },
+        "r4": {
+            "links": {
+                "lo": {
+                    "ipv4": "auto",
+                    "ipv6": "auto",
+                    "type": "loopback"
+                },
+                "r3": {
+                    "ipv4": "auto",
+                    "ipv6": "auto"
+                }
+            },
+            "bgp": {
+                "local_as": "3000",
+                "address_family": {
+                    "ipv4": {
+                        "unicast": {
+                            "neighbor": {
+                                "r3": {
+                                    "dest_link": {
+                                        "r4": {}
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+}
diff --git a/tests/topotests/bgp_listen_on_multiple_addresses/test_bgp_listen_on_multiple_addresses.py b/tests/topotests/bgp_listen_on_multiple_addresses/test_bgp_listen_on_multiple_addresses.py
new file mode 100755 (executable)
index 0000000..d773e87
--- /dev/null
@@ -0,0 +1,160 @@
+#!/usr/bin/env python
+
+#
+# test_bgp_listen_on_multiple_addresses.py
+# Part of NetDEF Topology Tests
+#
+# Copyright (c) 2021 by Boeing Defence Australia
+# Adriano Marto Reis
+#
+# Permission to use, copy, modify, and/or distribute this software
+# for any purpose with or without fee is hereby granted, provided
+# that the above copyright notice and this permission notice appear
+# in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND NETDEF DISCLAIMS ALL WARRANTIES
+# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NETDEF BE LIABLE FOR
+# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY
+# DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+# WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
+# ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+# OF THIS SOFTWARE.
+#
+
+"""
+test_bgp_listen_on_multiple_addresses.py: Test BGP daemon listening for
+connections on multiple addresses.
+
+    +------+        +------+        +------+        +------+
+    |      |        |      |        |      |        |      |
+    |  r1  |--------|  r2  |--------|  r3  |--------|  r4  |
+    |      |        |      |        |      |        |      |
+    +------+        +------+        +------+        +------+
+
+  |            |                                |             |
+  |  AS 1000   |            AS 2000             |   AS 3000   |
+  |            |                                |             |
+  +------------+--------------------------------+-------------+
+"""
+
+import os
+import sys
+import json
+import pytest
+
+
+# Save the Current Working Directory to find configuration files.
+CWD = os.path.dirname(os.path.realpath(__file__))
+sys.path.append(os.path.join(CWD, "../"))
+
+from lib.topogen import Topogen, get_topogen
+from lib.topojson import build_topo_from_json, build_config_from_json
+from lib.common_config import start_topology
+from lib.topotest import router_json_cmp, run_and_expect
+from mininet.topo import Topo
+from functools import partial
+
+
+LISTEN_ADDRESSES = {
+    "r1": ["10.0.0.1"],
+    "r2": ["10.0.0.2", "10.0.1.1"],
+    "r3": ["10.0.1.2", "10.0.2.1"],
+    "r4": ["10.0.2.2"],
+}
+
+
+# Reads data from JSON File for topology and configuration creation.
+jsonFile = "{}/bgp_listen_on_multiple_addresses.json".format(CWD)
+try:
+    with open(jsonFile, "r") as topoJson:
+        topo = json.load(topoJson)
+except IOError:
+    assert False, "Could not read file {}".format(jsonFile)
+
+
+class TemplateTopo(Topo):
+    "Topology builder."
+
+    def build(self, *_args, **_opts):
+        "Defines the allocation and relationship between routers and switches."
+        tgen = get_topogen(self)
+        build_topo_from_json(tgen, topo)
+
+
+def setup_module(mod):
+    "Sets up the test environment."
+    tgen = Topogen(TemplateTopo, mod.__name__)
+
+    # Adds extra parameters to bgpd so they listen for connections on specific
+    # multiple addresses.
+    for router_name in tgen.routers().keys():
+        tgen.net[router_name].daemons_options["bgpd"] = "-l " + " -l ".join(
+            LISTEN_ADDRESSES[router_name]
+        )
+
+    start_topology(tgen)
+    build_config_from_json(tgen, topo)
+
+
+def teardown_module(_mod):
+    "Tears-down the test environment."
+    tgen = get_topogen()
+    tgen.stop_topology()
+
+
+def test_peering():
+    "Checks if the routers peer-up."
+    tgen = get_topogen()
+    if tgen.routers_have_failure():
+        pytest.skip(tgen.errors)
+
+    _bgp_converge_initial("r1", "10.0.0.2")
+    _bgp_converge_initial("r2", "10.0.0.1")
+    _bgp_converge_initial("r2", "10.0.1.2")
+    _bgp_converge_initial("r3", "10.0.1.1")
+    _bgp_converge_initial("r3", "10.0.2.2")
+    _bgp_converge_initial("r4", "10.0.2.1")
+
+
+def test_listening_address():
+    """
+    Checks if bgpd is only listening on the specified IP addresses.
+    """
+    tgen = get_topogen()
+    if tgen.routers_have_failure():
+        pytest.skip(tgen.errors)
+
+    for router in tgen.routers().values():
+        # bgpd must not be listening on the default address.
+        output = router.run("netstat -nlt4 | grep 0.0.0.0:179")
+        assert output == "", "{}: bpgd is listening on 0.0.0.0:179".format(router.name)
+
+        # bgpd must be listening on the specified addresses.
+        for address in LISTEN_ADDRESSES[router.name]:
+            output = router.run("netstat -nlt4 | grep {}:179".format(address))
+            assert output != "", "{}: bpgd is not listening on {}:179".format(
+                router.name, address
+            )
+
+
+def _bgp_converge_initial(router_name, peer_address, timeout=180):
+    """
+    Waits for the BGP connection between a given router and a given peer
+    (specified by its IP address) to be established. If the connection is
+    not established within a given timeout, then an exception is raised. 
+    """
+    tgen = get_topogen()
+    router = tgen.routers()[router_name]
+    expected = {"ipv4Unicast": {"peers": {peer_address: {"state": "Established"}}}}
+
+    test_func = partial(router_json_cmp, router, "show ip bgp summary json", expected)
+    _, result = run_and_expect(test_func, None, count=timeout, wait=1)
+    assert result is None, "{}: Failed to establish connection with {}".format(
+        router_name, peer_address
+    )
+
+
+if __name__ == "__main__":
+    args = ["-s"] + sys.argv[1:]
+    sys.exit(pytest.main(args))