diff --git a/ansible/roles/test/files/ptftests/vnet_vxlan.py b/ansible/roles/test/files/ptftests/vnet_vxlan.py index a0dc0a264f6..7eaaff1801c 100644 --- a/ansible/roles/test/files/ptftests/vnet_vxlan.py +++ b/ansible/roles/test/files/ptftests/vnet_vxlan.py @@ -36,6 +36,8 @@ def __init__(self): self.vxlan_router_mac = '00:aa:bb:cc:78:9a' self.vxlan_port = 13330 self.DEFAULT_PKT_LEN = 100 + self.max_routes_wo_scaling = 1000 + self.vnet_batch = 8 def cmd(self, cmds): process = subprocess.Popen(cmds, @@ -82,8 +84,8 @@ def getSrvInfo(self, vnet, ifname=''): def checkPeer(self, test): for peers in self.peering: for key, peer in peers.items(): - ptest = dict(test) - if ptest['name'] == key: + if test['name'] == key: + ptest = dict(test) ptest['name'] = peer ptest['src'], ptest['port'], ptest['vlan'], ptest['vni'] = self.getSrvInfo(ptest['name']) if 'dst_vni' in test: @@ -93,13 +95,15 @@ def checkPeer(self, test): def checklocal(self, graph, test): for routes in graph['vnet_local_routes']: for name, rt_list in routes.items(): - for entry in rt_list: - nhtest = dict(test) - if nhtest['name'] == name.split('_')[0]: - nhtest['src'], nhtest['port'], nhtest['vlan'], nhtest['vni'] = self.getSrvInfo(nhtest['name'], entry['ifname']) - prefix = ip_network(unicode(entry['pfx'])) - nhtest['src'] = str(list(prefix.hosts())[0]) - self.tests.append(nhtest) + if test['name'] == name.split('_')[0]: + if self.total_routes <= self.max_routes_wo_scaling: + for entry in rt_list: + self.addLocalTest(test, entry) + else: + vnet_id = int(name.split('_')[0][4:]) + rt_idx = ((vnet_id-1)//4)%len(rt_list) + entry = rt_list[rt_idx] + self.addLocalTest(test, entry) def getPeerTest(self, test): peer_vnets = [] @@ -116,6 +120,43 @@ def getPeerTest(self, test): return peer_tests + def addTest(self, graph, name, entry): + test = {} + test['name'] = name.split('_')[0] + test['dst'] = entry['pfx'].split('/')[0] + test['host'] = entry['end'] + if 'mac' in entry: + test['mac'] = entry['mac'] + else: + test['mac'] = self.vxlan_router_mac + test['src'], test['port'], test['vlan'], test['vni'] = self.getSrvInfo(test['name']) + if 'vni' in entry: + test['dst_vni'] = entry['vni'] + self.tests.append(test) + self.checkPeer(test) + self.checklocal(graph, test) + + def addLocalTest(self, test, entry): + nhtest = dict(test) + nhtest['src'], nhtest['port'], nhtest['vlan'], nhtest['vni'] = self.getSrvInfo(nhtest['name'], entry['ifname']) + prefix = ip_network(unicode(entry['pfx'])) + nhtest['src'] = str(list(prefix.hosts())[0]) + self.tests.append(nhtest) + + def calculateTotalRoutes(self, graph): + self.total_routes = 0 + for routes in graph['vnet_routes']: + for name, rt_list in routes.items(): + self.total_routes += len(rt_list) + for peers in graph['vnet_peers']: + for key, peer in peers.items(): + if name.split('_')[0] == key: + self.total_routes += len(rt_list) + for l_routes in graph['vnet_local_routes']: + for l_name, l_rt_list in l_routes.items(): + if name == l_name: + self.total_routes += len(l_rt_list) + def setUp(self): self.dataplane = ptf.dataplane_instance @@ -162,11 +203,12 @@ def setUp(self): vni_base = 10000 self.serv_info = {} self.nbr_info = [] + acc_ports_size = len(self.acc_ports) for idx, data in enumerate(graph['vnet_interfaces']): if data['vnet'] not in self.serv_info: self.serv_info[data['vnet']] = [] serv_info = {} - ports = self.acc_ports[idx] + ports = self.acc_ports[idx % acc_ports_size] for nbr in graph['vnet_neighbors']: if nbr['ifname'] == data['ifname']: if 'Vlan' in data['ifname']: @@ -183,25 +225,24 @@ def setUp(self): self.serv_info[data['vnet']].extend([serv_info]) self.peering = graph['vnet_peers'] + self.calculateTotalRoutes(graph) self.tests = [] for routes in graph['vnet_routes']: for name, rt_list in routes.items(): - for entry in rt_list: - test = {} - test['name'] = name.split('_')[0] - test['dst'] = entry['pfx'].split('/')[0] - test['host'] = entry['end'] - if 'mac' in entry: - test['mac'] = entry['mac'] - else: - test['mac'] = self.vxlan_router_mac - test['src'], test['port'], test['vlan'], test['vni'] = self.getSrvInfo(test['name']) - if 'vni' in entry: - test['dst_vni'] = entry['vni'] - self.tests.append(test) - self.checkPeer(test) - self.checklocal(graph, test) + if self.total_routes <= self.max_routes_wo_scaling: + for entry in rt_list: + self.addTest(graph, name, entry) + else: + vnet_id = int(name.split('_')[0][4:]) + len_rt = len(rt_list) + group_8 = (vnet_id-1)//self.vnet_batch + rt_idx = (group_8//2)%len_rt + if group_8%2: + rt_idx = (len_rt-1)-rt_idx + + entry = rt_list[rt_idx] + self.addTest(graph, name, entry) self.dut_mac = graph['dut_mac'] diff --git a/ansible/roles/test/templates/vnet_config.j2 b/ansible/roles/test/templates/vnet_config.j2 index c1c2c37d4ce..7282fb42329 100644 --- a/ansible/roles/test/templates/vnet_config.j2 +++ b/ansible/roles/test/templates/vnet_config.j2 @@ -1,21 +1,101 @@ +#jinja2: trim_blocks: True,lstrip_blocks: True +{# + For normal functional test, no need to pass the below configurations. + num_vnet - Default 8. + num_routes - (including peer & local routes) + value 24 - if ipv6_vxlan_test == true + value 12 - if ipv6_vxlan_test == false + num_endpoints - Default 8 -{% set num_vnet = 8 %} -{% set vnet_v6_base = 5 %} + For Scale test, below configurations are to be passed. + num_vnet - Mandatory for scale test. + num_routes - Optional. Default 16000 for scale test. + num_endpoints - Optional. Default 4000 for scale test. + Ex: ansible playbook extra vars: -e "num_vnet=51 num_routes=550 num_endpoints=200" + + Ethernet IP - 10.10.10.1/24 + Vlan IP - A.B.10.1/24; starts 30.1.10.1/24 (A,B derived from vlan id starting 3001) + Route Pfx - A.B.C.D/32; starts 100.1.1.1/32 + (A,B derived from 100+vnet_id; C,D derived from number of routes per vnet) + Route endpoint - A.B.C.D; starts from 200.1.1.1 (C,D derived from number of endpoints) + +#} +{% set vnet_v6_base = 4 %} {% set vlan_id_base = 3001 %} + +{# A single vnet batch contains 8 Vnets #} +{% set num_vnet_batch = 8 %} +num_vnet_batch: {{ num_vnet_batch }} + +{# A single vnet batch has total 18 routes including peers if ipv6_vxlan_test == true. + There will be only 9 routes if ipv6_vxlan_test == false #} +{% if ipv6_vxlan_test == true %} + {% set num_routes_batch = 18 %} +{% else %} + {% set num_routes_batch = 9 %} +{% endif %} + +{# Normal testing - 8 Vnets #} +{% if num_vnet is undefined or not num_vnet %} + {% set num_vnet = 8 %} + {% set num_routes_iterations = 1 %} + {% set num_endpoints = 4000 %} +{% endif %} +{% set num_vnet = num_vnet|int %} + +{# Convert num_vnet to a divisible of 8 since one batch has 8 vnets #} +{% set num_vnet = ((num_vnet//num_vnet_batch)|int)*num_vnet_batch %} + +{% if num_vnet <= 8 %} + {% set num_vnet = 8 %} + {% set num_routes_iterations = 1 %} + {% set num_endpoints = 4000 %} +{% else %} + {# Scale testing - Determine the number of routes per each Vnet batch (8 Vnets) #} + {% if num_routes is undefined or not num_routes %} + {% set num_routes = 16000 %} + {% endif %} + {% if num_endpoints is undefined or not num_endpoints %} + {% set num_endpoints = 4000 %} + {% endif %} + {% set num_routes = num_routes|int %} + {% set num_endpoints = num_endpoints|int %} + {% set num_routes_iterations = ((num_routes/num_routes_batch)/(num_vnet/num_vnet_batch))|round|int %} + {% if num_routes_iterations == 0 %} {% set num_routes_iterations = 1 %} {% endif %} +{% endif %} {% set topo_vlan = minigraph_vlans.keys()[0] %} -{% set index = 10 %} + +{# Max RIFs support currently is 128 #} +{% if num_vnet > 128 %} + {% set max_rif = 128 %} +{% else %} + {% set max_rif = num_vnet %} +{% endif %} + +{# Vlan Configurations + Vlan IP - A.B.10.1/24; starts 30.1.10.1/24 (A,B derived from vlan id) +#} vlan_intf_list: +{% set ports = minigraph_vlans[topo_vlan].members[1:] %} {% for vlan in range (vlan_id_base, vlan_id_base + num_vnet) %} + {% set vlan_str = vlan|string %} + {% set ip_a, ip_b = vlan_str[:2]|int, vlan_str[2:]|int %} + {% if ip_b == 0 %} + {% set ip_a, ip_b = ip_a-1, 100 %} + {% endif %} - vlan_id: '{{ (vlan|int) }}' ifname: 'Vlan{{ vlan }}' - ip: '{{ loop.index }}.{{ loop.index }}.10.1/24' - port: '{{ minigraph_vlans[topo_vlan].members[loop.index] }}' + ip: '{{ ip_a }}.{{ ip_b }}.10.1/24' + port: '{{ ports[loop.index0%(ports|length)] }}' {% endfor %} +{# Interface Configuration #} intf_list: +{% set index = 10 %} - ifname: {{ minigraph_vlans[topo_vlan].members[0] }} ip: '{{ index }}.{{ index }}.10.1/24' +{# Vnet Configurations #} vnet_id_list: {% for vnet in range (1, 1 + num_vnet) %} - Vnet{{ vnet }} @@ -25,100 +105,170 @@ vnet_id_list: vnet_v6_base: {{ vnet_v6_base }} {% endif %} +{# Vnet - Peer Configurations #} vnet_peer_list: - - Vnet3: Vnet4 - - Vnet4: Vnet3 - - Vnet7: Vnet8 - - Vnet8: Vnet7 +{% for vnet_batch in range (1, 1 + max_rif)|batch(4) %} + - Vnet{{ vnet_batch[2] }}: Vnet{{ vnet_batch[3] }} + - Vnet{{ vnet_batch[3] }}: Vnet{{ vnet_batch[2] }} +{% endfor %} +{% if num_vnet > max_rif %} + {% set peering_vnets = num_vnet - max_rif %} + {% for vnet_id in range (max_rif + 1, num_vnet + 1) %} + {% set peer_vnet = (loop.index0 % max_rif) + 1 %} + - Vnet{{ vnet_id }}: Vnet{{ peer_vnet }} + - Vnet{{ peer_vnet }}: Vnet{{ vnet_id }} + {% endfor %} +{% endif %} +{# Vnet - Interface Configurations #} vnet_intf_list: -{% for vlan in range (vlan_id_base, vlan_id_base + num_vnet) %} +{% for vlan in range (vlan_id_base, vlan_id_base + max_rif) %} - ifname: Vlan{{ vlan }} vnet: Vnet{{ loop.index }} {% endfor %} +{# Vnet - Neighbor Configurations #} vnet_nbr_list: -{% for vlan in range (vlan_id_base, vlan_id_base + num_vnet) %} +{% for vlan_batch in range (vlan_id_base, vlan_id_base + num_vnet)|batch(4) %} + {% for vlan in vlan_batch %} + {% set vlan_str = vlan|string %} + {% set ip_a, ip_b = vlan_str[:2]|int, vlan_str[2:]|int %} + {% if ip_b == 0 %} + {% set ip_a, ip_b = ip_a-1, 100 %} + {% endif %} - ifname: Vlan{{ vlan }} - ip: '{{ loop.index }}.{{ loop.index }}.10.101' + ip: '{{ ip_a }}.{{ ip_b }}.10.101' + {% if (loop.index0 == 0) or (loop.index0 == 1) %} + - ifname: Vlan{{ vlan }} + ip: '{{ ip_a }}.{{ ip_b }}.10.102' + {% endif %} + {% endfor %} {% endfor %} - - ifname: Vlan3001 - ip: '1.1.10.102' - - ifname: Vlan3002 - ip: '2.2.10.102' - - ifname: Vlan3005 - ip: '5.5.10.102' - - ifname: Vlan3006 - ip: '6.6.10.102' - ifname: {{ minigraph_vlans[topo_vlan].members[0] }} ip: '10.10.10.102' +{# Vnet - Local Routes #} vnet_local_routes: - - Vnet1_route_list: - - pfx: '50.1.1.0/24' - nh: '1.1.10.101' - ifname: 'Vlan3001' - - pfx: '50.2.2.0/24' - nh: '1.1.10.102' - ifname: 'Vlan3001' - - Vnet2_route_list: - - pfx: '60.1.1.0/24' - nh: '2.2.10.101' - ifname: 'Vlan3002' - - Vnet5_route_list: +{% for vlan_batch in range (vlan_id_base, vlan_id_base + max_rif)|batch(4) %} + - Vnet{{ vlan_batch[0]-vlan_id_base+1 }}_route_list: + {% set vlan_str = vlan_batch[0]|string %} + {% set ip_a, ip_b = vlan_str[:2]|int, vlan_str[2:]|int %} + {% if ip_b == 0 %} + {% set ip_a, ip_b = ip_a-1, 100 %} + {% endif %} - pfx: '50.1.1.0/24' - nh: '5.5.10.101' - ifname: 'Vlan3005' + nh: '{{ ip_a }}.{{ ip_b }}.10.101' + ifname: 'Vlan{{ vlan_batch[0] }}' - pfx: '50.2.2.0/24' - nh: '5.5.10.102' - ifname: 'Vlan3005' - - Vnet6_route_list: + nh: '{{ ip_a }}.{{ ip_b }}.10.102' + ifname: 'Vlan{{ vlan_batch[0] }}' + - Vnet{{ vlan_batch[1]-vlan_id_base+1 }}_route_list: + {% set vlan_str = vlan_batch[1]|string %} + {% set ip_a, ip_b = vlan_str[:2]|int, vlan_str[2:]|int %} + {% if ip_b == 0 %} + {% set ip_a, ip_b = ip_a-1, 100 %} + {% endif %} - pfx: '60.1.1.0/24' - nh: '6.6.10.101' - ifname: 'Vlan3006' + nh: '{{ ip_a }}.{{ ip_b }}.10.101' + ifname: 'Vlan{{ vlan_batch[1] }}' +{% endfor %} +{# Vnet - Routes + Route Pfx - A.B.C.D/32; starts 100.1.1.1/32 + (A,B derived from 100+vnet_id; C,D derived from number of routes per vnet) + Route endpoint - A.B.C.D; starts from 200.1.1.1 (C,D derived from number of endpoints) +#} vnet_route_list: - - Vnet1_route_list: - - pfx: '1.1.1.10/32' - end: '100.1.1.10' - - pfx: '1.1.1.11/32' - end: '100.1.1.11' +{% set endpoints_iters = (num_endpoints//(num_routes_iterations*num_vnet_batch))|int %} +{% if endpoints_iters == 0 %} {% set endpoints_iters = 1 %} {% endif %} +{% for vnet_batch in range (1, 1 + num_vnet)|batch(8) %} + {% set endpoints_idx = (loop.index0%endpoints_iters)*num_routes_iterations*num_vnet_batch+1 %} + {% set ip_r_a, ip_r_b = (vnet_batch[0]//100)|int+100, (vnet_batch[0]%100)|int %} + {% if ip_r_b == 0 %} {% set ip_r_a, ip_r_b = ip_r_a-1, 100 %} {% endif %} + {% set ip_e_a, ip_e_b = ((endpoints_idx//100)|int)+1, (endpoints_idx%100)|int %} + {% if ip_e_b == 0 %} {% set ip_e_a, ip_e_b = ip_e_a-1, 100 %} {% endif %} + - Vnet{{ vnet_batch[0] }}_route_list: + {% for idx in range (num_routes_iterations) %} + {% set temp = loop.index0*2+1 %} + {% set idx_a, idx_b = ((temp//100)|int)+1, (temp%100)|int %} + - pfx: '{{ ip_r_a }}.{{ ip_r_b }}.{{ idx_a }}.{{ idx_b }}/32' + end: '200.1.{{ ip_e_a }}.{{ (loop.index0*2)+ip_e_b }}' + - pfx: '{{ ip_r_a }}.{{ ip_r_b }}.{{ idx_a }}.{{ idx_b+1 }}/32' + end: '200.1.{{ ip_e_a }}.{{ (loop.index0*2)+ip_e_b+1 }}' mac: '00:00:00:00:01:02' - - Vnet2_route_list: - - pfx: '2.2.2.10/32' - end: '100.1.1.20' + {% endfor %} + - Vnet{{ vnet_batch[1] }}_route_list: + {% for idx in range (num_routes_iterations) %} + {% set idx_a, idx_b = ((loop.index//100)|int)+1, (loop.index%100)|int %} + {% if idx_b == 0 %} + {% set idx_a, idx_b = idx_a-1, 100 %} + {% endif %} + - pfx: '{{ ip_r_a }}.{{ ip_r_b+1 }}.{{ idx_a }}.{{ idx_b }}/32' + end: '200.2.{{ ip_e_a }}.{{ loop.index0+ip_e_b }}' mac: '00:00:00:00:02:05' - - Vnet3_route_list: - - pfx: '1.1.1.10/32' - end: '100.1.1.10' + {% endfor %} + - Vnet{{ vnet_batch[2] }}_route_list: + {% for idx in range (num_routes_iterations) %} + {% set temp = loop.index0*2+1 %} + {% set idx_a, idx_b = ((temp//100)|int)+1, (temp%100)|int %} + - pfx: '{{ ip_r_a }}.{{ ip_r_b }}.{{ idx_a }}.{{ idx_b }}/32' + end: '200.1.{{ ip_e_a }}.{{ (loop.index0*2)+ip_e_b }}' vni: '12345' - - pfx: '1.1.1.11/32' - end: '100.1.1.11' + - pfx: '{{ ip_r_a }}.{{ ip_r_b }}.{{ idx_a }}.{{ idx_b+1 }}/32' + end: '200.1.{{ ip_e_a }}.{{ (loop.index0*2)+ip_e_b+1 }}' mac: '00:00:00:00:01:02' - - Vnet4_route_list: - - pfx: '4.4.4.10/32' - end: '100.1.1.40' + {% endfor %} + - Vnet{{ vnet_batch[3] }}_route_list: + {% for idx in range (num_routes_iterations) %} + {% set idx_a, idx_b = ((loop.index//100)|int)+1, (loop.index%100)|int %} + {% if idx_b == 0 %} + {% set idx_a, idx_b = idx_a-1, 100 %} + {% endif %} + - pfx: '{{ ip_r_a }}.{{ ip_r_b+3 }}.{{ idx_a }}.{{ idx_b }}/32' + end: '200.4.{{ ip_e_a }}.{{ loop.index0+ip_e_b }}' mac: '00:00:00:00:02:05' + {% endfor %} {% if ipv6_vxlan_test == true %} - - Vnet5_route_list: - - pfx: '1.1.1.10/32' - end: '2000:1::33' - - pfx: '1.1.1.11/32' - end: '2000:1::34' + - Vnet{{ vnet_batch[4] }}_route_list: + {% for idx in range (num_routes_iterations) %} + {% set temp = loop.index0*2+1 %} + {% set idx_a, idx_b = ((temp//100)|int)+1, (temp%100)|int %} + - pfx: '{{ ip_r_a }}.{{ ip_r_b }}.{{ idx_a }}.{{ idx_b }}/32' + end: 'FC00:1::{{ ip_e_a }}:{{ (loop.index0*2)+ip_e_b }}' + - pfx: '{{ ip_r_a }}.{{ ip_r_b }}.{{ idx_a }}.{{ idx_b+1 }}/32' + end: 'FC00:1::{{ ip_e_a }}:{{ (loop.index0*2)+ip_e_b+1 }}' mac: '00:00:00:00:01:02' - - Vnet6_route_list: - - pfx: '2.2.2.10/32' - end: '2000:1::35' + {% endfor %} + - Vnet{{ vnet_batch[5] }}_route_list: + {% for idx in range (num_routes_iterations) %} + {% set idx_a, idx_b = ((loop.index//100)|int)+1, (loop.index%100)|int %} + {% if idx_b == 0 %} + {% set idx_a, idx_b = idx_a-1, 100 %} + {% endif %} + - pfx: '{{ ip_r_a }}.{{ ip_r_b+1 }}.{{ idx_a }}.{{ idx_b }}/32' + end: 'FC00:2::{{ ip_e_a }}:{{ loop.index0+ip_e_b }}' mac: '00:00:00:00:02:05' - - Vnet7_route_list: - - pfx: '1.1.1.10/32' - end: '2000:1::33' + {% endfor %} + - Vnet{{ vnet_batch[6] }}_route_list: + {% for idx in range (num_routes_iterations) %} + {% set temp = loop.index0*2+1 %} + {% set idx_a, idx_b = ((temp//100)|int)+1, (temp%100)|int %} + - pfx: '{{ ip_r_a }}.{{ ip_r_b }}.{{ idx_a }}.{{ idx_b }}/32' + end: 'FC00:1::{{ ip_e_a }}:{{ (loop.index0*2)+ip_e_b }}' vni: '12345' - - pfx: '1.1.1.11/32' - end: '2000:1::34' + - pfx: '{{ ip_r_a }}.{{ ip_r_b }}.{{ idx_a }}.{{ idx_b+1 }}/32' + end: 'FC00:1::{{ ip_e_a }}:{{ (loop.index0*2)+ip_e_b+1 }}' mac: '00:00:00:00:01:02' - - Vnet8_route_list: - - pfx: '4.4.4.10/32' - end: 'FC00:1::36' + {% endfor %} + - Vnet{{ vnet_batch[7] }}_route_list: + {% for idx in range (num_routes_iterations) %} + {% set idx_a, idx_b = ((loop.index//100)|int)+1, (loop.index%100)|int %} + {% if idx_b == 0 %} + {% set idx_a, idx_b = idx_a-1, 100 %} + {% endif %} + - pfx: '{{ ip_r_a }}.{{ ip_r_b+3 }}.{{ idx_a }}.{{ idx_b }}/32' + end: 'FC00:4::{{ ip_e_a }}:{{ loop.index0+ip_e_b }}' mac: '00:00:00:00:02:05' + {% endfor %} {% endif %} +{% endfor %} diff --git a/ansible/roles/test/templates/vnet_routes.j2 b/ansible/roles/test/templates/vnet_routes.j2 index 46c5db59352..004e445c880 100644 --- a/ansible/roles/test/templates/vnet_routes.j2 +++ b/ansible/roles/test/templates/vnet_routes.j2 @@ -77,11 +77,12 @@ {% set outloop = loop %} {% for vnet_intf in vnet_intf_list %} {% if vnet_intf.ifname == vlan_intf.ifname %} +{% set vlan_intf_ip = vlan_intf.ip[:-5] %} {% for peers in vnet_peer_list %} {% for key,peer in peers.items() %} {% if key == vnet_intf.vnet %} { - "VNET_ROUTE_TABLE:{{ peer }}:{{ outloop.index }}.{{ outloop.index }}.10.0/24": { + "VNET_ROUTE_TABLE:{{ peer }}:{{ vlan_intf_ip }}.0/24": { "ifname": "Vlan{{ vlan_intf.vlan_id }}" }, "OP": "{{ op }}" @@ -90,7 +91,7 @@ {% endfor %} {% endfor %} { - "VNET_ROUTE_TABLE:{{ vnet_intf.vnet }}:{{ outloop.index }}.{{ outloop.index }}.10.0/24": { + "VNET_ROUTE_TABLE:{{ vnet_intf.vnet }}:{{ vlan_intf_ip }}.0/24": { "ifname": "Vlan{{ vlan_intf.vlan_id }}" }, "OP": "{{ op }}" diff --git a/ansible/roles/test/templates/vnet_vxlan.j2 b/ansible/roles/test/templates/vnet_vxlan.j2 index c6082eb4bfd..4b53e430c4d 100644 --- a/ansible/roles/test/templates/vnet_vxlan.j2 +++ b/ansible/roles/test/templates/vnet_vxlan.j2 @@ -13,7 +13,7 @@ "VNET": { {% for vnet in vnet_id_list %} "{{ vnet }}": { -{% if (ipv6_vxlan_test == false) or (loop.index < vnet_v6_base) %} +{% if (ipv6_vxlan_test == false) or ((loop.index0%num_vnet_batch) < vnet_v6_base) %} "vxlan_tunnel": "tunnel_v4", {% else %} "vxlan_tunnel": "tunnel_v6",