|
| 1 | +import time |
| 2 | +import json |
| 3 | +import pytest |
| 4 | + |
| 5 | +from swsscommon import swsscommon |
| 6 | + |
| 7 | +class TestIPv6LinkLocal(object): |
| 8 | + def setup_db(self, dvs): |
| 9 | + self.pdb = dvs.get_app_db() |
| 10 | + self.adb = dvs.get_asic_db() |
| 11 | + self.cdb = dvs.get_config_db() |
| 12 | + |
| 13 | + def set_admin_status(self, interface, status): |
| 14 | + self.cdb.update_entry("PORT", interface, {"admin_status": status}) |
| 15 | + |
| 16 | + def add_ip_address(self, interface, ip): |
| 17 | + self.cdb.create_entry("INTERFACE", interface + "|" + ip, {"NULL": "NULL"}) |
| 18 | + time.sleep(2) |
| 19 | + |
| 20 | + def remove_ip_address(self, interface, ip): |
| 21 | + self.cdb.delete_entry("INTERFACE", interface + "|" + ip) |
| 22 | + time.sleep(2) |
| 23 | + |
| 24 | + def create_ipv6_link_local_intf(self, interface): |
| 25 | + self.cdb.create_entry("INTERFACE", interface, {"ipv6_use_link_local_only": "enable"}) |
| 26 | + time.sleep(2) |
| 27 | + |
| 28 | + def remove_ipv6_link_local_intf(self, interface): |
| 29 | + self.cdb.delete_entry("INTERFACE", interface) |
| 30 | + time.sleep(2) |
| 31 | + |
| 32 | + def test_NeighborAddRemoveIpv6LinkLocal(self, dvs, testlog): |
| 33 | + self.setup_db(dvs) |
| 34 | + |
| 35 | + # create ipv6 link local intf |
| 36 | + self.create_ipv6_link_local_intf("Ethernet0") |
| 37 | + self.create_ipv6_link_local_intf("Ethernet4") |
| 38 | + |
| 39 | + # bring up interface |
| 40 | + self.set_admin_status("Ethernet0", "up") |
| 41 | + self.set_admin_status("Ethernet4", "up") |
| 42 | + |
| 43 | + # set ip address |
| 44 | + self.add_ip_address("Ethernet0", "2000::1/64") |
| 45 | + self.add_ip_address("Ethernet4", "2001::1/64") |
| 46 | + dvs.runcmd("sysctl -w net.ipv6.conf.all.forwarding=1") |
| 47 | + dvs.runcmd("sysctl -w net.ipv6.conf.default.forwarding=1") |
| 48 | + |
| 49 | + # set ip address and default route |
| 50 | + dvs.servers[0].runcmd("ip -6 address add 2000::2/64 dev eth0") |
| 51 | + dvs.servers[0].runcmd("ip -6 route add default via 2000::1") |
| 52 | + |
| 53 | + dvs.servers[1].runcmd("ip -6 address add 2001::2/64 dev eth0") |
| 54 | + dvs.servers[1].runcmd("ip -6 route add default via 2001::1") |
| 55 | + time.sleep(2) |
| 56 | + |
| 57 | + # get neighbor entry |
| 58 | + dvs.servers[0].runcmd("ping -6 -c 1 2001::2") |
| 59 | + time.sleep(2) |
| 60 | + |
| 61 | + # Neigh entries should contain Ipv6-link-local neighbors, should be 4 |
| 62 | + neigh_entries = self.pdb.get_keys("NEIGH_TABLE") |
| 63 | + assert (len(neigh_entries) == 4) |
| 64 | + |
| 65 | + found_entry = False |
| 66 | + for key in neigh_entries: |
| 67 | + if (key.find("Ethernet4:2001::2") or key.find("Ethernet0:2000::2")): |
| 68 | + found_entry = True |
| 69 | + |
| 70 | + assert found_entry |
| 71 | + |
| 72 | + # remove ip address |
| 73 | + self.remove_ip_address("Ethernet0", "2000::1/64") |
| 74 | + self.remove_ip_address("Ethernet4", "2001::1/64") |
| 75 | + |
| 76 | + # remove ipv6 link local intf |
| 77 | + self.remove_ipv6_link_local_intf("Ethernet0") |
| 78 | + self.remove_ipv6_link_local_intf("Ethernet4") |
| 79 | + |
| 80 | + # Neigh entries should not contain Ipv6-link-local neighbors, should be 2 |
| 81 | + neigh_after_entries = self.pdb.get_keys("NEIGH_TABLE") |
| 82 | + print(neigh_after_entries) |
| 83 | + assert (len(neigh_after_entries) == 2) |
| 84 | + |
| 85 | + found_existing_entry = False |
| 86 | + for key in neigh_entries: |
| 87 | + if (key.find("Ethernet4:2001::2") or key.find("Ethernet0:2000::2")): |
| 88 | + found_existing_entry = True |
| 89 | + |
| 90 | + assert found_existing_entry |
| 91 | + |
| 92 | + self.set_admin_status("Ethernet0", "down") |
| 93 | + self.set_admin_status("Ethernet4", "down") |
| 94 | + |
| 95 | + # remove ip address and default route |
| 96 | + dvs.servers[0].runcmd("ip -6 route del default dev eth0") |
| 97 | + dvs.servers[0].runcmd("ip -6 address del 2000::2/64 dev eth0") |
| 98 | + |
| 99 | + dvs.servers[1].runcmd("ip -6 route del default dev eth0") |
| 100 | + dvs.servers[1].runcmd("ip -6 address del 2001::2/64 dev eth0") |
| 101 | + |
| 102 | + dvs.runcmd("sysctl -w net.ipv6.conf.all.forwarding=0") |
| 103 | + dvs.runcmd("sysctl -w net.ipv6.conf.default.forwarding=0") |
| 104 | + |
| 105 | + neigh_entries = self.pdb.get_keys("NEIGH_TABLE") |
| 106 | + assert (len(neigh_entries) == 0) |
| 107 | + |
| 108 | +# Add Dummy always-pass test at end as workaroud |
| 109 | +# for issue when Flaky fail on final test it invokes module tear-down before retrying |
| 110 | +def test_nonflaky_dummy(): |
| 111 | + pass |
| 112 | + |
0 commit comments