blob: 7c7680315c27a47b0c5046efdc0ae61f92d8dff4 [file] [log] [blame]
{%- from "linux/map.jinja" import network with context %}
{%- from "linux/map.jinja" import system with context %}
{%- if network.dpdk.enabled %}
linux_dpdk_pkgs:
pkg.installed:
- pkgs: {{ network.dpdk_pkgs }}
linux_dpdk_kernel_module:
kmod.present:
- name: {{ network.dpdk.driver }}
- persist: true
- require:
- pkg: linux_dpdk_pkgs
- require_in:
- service: linux_network_dpdk_service
/etc/dpdk/interfaces:
file.managed:
- source: salt://linux/files/dpdk_interfaces
- template: jinja
- user: root
- group: root
- mode: 644
- require:
- pkg: linux_dpdk_pkgs
linux_network_dpdk_service:
service.running:
- enable: true
- name: dpdk
- watch:
- file: /etc/dpdk/interfaces
{%- if network.openvswitch is defined %}
openvswitch_dpdk_pkgs:
pkg.installed:
- pkgs:
- openvswitch-switch-dpdk
- openvswitch-switch
- bridge-utils
linux_network_dpdk_ovs_service:
cmd.run:
- name: "ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-init=true"
- require:
- service: linux_network_dpdk_service
- unless: 'ovs-vsctl get Open_vSwitch . other_config | grep "dpdk-init=\"true\""'
{%- set ovs_options = [
"pmd-cpu-mask=\""+network.openvswitch.pmd_cpu_mask+"\"",
"dpdk-socket-mem=\""+network.openvswitch.dpdk_socket_mem+"\"",
"dpdk-lcore-mask=\""+network.openvswitch.dpdk_lcore_mask+"\"",
"dpdk-extra=\"-n "+network.openvswitch.memory_channels+" --vhost-owner libvirt-qemu:kvm --vhost-perm 0664\""
]
%}
{%- if network.openvswitch.get('vhost_socket_dir',{}).get('path') %}
{%- do ovs_options.append("vhost-sock-dir=\""+network.openvswitch.vhost_socket_dir.path+"\"") %}
{%- endif %}
{%- for option in ovs_options %}
linux_network_dpdk_ovs_option_{{ option }}:
cmd.run:
- name: 'ovs-vsctl{%- if network.ovs_nowait %} --no-wait{%- endif %} set Open_vSwitch . other_config:{{ option }}'
- watch_in:
- service: service_openvswitch
- require:
- cmd: linux_network_dpdk_ovs_service
- unless: |
ovs-vsctl get Open_vSwitch . other_config | grep '{{ option }}'
{%- endfor %}
openvswitch_dpdk_ovs_alternative:
alternatives.remove:
- name: ovs-vswitchd
- path: /usr/lib/openvswitch-switch/ovs-vswitchd
- require:
- pkg: openvswitch_dpdk_pkgs
- watch_in:
- service: service_openvswitch
service_openvswitch:
service.running:
- name: openvswitch-switch
- enable: true
- watch:
- cmd: linux_network_dpdk_ovs_service
{%- endif %}
{%- for interface_name, interface in network.interface.items() if interface.get('enabled', True) %}
{%- if interface.type == "dpdk_ovs_bond" %}
{%- set bond_interfaces = {} %}
{%- for iface_name, iface in network.interface.items() if iface.get('enabled', True) and iface.get('bond',"") == interface_name %}
{#- Get list of child interfaces #}
{%- do bond_interfaces.update({iface_name: iface}) %}
{%- endfor %}
linux_network_dpdk_bond_interface_{{ interface_name }}:
cmd.run:
- name: "ovs-vsctl{%- if network.ovs_nowait %} --no-wait{%- endif %} add-bond {{ interface.bridge }} {{ interface_name }} {{ bond_interfaces.keys()|join(' ') }}"
- unless: "ovs-vsctl list-ports {{ interface.bridge }} | grep -w {{ interface_name }}"
- require:
- cmd: linux_network_dpdk_bridge_interface_{{ interface.bridge }}
{% for iface_name, iface in bond_interfaces.items() %}
linux_network_dpdk_bond_interface_{{ iface_name }}_activate:
cmd.run:
- name: "timeout 5 /bin/sh -c -- 'while true; do ovs-vsctl get Interface {{ iface_name }} name 1>/dev/null 2>&1 && break || sleep 1; done'"
- unless: "ovs-vsctl get Interface {{ iface_name }} name 1>/dev/null 2>&1"
linux_network_dpdk_bond_interface_{{ iface_name }}_type:
cmd.run:
- name: "ovs-vsctl{%- if network.ovs_nowait %} --no-wait{%- endif %} set Interface {{ iface_name }} type=dpdk"
- unless: "ovs-vsctl get interface {{ iface_name }} type | grep -w dpdk"
- require:
- cmd: linux_network_dpdk_bond_interface_{{ iface_name }}_activate
linux_network_dpdk_bond_interface_{{ iface_name }}_options:
cmd.run:
- name: "ovs-vsctl{%- if network.ovs_nowait %} --no-wait{%- endif %} set Interface {{ iface_name }} options:dpdk-devargs={{ iface.pci }}"
- unless: "ovs-vsctl get interface {{ iface_name }} options:dpdk-devargs | grep -w {{ iface.pci }}"
- require:
- cmd: linux_network_dpdk_bond_interface_{{ iface_name }}_activate
{% endfor %}
linux_network_dpdk_bond_mode_{{ interface_name }}:
cmd.run:
- name: "ovs-vsctl{%- if network.ovs_nowait %} --no-wait{%- endif %} set port {{ interface_name }} bond_mode={{ interface.mode }}{%- if interface.mode == 'balance-slb' %} lacp=active{%- endif %}"
- unless: "ovs-appctl bond/show {{ interface_name }} | grep {{ interface.mode }}"
- require:
- cmd: linux_network_dpdk_bond_interface_{{ interface_name }}
{%- elif interface.type == 'dpdk_ovs_bridge' %}
linux_network_dpdk_bridge_interface_{{ interface_name }}:
cmd.run:
- name: "ovs-vsctl{%- if network.ovs_nowait %} --no-wait{%- endif %} add-br {{ interface_name }} -- set bridge {{ interface_name }} datapath_type=netdev{% if interface.tag is defined %} -- set port {{ interface_name }} tag={{ interface.tag }}{% endif %}"
- unless: 'ovs-vsctl show | grep "Bridge {{ interface_name }}"'
{# OVS dpdk needs ip address for vxlan termination on bridge br-prv #}
{%- if interface.address is defined %}
{# create override for openvswitch dependency for dpdk br-prv #}
/etc/systemd/system/ifup@{{ interface_name }}.service.d/override.conf:
file.managed:
- makedirs: true
- require:
- cmd: linux_network_dpdk_bridge_interface_{{ interface_name }}
- contents: |
[Unit]
Requires=openvswitch-switch.service
After=openvswitch-switch.service
{# enforce ip address and mtu for ovs dpdk br-prv #}
dpdk_ovs_bridge_{{ interface_name }}:
file.managed:
- name: /etc/network/interfaces.u/ifcfg-{{ interface_name }}
- contents: |
auto {{ interface_name }}
iface {{ interface_name }} inet static
address {{ interface.address }}
netmask {{ interface.netmask }}
{%- if interface.mtu is defined %}
mtu {{ interface.mtu }}
{%- endif %}
- makedirs: True
- require:
- file: /etc/systemd/system/ifup@{{ interface_name }}.service.d/override.conf
dpdk_ovs_bridge_up_{{ interface_name }}:
cmd.run:
- name: ifup {{ interface_name }}
{%- if network.noifupdown|d(false) or interface.noifupdown|d(false) %}
- onlyif: /bin/false
{%- endif %}
- require:
- file: dpdk_ovs_bridge_{{ interface_name }}
{%- endif %}
{%- elif interface.type == 'dpdk_ovs_port' and interface.bridge is defined %}
linux_network_dpdk_bridge_port_interface_{{ interface_name }}:
cmd.run:
- name: "ovs-vsctl{%- if network.ovs_nowait %} --no-wait{%- endif %} add-port {{ interface.bridge }} {{ interface_name }} -- set Interface {{ interface_name }} type=dpdk options:dpdk-devargs={{ interface.pci }}"
- unless: "ovs-vsctl list-ports {{ interface.bridge }} | grep -w {{ interface_name }}"
- require:
- cmd: linux_network_dpdk_bridge_interface_{{ interface.bridge }}
{%- endif %}
{# Multiqueue n_rxq, pmd_rxq_affinity and mtu setup on interfaces #}
{%- if interface.type == 'dpdk_ovs_port' %}
{%- if interface.n_rxq is defined %}
linux_network_dpdk_bridge_port_interface_n_rxq_{{ interface_name }}:
cmd.run:
- name: "ovs-vsctl{%- if network.ovs_nowait %} --no-wait{%- endif %} set Interface {{ interface_name }} options:n_rxq={{ interface.n_rxq }} "
- unless: |
ovs-vsctl get Interface {{ interface_name }} options | grep 'n_rxq="{{ interface.n_rxq }}"'
{%- if interface.get("bond", "") != "" %}
- require:
- cmd: linux_network_dpdk_bond_interface_{{ interface.get("bond", "") }}
{%- endif %}
{%- endif %}
{%- if interface.pmd_rxq_affinity is defined %}
linux_network_dpdk_bridge_port_interface_pmd_rxq_affinity_{{ interface_name }}:
cmd.run:
- name: "ovs-vsctl{%- if network.ovs_nowait %} --no-wait{%- endif %} set Interface {{ interface_name }} other_config:pmd-rxq-affinity={{ interface.pmd_rxq_affinity }} "
- unless: |
ovs-vsctl get Interface {{ interface_name }} other_config | grep 'pmd-rxq-affinity="{{ interface.pmd_rxq_affinity }}"'
{%- if interface.get("bond", "") != "" %}
- require:
- cmd: linux_network_dpdk_bond_interface_{{ interface.get("bond", "") }}
{%- endif %}
{%- endif %}
{%- if interface.mtu is defined %}
{# MTU ovs dpdk setup on interfaces #}
linux_network_dpdk_bridge_port_interface_mtu_{{ interface_name }}:
cmd.run:
- name: "ovs-vsctl{%- if network.ovs_nowait %} --no-wait{%- endif %} set Interface {{ interface_name }} mtu_request={{ interface.mtu }} "
- unless: "ovs-vsctl get Interface {{ interface_name }} mtu_request | grep {{ interface.mtu }}"
{%- if interface.get("bond", "") != "" %}
- require:
- cmd: linux_network_dpdk_bond_interface_{{ interface.get("bond", "") }}
{%- endif %}
{%- endif %}
{%- endif %}
{%- endfor %}
{%- endif %}