Configure CaaS SR-IOV and provider networks
[ta/infra-ansible.git] / roles / baremetal_interface_config / templates / os_net_config.j2
1 {#
2 This file is written with conditional check and for loop based indentation.
3 It improved code readability. The output json is not pretty. Run cat <output.json> | python -m json.tool
4 for pretty printing the same.
5 #}
6
7 {%- set CLOUD_TENANT = 'cloud_tenant' %}
8 {%- set VXLAN_HDR_LEN = 50 %}
9
10 {#- initialize some variables -#}
11 {%- set host_networking = hostvars[ansible_hostname]['networking'] %}
12 {%- if 'mtu' in host_networking %}
13     {%- set default_mtu = host_networking['mtu'] %}
14 {%- else %}
15     {%- set default_mtu = 1500 %}
16 {%- endif %}
17 {%- set max_mtu = 9000 %}
18 {%- set host_network_profiles_list = hosts[ansible_hostname]['network_profiles'] %}
19 {%- set host_network_profile_value = hostvars[ansible_hostname]['network_profiles'][host_network_profiles_list[0]] %}
20 {%- set host_interface_net_mapping = host_network_profile_value['interface_net_mapping'] %}
21 {%- if 'bonding_interfaces' in host_network_profile_value %}
22     {%- set host_bonding_interfaces = host_network_profile_value['bonding_interfaces'] %}
23 {%- else %}
24     {%- set host_bonding_interfaces = {} %}
25 {%- endif %}
26 {%- set single_nic_setup = False %}
27 {%- if 'provider_network_interfaces' in host_network_profile_value %}
28     {%- set host_provider_network_interfaces = host_network_profile_value['provider_network_interfaces'] %}
29     {%- set dpdk_in_use = ((host_provider_network_interfaces.itervalues()|first).type == 'ovs-dpdk') %}
30
31     {%- if host_interface_net_mapping|length == 1 and host_provider_network_interfaces|length == 1 %}
32         {%- if host_interface_net_mapping.keys()[0] == host_provider_network_interfaces.keys()[0] %}
33             {%- set single_nic_setup = True %}
34             {%- if CLOUD_TENANT in host_networking.keys() and 'interface' in host_networking[CLOUD_TENANT] %}
35                 {%- set mtu = default_mtu %}
36                 {%- if 'mtu' in host_networking[CLOUD_TENANT] %}
37                     {%- set mtu = host_networking[CLOUD_TENANT]['mtu'] %}
38                 {%- endif %}
39                 {%- set mtu = mtu + VXLAN_HDR_LEN %}
40                 {%- if mtu > max_mtu %}
41                     {%- set max_mtu = mtu %}
42                 {%- endif %}
43             {%- endif %}
44         {%-endif %}
45     {%-endif %}
46
47     {#- make a list of ixgbe devices, needed in ovs-dpdk configuration -#}
48     {%- set ixgbedevs = [] %}
49     {%- for key in hostvars[ansible_hostname].keys() %}
50         {%- if key.startswith('ansible_') %}
51             {%- set value = hostvars[ansible_hostname][key] %}
52             {%- if value is iterable and 'device' in value and 'module' in value and value['module'] == 'ixgbe' %}
53                 {%- if ixgbedevs.append(value['device']) %}{%- endif %}
54             {%- endif %}
55         {%- endif %}
56     {%- endfor %}
57 {%- else %}
58     {%- set host_provider_network_interfaces = {} %}
59     {%- set dpdk_in_use = False %}
60 {%- endif %}
61 {%- set sriov_mtus = {} %}
62 {%- if 'sriov_provider_networks' in host_network_profile_value %}
63     {%- for net,iface_info in host_network_profile_value['sriov_provider_networks'].iteritems() %}
64         {%- for tmp,mtu_info in host_networking['provider_networks'].iteritems() if tmp == net %}
65             {%- if 'mtu' in mtu_info %}{% set mtu = mtu_info['mtu'] %}{% else %}{% set mtu = default_mtu %}{% endif %}
66             {%- for iface in iface_info['interfaces'] %}
67                 {%- if sriov_mtus.update({iface: mtu}) %}{%- endif %}
68             {%- endfor %}
69         {%- endfor %}
70     {%- endfor %}
71 {%- endif %}
72 {%- set external_ceph_cidr = None %}
73 {%- if config_phase != 'setup' and 'external_ceph' in storage['backends'] %}
74     {%- set ext_ceph = storage['backends']['external_ceph'] %}
75     {%- if 'enabled' in ext_ceph and 'cidr' in ext_ceph and ext_ceph['enabled'] %}
76         {%- set external_ceph_cidr = ext_ceph['cidr'] %}
77     {%- endif %}
78 {%- endif %}
79
80 {% macro generate_linux_bonding_options(options) -%}
81     {%- set mode_mapping = {'active-backup' : 'active-backup', 'lacp' : '802.3ad'} -%}
82     {%- set default_options = {
83                                 'active-backup' : 'miimon=100',
84                                 'lacp' : 'lacp_rate=fast miimon=100'
85                               } -%}
86     {%- for i in options.split() -%}
87         {%- set key, value = i.split('=') -%}
88         {%- if key == 'mode' -%}
89             {%- if default_options[value] -%}
90                 {{ 'mode=' ~ mode_mapping[value] ~ ' ' ~ default_options[value] }}
91             {%- else -%}
92                 {{ 'mode=' ~ mode_mapping[value] }}
93             {%- endif -%}
94         {%- endif -%}
95     {%- endfor -%}
96 {%- endmacro %}
97
98 {% macro generate_ovs_bonding_options(options) -%}
99     {%- set mode_mapping = {'active-backup' : 'active-backup', 'lacp' : 'balance-slb', 'lacp-layer34' : 'balance-tcp'} -%}
100     {%- set default_options = {
101                                 'active-backup' : '',
102                                 'lacp' : 'lacp=active other_config:lacp-time=fast other_config:bond-detect-mode=carrier',
103                                 'lacp-layer34' : 'lacp=active other_config:lacp-time=fast other_config:bond-detect-mode=carrier'
104                               } -%}
105     {%- for i in options.split() -%}
106         {%- set key, value = i.split('=') -%}
107         {%- if key == 'mode' -%}
108             {%- if default_options[value] -%}
109                 {{ 'bond_mode=' ~ mode_mapping[value] ~ ' ' ~ default_options[value] }}
110             {%- else -%}
111                 {{ 'bond_mode=' ~ mode_mapping[value] }}
112             {%- endif -%}
113         {%- endif -%}
114     {%- endfor -%}
115 {%- endmacro %}
116
117 {% macro add_static_routes(routes) -%}
118     [
119     {%- for route in routes %}
120         {
121             "ip_netmask": "{{ route.to }}", "next_hop": "{{ route.via }}"
122         } {% if not loop.last %},{% endif %}
123     {%- endfor %}
124     ]
125 {%- endmacro %}
126
127 {#- create network configuration input for the os-net-config -#}
128 {
129 "network_config": [
130 {%- set loopvar = {'first_entry': True} %}
131 {%- set configured_phys_ifaces = [] %}
132
133 {#- single nic ifra networks are configured with the ovs provider networks -#}
134 {%- if not single_nic_setup %}
135
136 {#-
137 If all infra ifaces on some phys iface are vlan ifaces then phys iface is configured here.
138 Otherwise it gets configured normally on infra iface configuration in the next loop.
139 -#}
140 {%- for iface,infras in host_interface_net_mapping.iteritems() %}
141     {%- set ifacevars = {'create': True, 'mtu': 0} %}
142     {%- for infra,value in host_networking.iteritems() %}
143         {%- if infra in infras %}
144             {%- if value['interface'] == iface %}
145                 {%- if ifacevars.update({'create': False}) %}{%- endif %}
146             {%- else %}
147                 {%- if 'mtu' in value %}
148                     {%- set mtu = value['mtu'] %}
149                 {%- else %}
150                     {%- set mtu = default_mtu %}
151                 {%- endif %}
152                 {%- if infra == CLOUD_TENANT %}
153                     {%- set mtu = mtu + VXLAN_HDR_LEN %}
154                 {%- endif %}
155                 {%- if mtu > ifacevars.mtu %}
156                     {%- if ifacevars.update({'mtu': mtu}) %}{%- endif %}
157                 {%- endif %}
158             {%- endif %}
159         {%- endif %}
160     {%- endfor %}
161     {%- if 'bond' in iface %}
162         {%- for key,slaves in host_bonding_interfaces.iteritems() if key == iface %}
163             {%- for slave in slaves %}
164                 {%- if slave in sriov_mtus and sriov_mtus[slave] > ifacevars.mtu %}
165                     {%- if ifacevars.update({'mtu': sriov_mtus[slave]}) %}{%- endif %}
166                 {%- endif %}
167             {%- endfor %}
168         {%- endfor %}
169     {%- else %}
170         {%- if iface in sriov_mtus and sriov_mtus[iface] > ifacevars.mtu %}
171             {%- if ifacevars.update({'mtu': sriov_mtus[iface]}) %}{%- endif %}
172         {%- endif %}
173     {%- endif %}
174     {%- if ifacevars.create %}
175         {%- if not loopvar.first_entry %},{%- endif %}
176         {%- if loopvar.update({'first_entry': False}) %}{%- endif %}
177         {
178             "name": "{{iface}}",
179             {%- if 'bond' in iface %}
180                 {%- for key,slaves in host_bonding_interfaces.iteritems() if key == iface %}
181                     "type": "linux_bond",
182                     "mtu": {{ifacevars['mtu']}},
183                     {%- if 'linux_bonding_options' in  host_network_profile_value %}
184                         "bonding_options": "{{ generate_linux_bonding_options(host_network_profile_value['linux_bonding_options']) }}",
185                     {%- endif %}
186                     "members": [ {% for slave in slaves %}
187                         {%- if configured_phys_ifaces.append(slave) %}{%- endif %}
188                         {
189                         "name": "{{slave}}",
190                         "type": "interface",
191                         "mtu": {{ifacevars['mtu']}},
192                         "use_dhcp": false
193                         }
194                         {% if not loop.last %},{% endif %}
195                     {%- endfor %}
196                     ],
197                 {%- endfor %}
198             {%- else %}
199                 {%- if configured_phys_ifaces.append(iface) %}{%- endif %}
200                 "type": "interface",
201             {%- endif %}
202             "mtu": {{ifacevars['mtu']}},
203             "use_dhcp": false
204         }
205     {%- endif %}
206 {%- endfor %}
207
208 {#- configure all infra ifaces (except cloud_tenant if ovs-dpdk in use) -#}
209 {%- for key,value in host_networking.iteritems() %}
210     {%- if value is iterable and 'interface' in value %}
211         {%- if key != CLOUD_TENANT or not dpdk_in_use %}{#- no dpdk or no cloud tenant -#}
212         {%- if 'mtu' in value %}{% set mtu = value['mtu'] %}{% else %}{% set mtu = default_mtu %}{% endif %}
213         {%- if key == CLOUD_TENANT %}{% set mtu = mtu + VXLAN_HDR_LEN %}{% endif %}
214         {%- if not loopvar.first_entry %},{%- endif %}
215         {%- if loopvar.update({'first_entry': False}) %}{%- endif %}
216         {
217         {%- if 'bond' in value['interface'] %}
218             {%- for bond_key,bond_value in host_bonding_interfaces.iteritems() if bond_key == value['interface'] %}
219                 "name": "{{bond_key}}",
220                 "type": "linux_bond",
221                 "members": [ {% for member in bond_value %}
222                     {%- if configured_phys_ifaces.append(member) %}{%- endif %}
223                     {
224                     "name": "{{ member }}",
225                     "type": "interface",
226                     "mtu": {{mtu}},
227                     "use_dhcp": false
228                     }
229                     {% if not loop.last %},{% endif %}
230                 {%- endfor %}
231                 ],
232                 {%- if 'linux_bonding_options' in  host_network_profile_value %}
233                     "bonding_options": "{{ generate_linux_bonding_options(host_network_profile_value['linux_bonding_options']) }}",
234                 {%- endif %}
235             {%- endfor %}
236         {%- elif 'vlan' in value %}
237             "type": "vlan",
238             "vlan_id": {{ value['vlan'] }},
239             {%- for net_key,net_value in host_interface_net_mapping.iteritems() %}
240                 {%- if key in net_value %}
241                     "device": "{{net_key}}",
242                 {%- endif %}
243             {%- endfor %}
244         {%- else %}
245             {%- if configured_phys_ifaces.append(value['interface']) %}{%- endif %}
246             "name": "{{value['interface']}}",
247             "type": "interface",
248         {%- endif %}
249             "addresses": [ { "ip_netmask": "{{ value['ip'] }}/{{value['mask']}}" } ],
250             "mtu": {{mtu}},
251             {%- if (key == "infra_external" or key == "infra_access")
252                     and 'dns' in host_networking
253                     and (ansible_hostname not in groups.get('caas_nodes', [])) %}
254                 "dns_servers": [{% for server in host_networking['dns'] %}"{{ server }}"{% if not loop.last %},{% endif %}{% endfor %}],
255             {%- endif %}
256             {%- set routes = [] %}
257             {%- if 'routes' in value %}
258                 {%- set routes = value['routes'] %}
259             {%- endif %}
260             {%- if key == 'infra_external' and 'gateway' in value %}
261                 {%- if '.' in value['gateway'] %}
262                     {% set defaultroute = '0.0.0.0/0'%}
263                 {%- else %}
264                     {% set defaultroute = '::/0'%}
265                 {%- endif %}
266                 {%- set gw = {"to": defaultroute, "via": value['gateway']} %}
267                 {%- if routes.append(gw) %}{%- endif %}
268             {%- endif %}
269             {%- if key == 'infra_access' and 'gateway' in value %}
270                 {%- if 'dns' in host_networking %}
271                     {%- if '.' in value['gateway'] %}
272                         {% set mask = '/32' %}
273                     {%- else %}
274                         {% set mask = '/128' %}
275                     {%- endif %}
276                     {%- for server in host_networking['dns'] %}
277                         {%- set dnsroute = server ~ mask %}
278                         {%- set gw = {"to": dnsroute, "via": value['gateway']} %}
279                         {%- if routes.append(gw) %}{%- endif %}
280                     {%- endfor %}
281                 {%- endif %}
282                 {%- if external_ceph_cidr is not none %}
283                     {%- set gw = {"to": external_ceph_cidr, "via": value['gateway']} %}
284                     {%- if routes.append(gw) %}{%- endif %}
285                 {%- endif %}
286             {%- endif %}
287             {%- if routes %}
288                 "routes": {{ add_static_routes(routes) }},
289             {%- endif %}
290             "use_dhcp": false
291         }
292         {%- endif %}{#- no dpdk or no cloud tenant -#}
293     {%- endif %}
294 {%- endfor %}
295
296 {%- if config_phase != 'setup' %}
297 {#- configure caas provider network interfaces -#}
298 {%- for iface,value in host_provider_network_interfaces.iteritems() if 'caas' in value['type'] %}
299     {%- if not loopvar.first_entry %},{%- endif %}
300     {%- if loopvar.update({'first_entry': False}) %}{%- endif %}
301     {%- set ifacevars = {'mtu': 0} %}
302     {
303         "name": "{{iface}}",
304         {%- for mapped_net in value['provider_networks'] %}
305             {%- for net,info in host_networking['provider_networks'].iteritems() if net == mapped_net %}
306                 {%- if 'mtu' in info %}
307                     {%- if info['mtu'] > ifacevars.mtu %}
308                         {%- if ifacevars.update({'mtu': info['mtu']}) %}{%- endif %}
309                     {%- endif %}
310                 {%- elif default_mtu > ifacevars.mtu %}
311                     {%- if ifacevars.update({'mtu': default_mtu}) %}{%- endif %}
312                 {%- endif %}
313             {%- endfor %}
314         {%- endfor %}
315         {%- if 'bond' in iface %}
316             {%- for bond,slaves in host_bonding_interfaces.iteritems() if bond == iface %}
317                 {%- for slave in slaves %}
318                     {%- if slave in sriov_mtus and sriov_mtus[slave] > ifacevars.mtu %}
319                         {%- if ifacevars.update({'mtu': sriov_mtus[slave]}) %}{%- endif %}
320                     {%- endif %}
321                 {%- endfor %}
322                 "type": "linux_bond",
323                 "mtu": {{ifacevars.mtu}},
324                 {%- if 'linux_bonding_options' in  host_network_profile_value %}
325                     "bonding_options": "{{ generate_linux_bonding_options(host_network_profile_value['linux_bonding_options']) }}",
326                 {%- endif %}
327                 "members": [ {% for slave in slaves %}
328                     {%- if configured_phys_ifaces.append(slave) %}{%- endif %}
329                     {
330                     "name": "{{slave}}",
331                     "type": "interface",
332                     "mtu": {{ifacevars.mtu}},
333                     "use_dhcp": false
334                     }
335                     {% if not loop.last %},{% endif %}
336                 {%- endfor %}
337                 ],
338             {%- endfor %}
339         {%- else %}
340             {%- if configured_phys_ifaces.append(iface) %}{%- endif %}
341             {%- if iface in sriov_mtus and sriov_mtus[iface] > ifacevars.mtu %}
342                 {%- if ifacevars.update({'mtu': sriov_mtus[iface]}) %}{%- endif %}
343             {%- endif %}
344             "type": "interface",
345         {%- endif %}
346         "mtu": {{ifacevars.mtu}},
347         "use_dhcp": false
348     }
349 {%- endfor %}
350 {%- endif %}{#- if config_phase != 'setup' -#}
351
352 {%- endif %}{#- if not single_nic_setup -#}
353
354 {%- if config_phase != 'setup' or single_nic_setup %}
355
356 {#- configure ovs-* provider network interfaces -#}
357 {%- for key,value in host_provider_network_interfaces|dictsort(true) if 'ovs' in value['type'] %}
358     {%- set keyloop = loop %}
359     {%- if not loopvar.first_entry %},{%- endif %}
360     {%- if loopvar.update({'first_entry': False}) %}{%- endif %}
361     {%- if value['type'] == 'ovs-dpdk' %}
362         {%- for bond_key,bond_value in host_bonding_interfaces.iteritems() if bond_key == key %}
363             {%- for member in bond_value %}
364                 {%- if member not in ixgbedevs %}
365                     {%- if configured_phys_ifaces.append(member) %}{%- endif %}
366                     {
367                         "name": "{{member}}",
368                         "type": "interface",
369                         "mtu": {{max_mtu}},
370                         "use_dhcp": false
371                     },
372                 {%- endif %}
373             {%- endfor %}
374         {%- endfor %}
375         {%- if 'bond' not in key and key not in ixgbedevs %}
376             {%- if configured_phys_ifaces.append(key) %}{%- endif %}
377             {
378                 "name": "{{key}}",
379                 "type": "interface",
380                 "mtu": {{max_mtu}},
381                 "use_dhcp": false
382             },
383         {%- endif %}
384     {%- endif %}
385     {
386         "name": "br-pro{{keyloop.index0}}",
387         {%- if value['type'] == 'ovs-dpdk' %}
388             "type": "ovs_user_bridge",
389         {%- else %}
390             "type": "ovs_bridge",
391         {%- endif %}
392         "members": [
393             {
394             "mtu": {{max_mtu}},
395             {%- if 'bond' in key %}
396                 {%- for bond_key,bond_value in host_bonding_interfaces.iteritems() if bond_key == key %}
397                     {%- if 'ovs_bonding_options' in  host_network_profile_value %}
398                         "ovs_options": "{{ generate_ovs_bonding_options(host_network_profile_value['ovs_bonding_options']) }}",
399                     {%- endif %}
400                     "name": "{{key}}",
401                     {%- if value['type'] == 'ovs-dpdk' %}
402                         "type": "ovs_dpdk_bond",
403                         {%- if 'dpdk_max_rx_queues' in value %}
404                             "rx_queue": {{ value['dpdk_max_rx_queues'] }},
405                         {%- endif %}
406                         "members": [ {%- for member in bond_value %}
407                             {%- if configured_phys_ifaces.append(member) %}{%- endif %}
408                             {
409                             "name": "dpdk-{{member}}",
410                             "type": "ovs_dpdk_port",
411                             "mtu": {{max_mtu}},
412                             "members": [ { "name": "{{member}}", "type": "interface", "mtu": {{max_mtu}}, "use_dhcp": false } ],
413                             "use_dhcp": false
414                             }
415                             {% if not loop.last %},{% endif %}
416                         {%- endfor %}
417                         ],
418                     {%- else %}
419                         "type": "ovs_bond",
420                         "members": [ {% for member in bond_value %}
421                             {%- if configured_phys_ifaces.append(member) %}{%- endif %}
422                             {
423                             "name": "{{ member }}",
424                             "type": "interface",
425                             "mtu": {{max_mtu}},
426                             "use_dhcp": false
427                             }
428                             {% if not loop.last %},{% endif %}
429                         {%- endfor %}
430                         ],
431                     {%- endif %}
432                 {%- endfor %}
433             {%- else %}
434                 {%- if configured_phys_ifaces.append(key) %}{%- endif %}
435                 {%- if value['type'] == 'ovs-dpdk' %}
436                     "name": "dpdk-{{key}}",
437                     "type": "ovs_dpdk_port",
438                     "mtu": {{max_mtu}},
439                     {%- if 'dpdk_max_rx_queues' in value %}
440                         "rx_queue": {{ value['dpdk_max_rx_queues'] }},
441                     {%- endif %}
442                     "members": [ { "name": "{{key}}", "type": "interface", "mtu": {{max_mtu}}, "use_dhcp": false } ],
443                 {%- else %}
444                     "name": "{{key}}",
445                     "type": "interface",
446                 {%- endif %}
447             {%- endif %}
448             "use_dhcp": false
449             }
450             {%- for net in value['provider_networks'] %}
451                 ,
452                 {
453                 "name": "pro{{keyloop.index0}}-pro{{keyloop.index0}}.{{loop.index0}}",
454                 "bridge_name": "br-pro{{keyloop.index0}}",
455                 "type": "ovs_patch_port",
456                 "peer": "pro{{keyloop.index0}}.{{loop.index0}}-pro{{keyloop.index0}}"
457                 }
458             {%- endfor %}
459             {%- if single_nic_setup %}
460                 {#- configure all infra ifaces -#}
461                 {%- for key,value in host_networking.iteritems() %}
462                     {%- if value is iterable and 'interface' in value %}
463                         {%- if 'mtu' in value %}{% set mtu = value['mtu'] %}{% else %}{% set mtu = default_mtu %}{% endif %}
464                         {%- if key == CLOUD_TENANT %}{% set mtu = mtu + VXLAN_HDR_LEN %}{% endif %}
465                         ,
466                         {
467                         "type": "vlan",
468                         "vlan_id": {{ value['vlan'] }},
469                         "addresses": [ { "ip_netmask": "{{ value['ip'] }}/{{value['mask']}}" } ],
470                         "mtu": {{mtu}},
471                         {%- if (key == "infra_external" or key == "infra_access")
472                             and 'dns' in host_networking
473                             and (ansible_hostname not in groups.get('caas_nodes', [])) %}
474                             "dns_servers": [{% for server in host_networking['dns'] %}"{{ server }}"{% if not loop.last %},{% endif %}{% endfor %}],
475                         {%- endif %}
476                         {%- set routes = [] %}
477                         {%- if 'routes' in value %}
478                             {%- set routes = value['routes'] %}
479                         {%- endif %}
480                         {%- if key == 'infra_external' and 'gateway' in value %}
481                             {%- if '.' in value['gateway'] %}
482                                 {% set defaultroute = '0.0.0.0/0'%}
483                             {%- else %}
484                                 {% set defaultroute = '::/0'%}
485                             {%- endif %}
486                             {%- set gw = {"to": defaultroute, "via": value['gateway']} %}
487                             {%- if routes.append(gw) %}{%- endif %}
488                         {%- endif %}
489                         {%- if key == 'infra_access' and 'gateway' in value %}
490                             {%- if 'dns' in host_networking %}
491                                 {%- if '.' in value['gateway'] %}
492                                     {% set mask = '/32' %}
493                                 {%- else %}
494                                     {% set mask = '/128' %}
495                                 {%- endif %}
496                                 {%- for server in host_networking['dns'] %}
497                                     {%- set dnsroute = server ~ mask %}
498                                     {%- set gw = {"to": dnsroute, "via": value['gateway']} %}
499                                     {%- if routes.append(gw) %}{%- endif %}
500                                 {%- endfor %}
501                             {%- endif %}
502                             {%- if external_ceph_cidr is not none %}
503                                 {%- set gw = {"to": external_ceph_cidr, "via": value['gateway']} %}
504                                 {%- if routes.append(gw) %}{%- endif %}
505                             {%- endif %}
506                         {%- endif %}
507                         {%- if routes %}
508                             "routes": {{ add_static_routes(routes) }},
509                         {%- endif %}
510                         "use_dhcp": false
511                         }
512                     {%- endif %}
513                 {%- endfor %}
514             {%- endif %}{#- if single_nic_setup -#}
515         ]
516     }
517     {%- for net in value['provider_networks'] %}
518         ,
519         {
520             "name": "br-pro{{keyloop.index0}}.{{loop.index0}}",
521             {%- if value['type'] == 'ovs-dpdk' %}
522                 "type": "ovs_user_bridge",
523             {%- else %}
524                 "type": "ovs_bridge",
525             {%- endif %}
526             "ovs_fail_mode": "secure",
527             "members": [
528                 {
529                 "name": "pro{{keyloop.index0}}.{{loop.index0}}-pro{{keyloop.index0}}",
530                 "bridge_name": "br-pro{{keyloop.index0}}.{{loop.index0}}",
531                 "type": "ovs_patch_port",
532                 "peer": "pro{{keyloop.index0}}-pro{{keyloop.index0}}.{{loop.index0}}"
533                 }
534             ]
535         }
536     {%- endfor %}
537 {%- endfor %}
538
539 {#- configure vxlan bridge for dpdk cloud tenant -#}
540 {%- if CLOUD_TENANT in host_networking.keys() and 'interface' in host_networking[CLOUD_TENANT] and dpdk_in_use %}
541     {%- set net = host_networking[CLOUD_TENANT] %}
542     {%- if not loopvar.first_entry %},{%- endif %}
543     {%- if loopvar.update({'first_entry': False}) %}{%- endif %}
544     {
545         "type": "ovs_user_bridge",
546         "name": "br-vxlan",
547         "addresses": [ { "ip_netmask": "{{ net['ip'] }}/{{net['mask']}}" } ],
548         {%- if 'routes' in net %}
549             "routes": {{ add_static_routes(net['routes']) }},
550         {%- endif %}
551         "members": [{
552             "type": "vlan",
553             "vlan_id": {{ net['vlan'] }},
554             {%- for net_key,net_value in host_interface_net_mapping.iteritems() %}
555                 {%- if CLOUD_TENANT in net_value %}
556                     "device": "{{net_key}}",
557                 {%- endif %}
558             {%- endfor %}
559             {%- if 'mtu' in net %}{% set mtu = net['mtu'] %}{% else %}{% set mtu = default_mtu %}{% endif %}
560             {% set mtu = mtu + VXLAN_HDR_LEN %}
561             "mtu": {{mtu}},
562             "use_dhcp": false
563         }],
564         "ovs_extra": [ "br-set-external-id br-vxlan bridge-id br-vxlan" ]
565     }
566 {%- endif %}
567 {%- endif %}{#- if config_phase != 'setup' or single_nic_setup -#}
568
569 {#- configure sr-iov ifaces -#}
570 {%- if config_phase != 'setup' %}
571     {%- for iface,mtu in sriov_mtus.iteritems() %}
572         {%- if iface not in configured_phys_ifaces %}
573             {%- if not loopvar.first_entry %},{%- endif %}
574             {%- if loopvar.update({'first_entry': False}) %}{%- endif %}
575             {
576                 "name": "{{iface}}",
577                 "type": "interface",
578                 "mtu": {{mtu}},
579                 "use_dhcp": false
580             }
581         {%- endif %}
582     {%- endfor %}
583 {%- endif %}{#- if config_phase != 'setup' -#}
584 ]
585 }