Exemplo n.º 1
0
 def test_isolation_1(self):
     f1 = Flow(3, "2")
     f2 = Flow(5, "4")
     fwg1 = FwGraph(6, 3, "2")
     fwg1.add_fw_rule(3, 1)
     fwg1.add_fw_rule(1, 2)
     fwg2 = FwGraph(6, 5, "4")
     fwg2.add_fw_rule(5, 4)
     fwgs = {f1: fwg1, f2: fwg2}
     p = IsolationProperty([f1, f2])
     self.assertTrue(p.check(fwgs))
Exemplo n.º 2
0
 def _parse_flow(data, name_resolver):
     """
     Helper method parsing the flow specified for a single-flow property.
     """
     src = name_resolver.id_for_node_name[data["flow"]["src"]]
     dst = data["flow"]["dst"]
     return Flow(src, dst)
Exemplo n.º 3
0
 def test_reachable_3(self):
     f = Flow(0, "X")
     fwg = FwGraph(5, 0, "X")
     fwg.add_fw_rule(0, 1)
     fwg.add_fw_rule(1, 3)
     fwg.add_fw_rule(3, -1)
     p = ReachableProperty(f)
     self.assertTrue(p.check({f: fwg}))
Exemplo n.º 4
0
 def test_egress(self):
     f = Flow(0, "X")
     fwg = FwGraph(4, 0, "X")
     fwg.add_fw_rule(0, 1)
     fwg.add_fw_rule(1, 2)
     fwg.add_fw_rule(2, -1)
     p = EgressProperty(f, 2)
     self.assertTrue(p.check({f: fwg}))
Exemplo n.º 5
0
 def test_waypoint_1(self):
     f = Flow(3, "2")
     fwg = FwGraph(6, 3, "2")
     fwg.add_fw_rule(3, 1)
     fwg.add_fw_rule(1, 2)
     fwg.add_fw_rule(2, 5)
     fwgs = {f: fwg}
     p = WaypointProperty(f, 1)
     self.assertTrue(p.check(fwgs))
Exemplo n.º 6
0
 def test_loop_2(self):
     f = Flow(0, "X")
     fwg = FwGraph(5, 0, "X")
     fwg.add_fw_rule(0, 1)
     fwg.add_fw_rule(1, 2)
     fwg.add_fw_rule(1, 3)
     fwg.add_fw_rule(3, -1)
     p = LoopProperty(f)
     self.assertFalse(p.check({f: fwg}))
Exemplo n.º 7
0
 def _parse_flows(data, name_resolver):
     """
     Helper method parsing the flow list specified for a multi-flow property.
     """
     flows = []
     for f_data in data["flows"]:
         src = name_resolver.id_for_node_name[f_data["src"]]
         dst = f_data["dst"]
         flows.append(Flow(src, dst))
     return flows
Exemplo n.º 8
0
 def test_loop(self):
     f = Flow(0, "X")
     fwg = FwGraph(5, 0, "X")
     fwg.add_fw_rule(0, 1)
     fwg.add_fw_rule(1, 2)
     fwg.add_fw_rule(2, 3)
     fwg.add_fw_rule(3, 4)
     fwg.add_fw_rule(3, 1)
     p = LoopProperty(f)
     self.assertTrue(p.check({f: fwg}))
Exemplo n.º 9
0
 def test_path_length_2(self):
     f = Flow(0, "X")
     fwg = FwGraph(5, 0, "X")
     fwg.add_fw_rule(0, 1)
     fwg.add_fw_rule(1, 3)
     fwg.add_fw_rule(3, -1)
     fwg.add_fw_rule(1, 2)
     fwg.add_fw_rule(2, -1)
     p = PathLengthProperty(f, 2)
     self.assertTrue(p.check({f: fwg}))
Exemplo n.º 10
0
    def test_invalid_announcements(self):
        flow = Flow(3, "XXX")
        ext_anns = {"XXX": {"W": {"lp": 3, "aspl": 0, "origin": 0, "med": 0}}}
        explorer = PaperExampleFwGraphsTest.get_explorer(ext_anns)
        next_hops = PaperExampleFwGraphsTest.compute_next_hops(flow, explorer)

        self.cmp_next_hops(next_hops["XXX"], {
            0: "R-5",
            1: "R-5",
            2: "R-5",
            3: "R-5",
            4: "R-5",
            5: "R-W"
        })
Exemplo n.º 11
0
    def test_no_announcements(self):
        flow = Flow(3, "XXX")
        ext_anns = {"XXX": {}}
        explorer = PaperExampleFwGraphsTest.get_explorer(ext_anns)
        next_hops = PaperExampleFwGraphsTest.compute_next_hops(flow, explorer)

        self.cmp_next_hops(next_hops["XXX"], {
            0: "None",
            1: "None",
            2: "None",
            3: "None",
            4: "None",
            5: "None"
        })
Exemplo n.º 12
0
    def test_static_route_fail_EC(self):
        flow = Flow(3, "XXX")
        ext_anns = {
            "XXX": {
                "X": {
                    "lp": 1,
                    "aspl": 5,
                    "origin": 0,
                    "med": 0
                },
                "Y": {
                    "lp": 2,
                    "aspl": 5,
                    "origin": 0,
                    "med": 0
                },
                "Z": {
                    "lp": 1,
                    "aspl": 5,
                    "origin": 0,
                    "med": 0
                },
                "W": {
                    "lp": 3,
                    "aspl": 5,
                    "origin": 0,
                    "med": 0
                }
            }
        }
        explorer = PaperExampleFwGraphsTest.get_explorer(
            ext_anns,
            static_routes=[StaticRoute("XXX", 4, 1),
                           StaticRoute("ABC", 1, 0)])
        PaperExampleFwGraphsTest.fail_link((4, 2), explorer)
        next_hops = PaperExampleFwGraphsTest.compute_next_hops(flow, explorer)
        fw_graph = PaperExampleFwGraphsTest.get_fw_graph(flow, explorer)

        self.cmp_next_hops(next_hops["XXX"], {
            0: "R-5",
            1: "R-5",
            2: "R-5",
            3: "R-5",
            4: "R-5",
            5: "R-W"
        })
        self.assertEqual(
            "[src: 3, dst: XXX, next: [[1], [2], [5], [0], [], [-1]]]",
            str(fw_graph))
Exemplo n.º 13
0
    def test_MED_do_comparison(self):
        flow = Flow(3, "XXX")
        ext_anns = {
            "XXX": {
                "X": {
                    "lp": 3,
                    "aspl": 5,
                    "origin": 0,
                    "med": 10
                },
                "Y": {
                    "lp": 2,
                    "aspl": 5,
                    "origin": 0,
                    "med": 0
                },
                "Z": {
                    "lp": 3,
                    "aspl": 5,
                    "origin": 0,
                    "med": 30
                },
                "W": {
                    "lp": 3,
                    "aspl": 5,
                    "origin": 0,
                    "med": 50
                }
            }
        }
        explorer = PaperExampleFwGraphsTest.get_explorer(ext_anns)
        # enforce MED comparison
        explorer.problem.bgp_config.ext_routers[
            0].as_id = explorer.problem.bgp_config.ext_routers[3].as_id
        next_hops = PaperExampleFwGraphsTest.compute_next_hops(flow, explorer)
        fw_graph = PaperExampleFwGraphsTest.get_fw_graph(flow, explorer)

        self.cmp_next_hops(next_hops["XXX"], {
            0: "R-X",
            1: "R-0",
            2: "R-0",
            3: "R-0",
            4: "R-0",
            5: "R-0"
        })
        self.assertEqual(
            "[src: 3, dst: XXX, next: [[-1], [], [], [0], [], []]]",
            str(fw_graph))
Exemplo n.º 14
0
    def test_fail_BC_AD(self):
        flow = Flow(3, "XXX")
        ext_anns = {
            "XXX": {
                "X": {
                    "lp": 3,
                    "aspl": 5,
                    "origin": 0,
                    "med": 0
                },
                "Y": {
                    "lp": 2,
                    "aspl": 5,
                    "origin": 0,
                    "med": 0
                },
                "Z": {
                    "lp": 1,
                    "aspl": 5,
                    "origin": 0,
                    "med": 0
                },
                "W": {
                    "lp": 3,
                    "aspl": 5,
                    "origin": 0,
                    "med": 0
                }
            }
        }
        explorer = PaperExampleFwGraphsTest.get_explorer(ext_anns)
        PaperExampleFwGraphsTest.fail_link((1, 2), explorer)
        PaperExampleFwGraphsTest.fail_link((3, 0), explorer)
        next_hops = PaperExampleFwGraphsTest.compute_next_hops(flow, explorer)
        fw_graph = PaperExampleFwGraphsTest.get_fw_graph(flow, explorer)

        self.cmp_next_hops(next_hops["XXX"], {
            0: "R-X",
            1: "R-0",
            2: "R-5",
            3: "R-0",
            4: "R-0",
            5: "R-W"
        })
        self.assertEqual(
            "[src: 3, dst: XXX, next: [[-1], [0], [], [4], [1], []]]",
            str(fw_graph))
Exemplo n.º 15
0
    def test_fullmesh_med_3(self):
        flow = Flow(3, "XXX")
        ext_anns = {
            "XXX": {
                "X": {
                    "lp": 0,
                    "aspl": 0,
                    "origin": 0,
                    "med": 30
                },
                "Y": {
                    "lp": 0,
                    "aspl": 0,
                    "origin": 0,
                    "med": 50
                },
                "Z": {
                    "lp": 0,
                    "aspl": 0,
                    "origin": 0,
                    "med": 50
                },
                "W": {
                    "lp": 0,
                    "aspl": 0,
                    "origin": 0,
                    "med": 30
                }
            }
        }
        explorer = PaperExampleFwGraphsTest.get_explorer(
            ext_anns, example="paper_example_full_mesh.json")
        # enforce MED comparison
        explorer.problem.bgp_config.ext_routers[
            0].as_id = explorer.problem.bgp_config.ext_routers[3].as_id

        # next hops
        next_hops = PaperExampleFwGraphsTest.compute_next_hops(flow, explorer)
        self.cmp_next_hops(next_hops["XXX"], {
            0: "R-X",
            1: "R-5",
            2: "R-5",
            3: "R-0",
            4: "R-Y",
            5: "R-W"
        })
Exemplo n.º 16
0
    def test_MED_skip_comparision(self):
        flow = Flow(3, "XXX")
        ext_anns = {
            "XXX": {
                "X": {
                    "lp": 3,
                    "aspl": 5,
                    "origin": 0,
                    "med": 10
                },
                "Y": {
                    "lp": 2,
                    "aspl": 5,
                    "origin": 0,
                    "med": 0
                },
                "Z": {
                    "lp": 3,
                    "aspl": 5,
                    "origin": 0,
                    "med": 30
                },
                "W": {
                    "lp": 3,
                    "aspl": 5,
                    "origin": 0,
                    "med": 50
                }
            }
        }
        explorer = PaperExampleFwGraphsTest.get_explorer(ext_anns)
        next_hops = PaperExampleFwGraphsTest.compute_next_hops(flow, explorer)
        fw_graph = PaperExampleFwGraphsTest.get_fw_graph(flow, explorer)

        self.cmp_next_hops(next_hops["XXX"], {
            0: "R-X",
            1: "R-5",
            2: "R-5",
            3: "R-5",
            4: "R-5",
            5: "R-Z"
        })
        self.assertEqual(
            "[src: 3, dst: XXX, next: [[], [], [5], [4], [2], [-1]]]",
            str(fw_graph))
Exemplo n.º 17
0
 def test_balanced(self):
     f = Flow(0, "6")
     fwg = FwGraph(7, 0, "6")
     fwg.add_fw_rule(0, 1)
     fwg.add_fw_rule(1, 3)
     fwg.add_fw_rule(1, 2)
     fwg.add_fw_rule(3, 4)
     fwg.add_fw_rule(3, 5)
     fwg.add_fw_rule(2, 5)
     fwg.add_fw_rule(4, 6)
     fwg.add_fw_rule(5, 6)
     fwgs = {f: fwg}
     self.assertFalse(
         BalancedProperty([f], [1.0], [(4, 6), (1, 2)], 0.2).check(fwgs))
     self.assertTrue(
         BalancedProperty([f], [1.0], [(4, 6), (1, 5)], 0.25).check(fwgs))
     self.assertTrue(
         BalancedProperty([f], [1.0], [(1, 3), (2, 5)], 0.0).check(fwgs))
Exemplo n.º 18
0
 def test_congestion(self):
     f = Flow(0, "6")
     fwg = FwGraph(7, 0, "6")
     fwg.add_fw_rule(0, 1)
     fwg.add_fw_rule(1, 3)
     fwg.add_fw_rule(1, 2)
     fwg.add_fw_rule(3, 4)
     fwg.add_fw_rule(3, 5)
     fwg.add_fw_rule(2, 5)
     fwg.add_fw_rule(4, 6)
     fwg.add_fw_rule(5, 6)
     fwgs = {f: fwg}
     p = CongestionProperty([f], [1.0], (4, 6), 0.25)
     link_load = p._get_load_for_links(fwgs)
     self.assertEqual(link_load[(1, 3)], 0.5)
     self.assertEqual(link_load[(3, 4)], 0.25)
     self.assertEqual(link_load[(5, 6)], 0.75)
     self.assertTrue(p.check(fwgs))
Exemplo n.º 19
0
    def test_ecmp(self):
        flow = Flow(4, "XYZ")
        explorer = Explorer(
            InputParser(get_test_input_file("ecmp.json")).get_problems()[0])
        next_hops = PaperExampleFwGraphsTest.compute_next_hops(flow, explorer)
        fw_graph = PaperExampleFwGraphsTest.get_fw_graph(flow, explorer)

        self.cmp_next_hops(next_hops["XYZ"], {
            0: "R-ext_0",
            1: "R-0",
            2: "R-0",
            3: "R-0",
            4: "R-0",
            5: "R-0"
        })
        self.assertEqual(
            "[src: 4, dst: XYZ, next: [[-1], [2], [0], [1, 5], [3], [2]]]",
            str(fw_graph))
Exemplo n.º 20
0
    def test_fullmesh_med_1(self):
        flow = Flow(3, "XXX")
        ext_anns = {
            "XXX": {
                "X": {
                    "lp": 0,
                    "aspl": 0,
                    "origin": 0,
                    "med": 10
                },
                "Y": {
                    "lp": 0,
                    "aspl": 0,
                    "origin": 0,
                    "med": 50
                },
                "Z": {
                    "lp": 0,
                    "aspl": 0,
                    "origin": 0,
                    "med": 50
                },
                "W": {
                    "lp": 0,
                    "aspl": 0,
                    "origin": 0,
                    "med": 30
                }
            }
        }
        explorer = PaperExampleFwGraphsTest.get_explorer(
            ext_anns, example="paper_example_full_mesh.json")

        # next hops
        next_hops = PaperExampleFwGraphsTest.compute_next_hops(flow, explorer)
        self.cmp_next_hops(next_hops["XXX"], {
            0: "R-X",
            1: "R-5",
            2: "R-5",
            3: "R-0",
            4: "R-Y",
            5: "R-W"
        })
Exemplo n.º 21
0
    def test_asymmetric_2(self):
        flow = Flow(0, "XYZ")
        explorer = Explorer(
            InputParser(
                get_test_input_file("asymmetric_alt.json")).get_problems()[0])
        next_hops = PaperExampleFwGraphsTest.compute_next_hops(flow, explorer)
        fw_graph = PaperExampleFwGraphsTest.get_fw_graph(flow, explorer)

        self.assertEqual(explorer._igp_provider.get_igp_cost(1, 4), 6)

        self.cmp_next_hops(next_hops["XYZ"], {
            0: "R-4",
            1: "R-4",
            2: "R-4",
            3: "R-4",
            4: "R-ext_4",
            5: "R-4"
        })
        self.assertEqual(
            "[src: 0, dst: XYZ, next: [[2], [], [5], [4], [-1], [3]]]",
            str(fw_graph))
Exemplo n.º 22
0
 def test_paper_example_static_route(self):
     problem = get_paper_problem()
     problem.property = WaypointProperty(Flow(1, "42.42.0.0/16"), 2)
     problem.static_routes = [StaticRoute("42.42.0.0/16", 1, 4)]
     self.compare_to_reference(problem, "paper_example_static_route.txt")
Exemplo n.º 23
0
 def test_paper_example_alt_flow_3(self):
     problem = get_paper_problem()
     problem.property = WaypointProperty(Flow(4, "42.42.0.0/16"), 3)
     self.compare_to_reference(problem, "paper_example_alt_flow_3.txt")
Exemplo n.º 24
0
    def test_fullmesh_flows(self):
        flow0 = Flow(0, "XXX")
        flow1 = Flow(1, "XXX")
        flow2 = Flow(2, "XXX")
        flow3 = Flow(3, "XXX")
        flow4 = Flow(4, "XXX")
        flow5 = Flow(5, "XXX")
        ext_anns = {
            "XXX": {
                "X": {
                    "lp": 0,
                    "aspl": 0,
                    "origin": 0,
                    "med": 0
                },
                "Y": {
                    "lp": 0,
                    "aspl": 0,
                    "origin": 0,
                    "med": 0
                },
                "Z": {
                    "lp": 0,
                    "aspl": 0,
                    "origin": 0,
                    "med": 0
                },
                "W": {
                    "lp": 0,
                    "aspl": 0,
                    "origin": 0,
                    "med": 0
                }
            }
        }
        explorer = PaperExampleFwGraphsTest.get_explorer(
            ext_anns, example="paper_example_full_mesh.json")

        # next hops (should go to closest egress)
        next_hops = PaperExampleFwGraphsTest.compute_next_hops(flow0, explorer)
        self.cmp_next_hops(next_hops["XXX"], {
            0: "R-X",
            1: "R-5",
            2: "R-5",
            3: "R-0",
            4: "R-Y",
            5: "R-Z"
        })

        # flow 0
        fw_graph = PaperExampleFwGraphsTest.get_fw_graph(flow0, explorer)
        self.assertEqual(
            "[src: 0, dst: XXX, next: [[-1], [], [], [], [], []]]",
            str(fw_graph))

        # flow 1
        fw_graph = PaperExampleFwGraphsTest.get_fw_graph(flow1, explorer)
        self.assertEqual(
            "[src: 1, dst: XXX, next: [[], [2], [5], [], [], [-1]]]",
            str(fw_graph))

        # flow 2
        fw_graph = PaperExampleFwGraphsTest.get_fw_graph(flow2, explorer)
        self.assertEqual(
            "[src: 2, dst: XXX, next: [[], [], [5], [], [], [-1]]]",
            str(fw_graph))

        # flow 3
        fw_graph = PaperExampleFwGraphsTest.get_fw_graph(flow3, explorer)
        self.assertEqual(
            "[src: 3, dst: XXX, next: [[-1], [], [], [0], [], []]]",
            str(fw_graph))

        # flow 4
        fw_graph = PaperExampleFwGraphsTest.get_fw_graph(flow4, explorer)
        self.assertEqual(
            "[src: 4, dst: XXX, next: [[], [], [], [], [-1], []]]",
            str(fw_graph))

        # flow 5
        fw_graph = PaperExampleFwGraphsTest.get_fw_graph(flow5, explorer)
        self.assertEqual(
            "[src: 5, dst: XXX, next: [[], [], [], [], [], [-1]]]",
            str(fw_graph))
Exemplo n.º 25
0
 def test_overview_example(self):
     flow = Flow(3, "XYZ")
     problem = InputParser(
         get_test_input_file("overview_example.json")).get_problems()[0]
     e = Explorer(problem)
     sol = e.explore_all()
Exemplo n.º 26
0
 def test_paper_example_multi_flow(self):
     problem = get_paper_problem()
     problem.property = IsolationProperty([Flow(1, "42.42.0.0/16"), Flow(4, "99.99.99.0/24")])
     self.compare_to_reference(problem, "paper_example_multi_flow.txt")