diff --git a/ansible/roles/test/files/ptftests/advanced-reboot.py b/ansible/roles/test/files/ptftests/advanced-reboot.py index c63a117d358..5e079ee8cea 100644 --- a/ansible/roles/test/files/ptftests/advanced-reboot.py +++ b/ansible/roles/test/files/ptftests/advanced-reboot.py @@ -1,5 +1,5 @@ # -#ptf --test-dir ptftests fast-reboot --qlen=1000 --platform remote -t 'verbose=True;dut_username="admin";dut_hostname="10.0.0.243";reboot_limit_in_seconds=30;portchannel_ports_file="/tmp/portchannel_interfaces.json";vlan_ports_file="/tmp/vlan_interfaces.json";ports_file="/tmp/ports.json";dut_mac="4c:76:25:f5:48:80";default_ip_range="192.168.0.0/16";vlan_ip_range="172.0.0.0/22";arista_vms="[\"10.0.0.200\",\"10.0.0.201\",\"10.0.0.202\",\"10.0.0.203\"]"' --platform-dir ptftests --disable-vxlan --disable-geneve --disable-erspan --disable-mpls --disable-nvgre +#ptf --test-dir ptftests fast-reboot --qlen=1000 --platform remote -t 'verbose=True;dut_username="admin";dut_hostname="10.0.0.243";reboot_limit_in_seconds=30;portchannel_ports_file="/tmp/portchannel_interfaces.json";vlan_ports_file="/tmp/vlan_interfaces.json";ports_file="/tmp/ports.json";dut_mac="4c:76:25:f5:48:80";vlan_ip_range="172.0.0.0/22";arista_vms="[\"10.0.0.200\",\"10.0.0.201\",\"10.0.0.202\",\"10.0.0.203\"]"' --platform-dir ptftests --disable-vxlan --disable-geneve --disable-erspan --disable-mpls --disable-nvgre # # # This test checks that DUT is able to make FastReboot procedure @@ -67,6 +67,7 @@ from arista import Arista import sad_path as sp +import fib class StateMachine(): def __init__(self, init_state='init'): @@ -133,9 +134,11 @@ def __init__(self): self.check_param('portchannel_ports_file', '', required=True) self.check_param('vlan_ports_file', '', required=True) self.check_param('ports_file', '', required=True) + self.check_param('fib_info', '', required=True) + self.check_param('dut_mac', '', required=True) self.check_param('dut_vlan_ip', '', required=True) - self.check_param('default_ip_range', '', required=True) + self.check_param('vlan_ip_range', '', required=True) self.check_param('lo_prefix', '10.1.0.32/32', required=False) self.check_param('lo_v6_prefix', 'fc00:1::/64', required=False) @@ -257,6 +260,22 @@ def check_param(self, param, default, required = False): raise Exception("Test parameter '%s' is required" % param) self.test_params[param] = default + def generate_ip_range_list_by_nexthop_portlist(self, nexthop_portlist): + ip_range_list = [] + for ip_range in self.fib.ipv4_ranges(): + if len( set(nexthop_portlist) & set(self.fib[ip_range.get_first_ip()].get_next_hop_list())) > 0 : + ip_range_list.append(ip_range) + + if len(ip_range_list) < 1 : + raise Exception("Can't forward from server to T1 packet.Please check BGP setting") + + return ip_range_list + + + def generate_ip_addr_by_ip_range_list(self): + forward_ip_range = random.choice(self.ip_range_list) + return forward_ip_range.get_random_ip() + def random_ip(self, ip): net_addr, mask = ip.split('/') n_hosts = 2**(32 - int(mask)) @@ -480,8 +499,8 @@ def setUp(self): self.build_peer_mapping() self.test_params['vlan_if_port'] = self.build_vlan_if_port_mapping() + self.fib = fib.Fib(self.test_params['fib_info']) self.vlan_ip_range = self.test_params['vlan_ip_range'] - self.default_ip_range = self.test_params['default_ip_range'] self.limit = datetime.timedelta(seconds=self.test_params['reboot_limit_in_seconds']) self.reboot_type = self.test_params['reboot_type'] @@ -507,12 +526,13 @@ def setUp(self): self.vlan_host_map = self.generate_vlan_servers() arp_responder_conf = self.generate_arp_responder_conf(self.vlan_host_map) self.dump_arp_responder_config(arp_responder_conf) + self.ip_range_list = self.generate_ip_range_list_by_nexthop_portlist(self.portchannel_ports) self.random_vlan = random.choice(self.vlan_ports) self.from_server_src_port = self.random_vlan self.from_server_src_addr = random.choice(self.vlan_host_map[self.random_vlan].keys()) - self.from_server_dst_addr = self.random_ip(self.test_params['default_ip_range']) self.from_server_dst_ports = self.portchannel_ports + self.from_server_dst_addr = self.generate_ip_addr_by_ip_range_list() self.log("Test params:") self.log("DUT ssh: %s@%s" % (self.test_params['dut_username'], self.test_params['dut_hostname'])) @@ -611,7 +631,7 @@ def generate_from_t1(self): # for each server host create a packet destinating server IP for counter, host_port in enumerate(self.vlan_host_map): - src_addr = self.random_ip(self.default_ip_range) + src_addr = self.generate_ip_addr_by_ip_range_list() src_port = self.random_port(self.portchannel_ports) for server_ip in self.vlan_host_map[host_port]: diff --git a/ansible/roles/test/tasks/ptf_runner_reboot.yml b/ansible/roles/test/tasks/ptf_runner_reboot.yml index f614eb1dffa..3f36a281092 100644 --- a/ansible/roles/test/tasks/ptf_runner_reboot.yml +++ b/ansible/roles/test/tasks/ptf_runner_reboot.yml @@ -41,6 +41,18 @@ vars: supervisor_host: "{{ ptf_host }}" + - include_vars: "vars/topo_{{testbed_type}}.yml" + + - name: Expand properties into props + set_fact: props="{{configuration_properties['common']}}" + when: testbed_type in ['t0', 't0-56', 't0-64', 't0-116', 't0-64-32'] + + # Generate route file + - name: Generate route-port map information + template: src=roles/test/templates/fib.j2 + dest=/root/fib_info.txt + delegate_to: "{{ptf_host}}" + - include_tasks: ptf_runner.yml vars: ptf_test_name: Advanced-reboot test @@ -59,9 +71,9 @@ - portchannel_ports_file=\"/tmp/portchannel_interfaces.json\" - vlan_ports_file=\"/tmp/vlan_interfaces.json\" - ports_file=\"/tmp/ports.json\" + - fib_info=\"/root/fib_info.txt\" - dut_mac='{{ dut_mac }}' - dut_vlan_ip='192.168.0.1' - - default_ip_range='192.168.100.0/18' - vlan_ip_range='{{ vlan_ip_range }}' - lo_v6_prefix='{{ lo_v6_prefix }}' - arista_vms=\"['{{ vm_hosts | list | join("','") }}']\" diff --git a/ansible/roles/test/templates/fib.j2 b/ansible/roles/test/templates/fib.j2 index fbe348d4aa7..65ee758d46a 100644 --- a/ansible/roles/test/templates/fib.j2 +++ b/ansible/roles/test/templates/fib.j2 @@ -6,7 +6,7 @@ ::/0 {% for ifname, v in minigraph_neighbors.iteritems() %} {% if "T2" in v.name %}{{ '[%d]' % minigraph_port_indices[ifname]}}{% if not loop.last %} {% endif %}{% endif %}{% endfor %} -{% elif testbed_type == 't0' or testbed_type == 't0-52'or testbed_type == 't0-64' or testbed_type == 't1-lag' or testbed_type == 't0-64-32' %} +{% elif testbed_type == 't0'or testbed_type == 't0-16' or testbed_type == 't0-52' or testbed_type == 't0-56' or testbed_type == 't0-64' or testbed_type == 't1-lag' or testbed_type == 't0-64-32' or testbed_type == 't0-116' %} 0.0.0.0/0 {% for portchannel, v in minigraph_portchannels.iteritems() %} [{% for member in v.members %}{{ '%d' % minigraph_port_indices[member]}}{% if not loop.last %} {% endif %}{% endfor %}]{% if not loop.last %} {% endif %}{% endfor %} @@ -16,9 +16,6 @@ {% elif (testbed_type == 't1-64-lag') or (testbed_type == 't1-64-lag-clet') %} 0.0.0.0/0 [0 1] [4 5] [16 17] [20 21] ::/0 [0 1] [4 5] [16 17] [20 21] -{% elif testbed_type == 't0-116' %} -0.0.0.0/0 [24 25] [26 27] [28 29] [30 31] -::/0 [24 25] [26 27] [28 29] [30 31] {% endif %} {#routes to uplink#} {#Limit the number of podsets and subnets to be covered to limit script execution time#} @@ -42,7 +39,7 @@ {% elif (testbed_type == 't1-64-lag') or (testbed_type == 't1-64-lag-clet') %} 192.168.{{ podset }}.{{ tor * 16 + subnet }}/32 [0 1] [4 5] [16 17] [20 21] 20C0:A8{{ '%02X' % podset }}:0:{{ '%02X' % (tor * 16 + subnet)}}::/64 [0 1] [4 5] [16 17] [20 21] -{% elif testbed_type == 't0' or testbed_type == 't0-52' or testbed_type == 't0-64' or testbed_type == 't0-64-32' %} +{% elif testbed_type == 't0' or testbed_type == 't0-16' or testbed_type == 't0-52' or testbed_type == 't0-56' or testbed_type == 't0-64' or testbed_type == 't0-64-32' or testbed_type == 't0-116' %} {% set suffix = ( (podset * props.tor_number * props.max_tor_subnet_number * props.tor_subnet_size) + (tor * props.max_tor_subnet_number * props.tor_subnet_size) + (subnet * props.tor_subnet_size) ) %} @@ -60,21 +57,6 @@ {{ '20%02x' % octet1 }}:{{ '%02X%02X' % (octet2, octet3) }}:0:{{ '%02X' % octet4 }}::/64 {% for portchannel, v in minigraph_portchannels.iteritems() %} [{% for member in v.members %}{{ '%d' % minigraph_port_indices[member]}}{% if not loop.last %} {% endif %}{% endfor %}]{% if not loop.last %} {% endif %}{% endfor %} -{% endif %} -{% elif testbed_type == 't0-116' %} -{% set suffix = ( (podset * props.tor_number * props.max_tor_subnet_number * props.tor_subnet_size) + - (tor * props.max_tor_subnet_number * props.tor_subnet_size) + - (subnet * props.tor_subnet_size) ) %} -{% set octet2 = (168 + ((suffix // (256 ** 2)))) %} -{% set octet1 = (192 + (octet2 // 256)) %} -{% set octet2 = (octet2 % 256) %} -{% set octet3 = ((suffix // 256) % 256) %} -{% set octet4 = (suffix % 256) %} -{% set prefixlen_v4 = (32 - ((props.tor_subnet_size | log(2))) | int) %} -{# Skip 192.168.0.0 as it is in Vlan1000 subnet #} -{% if octet2 != 168 and octet3 != 0 and octet4 != 0 %} -{{ octet1 }}.{{ octet2 }}.{{ octet3 }}.{{ octet4 }}/{{ prefixlen_v4 }} [24 25] [26 27] [28 29] [30 31] -{{ '20%02x' % octet1 }}:{{ '%02X%02X' % (octet2, octet3) }}:0:{{ '%02X' % octet4 }}::/64 [24 25] [26 27] [28 29] [30 31] {% endif %} {% endif %} {% endfor %}