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))
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)
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}))
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}))
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))
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}))
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
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}))
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}))
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" })
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" })
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))
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))
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))
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" })
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))
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))
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))
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))
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" })
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))
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")
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")
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))
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()
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")