def test_remove_default_route(): rib = Rib() default_route = RibRoute(default_prefix, S_SPF, default_next_hops) rib.put_route(default_route) first_disagg_route = RibRoute(first_negative_disagg_prefix, S_SPF, [], first_negative_disagg_next_hops) rib.put_route(first_disagg_route) subnet_disagg_route = RibRoute(subnet_disagg_prefix, S_SPF, [], subnet_negative_disagg_next_hops) rib.put_route(subnet_disagg_route) rib.del_route(default_prefix, S_SPF) # Test for default assert not rib.destinations.has_key(default_prefix) assert default_prefix not in rib.fib.routes assert default_prefix not in rib.fib.kernel.routes # Test for 10.0.0.0/16 assert rib.destinations.get(first_negative_disagg_prefix).parent_prefix_dest is None assert rib.destinations.get(first_negative_disagg_prefix).best_route.positive_next_hops == set() assert rib.destinations.get(first_negative_disagg_prefix).best_route.negative_next_hops == {'S1'} assert rib.destinations.get(first_negative_disagg_prefix).best_route.next_hops == set() assert rib.fib.routes[first_negative_disagg_prefix].next_hops == set() assert rib.fib.kernel.routes[first_negative_disagg_prefix] == "unreachable" # Test for 10.0.10.0/24 assert rib.destinations.get(subnet_disagg_prefix).best_route.positive_next_hops == set() assert rib.destinations.get(subnet_disagg_prefix).best_route.negative_next_hops == {'S2'} assert rib.destinations.get(subnet_disagg_prefix).best_route.next_hops == set() assert rib.fib.routes[subnet_disagg_prefix].next_hops == set() assert rib.fib.kernel.routes[subnet_disagg_prefix] == "unreachable"
def test_remove_default_next_hop(): rib = Rib() default_route = RibRoute(default_prefix, S_SPF, default_next_hops) rib.put_route(default_route) first_disagg_route = RibRoute(first_negative_disagg_prefix, S_SPF, [], first_negative_disagg_next_hops) rib.put_route(first_disagg_route) second_disagg_route = RibRoute(second_negative_disagg_prefix, S_SPF, [], second_negative_disagg_next_hops) rib.put_route(second_disagg_route) default_route_fail = RibRoute(default_prefix, S_SPF, ['S1', 'S3', 'S4']) rib.put_route(default_route_fail) # Test for default assert rib.destinations.get(default_prefix).best_route == default_route_fail assert rib.destinations.get(default_prefix).best_route.positive_next_hops == {'S1', 'S3', 'S4'} assert rib.destinations.get(default_prefix).best_route.negative_next_hops == set() assert rib.destinations.get(default_prefix).best_route.next_hops == {'S1', 'S3', 'S4'} assert rib.fib.routes[default_prefix].next_hops == default_route_fail.next_hops assert rib.fib.kernel.routes[default_prefix] == default_route_fail.next_hops # Test for 10.0.0.0/16 assert rib.destinations.get(first_negative_disagg_prefix).best_route.positive_next_hops == set() assert rib.destinations.get(first_negative_disagg_prefix).best_route.negative_next_hops == {'S1'} assert rib.destinations.get(first_negative_disagg_prefix).best_route.next_hops == {'S3', 'S4'} assert rib.fib.kernel.routes[first_negative_disagg_prefix] == first_disagg_route.next_hops # Test for 10.1.0.0/16 assert rib.destinations.get(second_negative_disagg_prefix).best_route.positive_next_hops == set() assert rib.destinations.get(second_negative_disagg_prefix).best_route.negative_next_hops == {'S4'} assert rib.destinations.get(second_negative_disagg_prefix).best_route.next_hops == {'S1', 'S3'} assert rib.fib.kernel.routes[second_negative_disagg_prefix] == second_disagg_route.next_hops
def test_prop_parent_pos_child_pos(): # Add a parent aggregate rioute and a child more specific route, each with only positive # next-hops. fib = Fib() rib = Rib(fib) # Install two routes into the RIB: rib.put_route("1.2.0.0/16", ["nh1", "nh2"]) # Parent aggregate route, positive nexthops rib.put_route("1.2.3.0/24", ["nh3", "nh4"]) # Child more specific route, positive nexthops # The RIB must contain the following routes: assert str(rib) == ("1.2.0.0/16 -> nh1, nh2\n" "1.2.3.0/24 -> nh3, nh4\n") # The FIB must contain the following routes: assert str(fib) == ("1.2.0.0/16 -> nh1, nh2\n" "1.2.3.0/24 -> nh3, nh4\n") # Delete the parent route from the RIB. rib.del_route("1.2.0.0/16") assert str(rib) == "1.2.3.0/24 -> nh3, nh4\n" # The corresponding route should be deleted from the FIB. assert str(fib) == "1.2.3.0/24 -> nh3, nh4\n" # Delete the child route from the RIB. rib.del_route("1.2.3.0/24") # The RIB must be empty. assert str(rib) == "" # The FIB must be empty. assert str(fib) == ""
def test_recover_default_next_hop_with_subnet_disagg(): rib = Rib() default_route = RibRoute(default_prefix, S_SPF, default_next_hops) rib.put_route(default_route) first_disagg_route = RibRoute(first_negative_disagg_prefix, S_SPF, [], first_negative_disagg_next_hops) rib.put_route(first_disagg_route) subnet_disagg_route = RibRoute(subnet_disagg_prefix, S_SPF, [], subnet_negative_disagg_next_hops) rib.put_route(subnet_disagg_route) default_route_fail = RibRoute(default_prefix, S_SPF, ['S1', 'S2', 'S4']) rib.put_route(default_route_fail) default_route_recover = RibRoute(default_prefix, S_SPF, ['S1', 'S2', 'S3', 'S4']) rib.put_route(default_route_recover) # Test for default assert rib.destinations.get(default_prefix).best_route == default_route_recover assert rib.destinations.get(default_prefix).best_route.positive_next_hops == {'S1', 'S2', 'S3', 'S4'} assert rib.destinations.get(default_prefix).best_route.negative_next_hops == set() assert rib.destinations.get(default_prefix).best_route.next_hops == {'S1', 'S2', 'S3', 'S4'} assert rib.fib.routes[default_prefix].next_hops == default_route_recover.next_hops assert rib.fib.kernel.routes[default_prefix] == default_route_recover.next_hops # Test for 10.0.0.0/16 assert rib.destinations.get(first_negative_disagg_prefix).best_route.positive_next_hops == set() assert rib.destinations.get(first_negative_disagg_prefix).best_route.negative_next_hops == {'S1'} assert rib.destinations.get(first_negative_disagg_prefix).best_route.next_hops == {'S2', 'S3', 'S4'} assert rib.fib.kernel.routes[first_negative_disagg_prefix] == first_disagg_route.next_hops # Test for 10.0.10.0/24 assert rib.destinations.get(subnet_disagg_prefix).best_route.positive_next_hops == set() assert rib.destinations.get(subnet_disagg_prefix).best_route.negative_next_hops == {'S2'} assert rib.destinations.get(subnet_disagg_prefix).best_route.next_hops == {'S3', 'S4'} assert rib.fib.kernel.routes[subnet_disagg_prefix] == subnet_disagg_route.next_hops
def test_add_subnet_disagg_to_first_negative_disagg(): rib = Rib() rib.add_route(default_prefix, default_next_hops) rib.add_route(first_negative_disagg_prefix, first_negative_disagg_next_hops, disagg_type=False) rib.add_route(subnet_disagg_prefix, subnet_disagg_next_hops, disagg_type=False) assert rib.destinations.get( first_negative_disagg_prefix)._positive_next_hops == set() assert rib.destinations.get(first_negative_disagg_prefix)._negative_next_hops == \ first_negative_disagg_next_hops assert rib.destinations.get(first_negative_disagg_prefix).get_next_hops == \ default_next_hops - first_negative_disagg_next_hops assert rib.fib.routes[first_negative_disagg_prefix] == \ default_next_hops - first_negative_disagg_next_hops # test for disaggregated subnet assert rib.destinations.get( subnet_disagg_prefix)._positive_next_hops == set() assert rib.destinations.get( subnet_disagg_prefix)._negative_next_hops == subnet_disagg_next_hops assert rib.destinations.get(subnet_disagg_prefix).get_next_hops == \ default_next_hops - first_negative_disagg_next_hops - subnet_disagg_next_hops assert rib.fib.routes[subnet_disagg_prefix] == \ default_next_hops - first_negative_disagg_next_hops - subnet_disagg_next_hops
def test_add_two_route_same_destination_with_subnet_and_remove_one(): rib = Rib() default_route = RibRoute(default_prefix, N_SPF, default_next_hops) rib.put_route(default_route) best_default_route = RibRoute(default_prefix, S_SPF, ["S1", "S2", "S3"]) rib.put_route(best_default_route) first_disagg_route = RibRoute(first_negative_disagg_prefix, S_SPF, [], first_negative_disagg_next_hops) rib.put_route(first_disagg_route) subnet_disagg_route = RibRoute(subnet_disagg_prefix, S_SPF, [], subnet_negative_disagg_next_hops) rib.put_route(subnet_disagg_route) rib.del_route(default_prefix, S_SPF) # Test for default assert rib.destinations.get(default_prefix).best_route == default_route assert rib.destinations.get(default_prefix).best_route.positive_next_hops == {'S1', 'S2', 'S3', 'S4'} assert rib.destinations.get(default_prefix).best_route.negative_next_hops == set() assert rib.destinations.get(default_prefix).best_route.next_hops == {'S1', 'S2', 'S3', 'S4'} assert rib.fib.routes[default_prefix].next_hops == default_route.next_hops assert rib.fib.kernel.routes[default_prefix] == default_route.next_hops # Test for 10.0.0.0/16 assert rib.destinations.get(first_negative_disagg_prefix).best_route == first_disagg_route assert rib.destinations.get(first_negative_disagg_prefix).best_route.positive_next_hops == set() assert rib.destinations.get(first_negative_disagg_prefix).best_route.negative_next_hops == {'S1'} assert rib.destinations.get(first_negative_disagg_prefix).best_route.next_hops == {'S2', 'S3', 'S4'} assert rib.fib.routes[first_negative_disagg_prefix].next_hops == first_disagg_route.next_hops assert rib.fib.kernel.routes[first_negative_disagg_prefix] == first_disagg_route.next_hops # Test for 10.0.10.0/24 assert rib.destinations.get(subnet_disagg_prefix).best_route == subnet_disagg_route assert rib.destinations.get(subnet_disagg_prefix).best_route.positive_next_hops == set() assert rib.destinations.get(subnet_disagg_prefix).best_route.negative_next_hops == {'S2'} assert rib.destinations.get(subnet_disagg_prefix).best_route.next_hops == {'S3', 'S4'} assert rib.fib.routes[subnet_disagg_prefix].next_hops == subnet_disagg_route.next_hops assert rib.fib.kernel.routes[subnet_disagg_prefix] == subnet_disagg_route.next_hops
def test_del_route(): fib = Fib() rib = Rib(fib) rib.put_route("4.0.0.0/8", ["nh1", "nh2"]) rib.put_route("5.5.0.0/16", ["nh3", "nh4"]) rib.del_route("4.0.0.0/8") rib.del_route("3.0.0.0/8") assert str(rib) == ("5.5.0.0/16 -> nh3, nh4\n")
def test_add_default_route(): rib = Rib() default_route = RibRoute(default_prefix, S_SPF, default_next_hops) rib.put_route(default_route) assert rib.destinations.get(default_prefix).best_route == default_route assert rib.destinations.get(default_prefix).best_route.next_hops == {'S1', 'S2', 'S3', 'S4'} assert rib.fib.routes[default_prefix].next_hops == default_route.next_hops assert rib.fib.kernel.routes[default_prefix] == default_route.next_hops
def test_add_default_route(): rib = Rib() rib.add_route(default_prefix, default_next_hops) assert rib.destinations.get( default_prefix)._positive_next_hops == default_next_hops assert rib.destinations.get(default_prefix)._negative_next_hops == set() assert rib.destinations.get( default_prefix).get_next_hops == default_next_hops assert rib.fib.routes[default_prefix] == default_next_hops
def test_neg_disagg_fib_unreachable(): rib = Rib() rib.add_route(default_prefix, default_next_hops) rib.add_route(unreachable_prefix, unreachable_next_hops, disagg_type=False) assert rib.destinations.get( unreachable_prefix)._positive_next_hops == set() assert rib.destinations.get( unreachable_prefix)._negative_next_hops == unreachable_next_hops assert rib.destinations.get(unreachable_prefix).get_next_hops == set() assert rib.fib.routes[unreachable_prefix] == "unreachable"
def test_put_route(): fib = Fib() rib = Rib(fib) rib.put_route("4.0.0.0/8", ["nh1", "nh2"]) rib.put_route("3.3.0.0/16", ["nh1", "nh3"], ["nh4", "nh2"]) rib.put_route("4.1.1.0/24", [], ["nh1"]) rib.put_route("4.0.0.0/8", ["nh1", "nh3"]) assert str(rib) == ("3.3.0.0/16 -> nh1, ~nh2, nh3, ~nh4\n" "4.0.0.0/8 -> nh1, nh3\n" "4.1.1.0/24 -> ~nh1\n")
def make_sta2000(): sta = Rib(3) sta.add_web(1.6, 5) sta.add_stiffener(1.8, 17, 17) sta.add_compression_flange(4, 18, 17) sta.add_tension_flange(5, 23, 25) sta.add_rivet_stiffener(3.96875) sta.add_rivet_flange(3.96875, 6, 1) calc_all(sta) print("sta2000 mass", sta.get_total_mass()) return sta
def test_pos_neg_disagg(): rib = Rib() default_route = RibRoute(default_prefix, S_SPF, default_next_hops) rib.put_route(default_route) leaf_route = RibRoute(leaf_prefix, S_SPF, leaf_prefix_positive_next_hops, leaf_prefix_negative_next_hops) rib.put_route(leaf_route) assert rib.destinations.get(leaf_prefix).best_route.positive_next_hops == {"M4"} assert rib.destinations.get(leaf_prefix).best_route.negative_next_hops == {"M3"} assert rib.destinations.get(leaf_prefix).best_route.next_hops == {"S4", "S3", "M4", "S2", "S1"} assert rib.fib.routes[leaf_prefix].next_hops == leaf_route.next_hops assert rib.fib.kernel.routes[leaf_prefix] == {"S4", "S3", "M4", "S2", "S1"}
def make_sta1500(): sta = Rib(2) sta.add_web(1.6, 5) sta.add_stiffener(1.8, 18, 18) sta.add_compression_flange(8, 34, 18) sta.add_tension_flange(8, 34, 25) sta.add_rivet_stiffener(3.96875) sta.add_rivet_flange(3.96875, 6, 2) calc_all(sta) print("sta1500 mass", sta.get_total_mass()) return sta
def test_neg_disagg_fib_unreachable(): rib = Rib() default_route = RibRoute(default_prefix, S_SPF, default_next_hops) rib.put_route(default_route) unreachable_route = RibRoute(unreachable_prefix, S_SPF, [], unreachable_negative_next_hops) rib.put_route(unreachable_route) assert rib.destinations.get(unreachable_prefix).best_route.positive_next_hops == set() assert rib.destinations.get(unreachable_prefix).best_route.negative_next_hops == {'S1', 'S2', 'S3', 'S4'} assert rib.destinations.get(unreachable_prefix).best_route.next_hops == set() assert rib.fib.routes[unreachable_prefix].next_hops == unreachable_route.next_hops assert rib.fib.kernel.routes[unreachable_prefix] == "unreachable"
def make_sta3500(): sta = Rib(6) sta.add_web(1.6, 3) sta.add_stiffener(1.8, 17, 10) sta.add_compression_flange(2.5, 18, 22) sta.add_tension_flange(2.5, 18, 22) sta.add_rivet_stiffener(3.96875) sta.add_rivet_flange(3.96875, 6, 1) calc_all(sta) print("sta3500 mass", sta.get_total_mass()) return sta
def make_sta1000(): sta = Rib(1) sta.add_web(1.6, 6) sta.add_stiffener(1.8, 22, 21) sta.add_compression_flange(8, 27, 20) sta.add_tension_flange(9, 30, 30) sta.add_rivet_stiffener(4.7625) sta.add_rivet_flange(3.175, 6, 2) calc_all(sta) print("sta1000 mass", sta.get_total_mass()) return sta
def make_sta4500(): sta = Rib(8) sta.add_web(1.6, 2) sta.add_stiffener(1.27, 13, 7) sta.add_compression_flange(1.0, 12, 14) sta.add_tension_flange(1.0, 12, 14) sta.add_rivet_stiffener(3.125) sta.add_rivet_flange(2.38125, 6, 1) calc_all(sta) print("sta4500 mass", sta.get_total_mass()) return sta
def test_get_repr(): fib = Fib() rib = Rib(fib) rib.put_route("2.0.0.0/8", ["nh1", "nh2"]) rib.put_route("2.2.2.0/24", ["nh1", "nh3"], ["nh4", "nh2"]) rib.put_route("1.1.1.1/32", [], ["nh1"]) rib.put_route("2.2.1.0/24", ["nh1", "nh3"]) assert str(rib) == ("1.1.1.1/32 -> ~nh1\n" "2.0.0.0/8 -> nh1, nh2\n" "2.2.1.0/24 -> nh1, nh3\n" "2.2.2.0/24 -> nh1, ~nh2, nh3, ~nh4\n")
def test_add_two_route_same_destination(): rib = Rib() default_route = RibRoute(default_prefix, N_SPF, default_next_hops) rib.put_route(default_route) best_default_route = RibRoute(default_prefix, S_SPF, ['S1']) rib.put_route(best_default_route) assert rib.destinations.get(default_prefix).best_route == best_default_route assert rib.destinations.get(default_prefix).best_route.positive_next_hops == {'S1'} assert rib.destinations.get(default_prefix).best_route.negative_next_hops == set() assert rib.destinations.get(default_prefix).best_route.next_hops == {'S1'} assert rib.fib.routes[default_prefix].next_hops == best_default_route.next_hops assert rib.fib.kernel.routes[default_prefix] == best_default_route.next_hops
def test_add_negative_disaggregation(): rib = Rib() default_route = RibRoute(default_prefix, S_SPF, default_next_hops) rib.put_route(default_route) neg_route = RibRoute(first_negative_disagg_prefix, S_SPF, [], first_negative_disagg_next_hops) rib.put_route(neg_route) assert rib.destinations.get(first_negative_disagg_prefix).best_route == neg_route assert rib.destinations.get(first_negative_disagg_prefix).best_route.positive_next_hops == set() assert rib.destinations.get(first_negative_disagg_prefix).best_route.negative_next_hops == {'S1'} assert rib.destinations.get(first_negative_disagg_prefix).best_route.next_hops == {'S2', 'S3', 'S4'} assert rib.fib.routes[first_negative_disagg_prefix].next_hops == neg_route.next_hops assert rib.fib.kernel.routes[first_negative_disagg_prefix] == neg_route.next_hops
def test_remove_superfluous_subnet(): rib = Rib() default_route = RibRoute(default_prefix, S_SPF, default_next_hops) rib.put_route(default_route) first_disagg_route = RibRoute(first_negative_disagg_prefix, S_SPF, [], first_negative_disagg_next_hops) rib.put_route(first_disagg_route) subnet_disagg_route = RibRoute(subnet_disagg_prefix, S_SPF, [], subnet_negative_disagg_next_hops) rib.put_route(subnet_disagg_route) rib.del_route(subnet_disagg_prefix, S_SPF) assert not rib.destinations.has_key(subnet_disagg_prefix) assert subnet_disagg_prefix not in rib.fib.routes assert subnet_disagg_prefix not in rib.fib.kernel.routes
def test_pos_neg_disagg_recursive(): rib = Rib() default_route = RibRoute(default_prefix, S_SPF, default_next_hops) rib.put_route(default_route) first_disagg_route = RibRoute(first_negative_disagg_prefix, S_SPF, [], first_negative_disagg_next_hops) rib.put_route(first_disagg_route) subnet_disagg_route = RibRoute(subnet_disagg_prefix, S_SPF, ["S1"], subnet_negative_disagg_next_hops) rib.put_route(subnet_disagg_route) assert rib.destinations.get(subnet_disagg_prefix).best_route.positive_next_hops == {"S1"} assert rib.destinations.get(subnet_disagg_prefix).best_route.negative_next_hops == {"S2"} assert rib.destinations.get(subnet_disagg_prefix).best_route.next_hops == {"S1", "S3", "S4"} assert rib.fib.routes[subnet_disagg_prefix].next_hops == subnet_disagg_route.next_hops assert rib.fib.kernel.routes[subnet_disagg_prefix] == {"S1", "S3", "S4"}
def test_remove_best_route(): rib = Rib() default_route = RibRoute(default_prefix, N_SPF, default_next_hops) rib.put_route(default_route) best_default_route = RibRoute(default_prefix, S_SPF, ['S1']) rib.put_route(best_default_route) rib.del_route(default_prefix, S_SPF) assert rib.destinations.get(default_prefix).best_route == default_route assert rib.destinations.get(default_prefix).best_route.positive_next_hops == {'S1', 'S2', 'S3', 'S4'} assert rib.destinations.get(default_prefix).best_route.negative_next_hops == set() assert rib.destinations.get(default_prefix).best_route.next_hops == {'S1', 'S2', 'S3', 'S4'} assert rib.fib.routes[default_prefix].next_hops == default_route.next_hops assert rib.fib.kernel.routes[default_prefix] == default_route.next_hops
def test_neg_disagg_fib_unreachable_recover(): rib = Rib() rib.add_route(default_prefix, default_next_hops) rib.add_route(unreachable_prefix, unreachable_next_hops, disagg_type=False) recovered_nodes = {"S3"} rib.delete_route(unreachable_prefix, recovered_nodes, disagg_type=False) assert rib.destinations.get( unreachable_prefix)._positive_next_hops == set() assert rib.destinations.get(unreachable_prefix)._negative_next_hops == \ unreachable_next_hops - recovered_nodes assert rib.destinations.get( unreachable_prefix).get_next_hops == recovered_nodes assert rib.fib.routes[unreachable_prefix] == recovered_nodes
def test_add_subnet_disagg_to_first_negative_disagg(): rib = Rib() default_route = RibRoute(default_prefix, S_SPF, default_next_hops) rib.put_route(default_route) first_disagg_route = RibRoute(first_negative_disagg_prefix, S_SPF, [], first_negative_disagg_next_hops) rib.put_route(first_disagg_route) subnet_disagg_route = RibRoute(subnet_disagg_prefix, S_SPF, [], subnet_negative_disagg_next_hops) rib.put_route(subnet_disagg_route) assert rib.destinations.get(subnet_disagg_prefix).best_route.positive_next_hops == set() assert rib.destinations.get(subnet_disagg_prefix).best_route.negative_next_hops == {'S2'} assert rib.destinations.get(subnet_disagg_prefix).best_route.next_hops == {'S3', 'S4'} assert rib.fib.routes[subnet_disagg_prefix].next_hops == subnet_disagg_route.next_hops assert rib.fib.kernel.routes[subnet_disagg_prefix] == subnet_disagg_route.next_hops
def test_pos_neg_disagg(): rib = Rib() rib.add_route(default_prefix, default_next_hops) rib.add_route(leaf_prefix, leaf_prefix_positive_next_hops) rib.add_route(leaf_prefix, leaf_prefix_negative_next_hops, disagg_type=False) assert rib.destinations.get( leaf_prefix)._positive_next_hops == leaf_prefix_positive_next_hops assert rib.destinations.get( leaf_prefix)._negative_next_hops == leaf_prefix_negative_next_hops assert rib.destinations.get( leaf_prefix).get_next_hops == leaf_prefix_positive_next_hops assert rib.fib.routes[leaf_prefix] == leaf_prefix_positive_next_hops
def test_add_negative_disaggregation(): rib = Rib() rib.add_route(default_prefix, default_next_hops) rib.add_route(first_negative_disagg_prefix, first_negative_disagg_next_hops, disagg_type=False) assert rib.destinations.get( first_negative_disagg_prefix)._positive_next_hops == set() assert rib.destinations.get(first_negative_disagg_prefix)._negative_next_hops == \ first_negative_disagg_next_hops assert rib.destinations.get(first_negative_disagg_prefix).get_next_hops == \ default_next_hops - first_negative_disagg_next_hops assert rib.fib.routes[first_negative_disagg_prefix] == \ default_next_hops - first_negative_disagg_next_hops
def test_prop_delete_nexthop_two_levels(): # Test slides 59 and 60 in Pascal's "negative disaggregation" presentation. # Delete a nexthop from a parent route, and check that the computed complementary nexthops in # the child route and the grandchild route. fib = Fib() rib = Rib(fib) # Install the following three routes into the RIB: rib.put_route("0.0.0.0/0", ["nh1", "nh2", "nh3", "nh4"]) # Parent default route rib.put_route("10.0.0.0/16", [], ["nh1"]) # Child, negative nexthop rib.put_route("10.0.10.0/24", [], ["nh2"]) # Grandchild, negative nexthop # The RIB must contain the following routes: assert str(rib) == ("0.0.0.0/0 -> nh1, nh2, nh3, nh4\n" "10.0.0.0/16 -> ~nh1\n" "10.0.10.0/24 -> ~nh2\n") # The FIB must contain the following routes: assert str(fib) == ("0.0.0.0/0 -> nh1, nh2, nh3, nh4\n" "10.0.0.0/16 -> nh2, nh3, nh4\n" "10.0.10.0/24 -> nh3, nh4\n") # Delete nexthop nh3 from the parent route 0.0.0.0/0 (by replacing the route with a new one # that has the reduced set of nexthops). rib.put_route("0.0.0.0/0", ["nh1", "nh2", "nh4"]) # The RIB must contain the following routes: assert str(rib) == ("0.0.0.0/0 -> nh1, nh2, nh4\n" # nh3 is gone "10.0.0.0/16 -> ~nh1\n" "10.0.10.0/24 -> ~nh2\n") # The FIB must contain the following routes: assert str(fib) == ("0.0.0.0/0 -> nh1, nh2, nh4\n" # nh3 is gone "10.0.0.0/16 -> nh2, nh4\n" # computed nh3 is gone "10.0.10.0/24 -> nh4\n") # computed nh3 is gone # Delete all routes from the RIB. rib.del_route("0.0.0.0/0") rib.del_route("10.0.0.0/16") rib.del_route("10.0.10.0/24") # The RIB must be empty. assert str(rib) == "" # The FIB must be empty. assert str(fib) == ""
def make_sta625(): sta = Rib(0) sta.add_web(2.03, 3) sta.add_stiffener(2.03, 16, 22) sta.add_compression_flange(7, 30, 25) sta.add_tension_flange(10, 30, 30) """ sta.add_compression_flange(7, 60, 25) sta.add_tension_flange(8, 60, 30) """ sta.add_rivet_stiffener(3.175) sta.add_rivet_flange(3.175, 6, 2) calc_all(sta) print("sta625 mass", sta.get_total_mass()) print("he ", sta.he) return sta