diff options
Diffstat (limited to 'plugins/dpdk/roles')
18 files changed, 491 insertions, 0 deletions
diff --git a/plugins/dpdk/roles/config-dpdk/files/openvswitch-switch.service b/plugins/dpdk/roles/config-dpdk/files/openvswitch-switch.service new file mode 100644 index 00000000..cb46c341 --- /dev/null +++ b/plugins/dpdk/roles/config-dpdk/files/openvswitch-switch.service @@ -0,0 +1,17 @@ +[Unit] +Description=openvswitch-switch + +[Service] +User=root +Group=root +Type=oneshot +RemainAfterExit=yes +ExecStart=/opt/start_ovs_vswitchd.sh + +TimeoutSec=120 +#Restart=on-failure +#RestartSec=2 + +[Install] +WantedBy=multi-user.target + diff --git a/plugins/dpdk/roles/config-dpdk/handlers/main.yml b/plugins/dpdk/roles/config-dpdk/handlers/main.yml new file mode 100644 index 00000000..b1a62327 --- /dev/null +++ b/plugins/dpdk/roles/config-dpdk/handlers/main.yml @@ -0,0 +1,28 @@ +############################################################################## +# Copyright (c) 2017 HUAWEI TECHNOLOGIES CO.,LTD and others. +# +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## +--- +- name: service openvswitch restart + systemd: + name: "{{ item }}" + state: restarted + daemon_reload: "yes" + enabled: "yes" + with_items: "{{ openvswitch_service }}" + +- name: service libvirtd restart + service: + name: "{{ item }}" + state: restarted + with_items: "{{ libvirtd_service }}" + +- name: service neutron-openvswitch-agent restart + service: + name: "{{ item }}" + state: restarted + with_items: "{{ ovs_agent_service }}" diff --git a/plugins/dpdk/roles/config-dpdk/tasks/compute.yml b/plugins/dpdk/roles/config-dpdk/tasks/compute.yml new file mode 100644 index 00000000..b5285d79 --- /dev/null +++ b/plugins/dpdk/roles/config-dpdk/tasks/compute.yml @@ -0,0 +1,82 @@ +############################################################################# +# Copyright (c) 2017 HUAWEI TECHNOLOGIES CO.,LTD and others. +# +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## +--- +- name: get dpdk interface device name + command: echo "{{ compu_sys_mappings['tenant']['interface'] }}" + register: dpdk_device_name + +- name: get dpdk interface ip + shell: > + ip a show "{{ dpdk_device_name.stdout }}" | grep -E "\<inet\>" | + awk '{print $2}' + register: dpdk_device_ip + +- debug: + msg: "{{ dpdk_device_ip.stdout }}" + +- name: get dpdk interface device pci + shell: > + {{ devbind_script }} -s | grep {{ dpdk_device_name.stdout }} | + awk '{print $1}' + register: dpdk_device_pci + +- name: switch dpdk interface driver + shell: "{{ switch_driver_script }}" + notify: service openvswitch restart + +- name: kill ovs process + shell: > + ps aux | grep ovs | grep -v grep | awk '{print $2}' | xargs kill -9 | + true + notify: service openvswitch restart + +- name: copy service file + copy: + src: openvswitch-switch.service + dest: /lib/systemd/system/openvswitch-switch.service + notify: service openvswitch restart + +- name: config libvirtd + shell: echo 'user = "root"' >> /etc/libvirt/qemu.conf + notify: service libvirtd restart + +- meta: flush_handlers + +- name: config neutron-openvswitch-agent + blockinfile: + dest: /etc/neutron/plugins/ml2/openvswitch_agent.ini + insertafter: '^\[ovs\]' + block: | + datapath_type=netdev + vhostuser_socket_dir=/usr/local/var/run/openvswitch + +- name: set ovs manager + shell: ovs-vsctl set-manager ptcp:6640:127.0.0.1 + notify: service neutron-openvswitch-agent restart + +- name: config ovs to dpdk + shell: | + ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-init=true + ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-socket-mem="{{ dpdk_memory }}" + notify: service neutron-openvswitch-agent restart + +- name: add dpdk bridge + shell: | + ovs-vsctl add-br br-dpdk -- set bridge br-dpdk datapath_type=netdev + ovs-vsctl add-port br-dpdk dpdk0 -- set Interface dpdk0 \ + type=dpdk options:dpdk-devargs="{{ dpdk_device_pci.stdout }}" + notify: service neutron-openvswitch-agent restart + +- name: bind ip on dpdk bridge + shell: | + ifconfig br-dpdk "{{ dpdk_device_ip.stdout }}" + ifconfig br-dpdk up + notify: service neutron-openvswitch-agent restart + +- meta: flush_handlers diff --git a/plugins/dpdk/roles/config-dpdk/tasks/config-dpdk.yml b/plugins/dpdk/roles/config-dpdk/tasks/config-dpdk.yml new file mode 100644 index 00000000..b0e1a1ed --- /dev/null +++ b/plugins/dpdk/roles/config-dpdk/tasks/config-dpdk.yml @@ -0,0 +1,16 @@ +############################################################################# +# Copyright (c) 2017 HUAWEI TECHNOLOGIES CO.,LTD and others. +# +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## +--- +- include_vars: "{{ ansible_distribution }}.yml" + +- include: neutron_agent.yml + when: inventory_hostname in groups['neutron_openvswitch_agent'] + +- include: compute.yml + when: inventory_hostname in groups['compute'] diff --git a/plugins/dpdk/roles/config-dpdk/tasks/main.yml b/plugins/dpdk/roles/config-dpdk/tasks/main.yml new file mode 100644 index 00000000..19fc66b7 --- /dev/null +++ b/plugins/dpdk/roles/config-dpdk/tasks/main.yml @@ -0,0 +1,11 @@ +############################################################################## +# Copyright (c) 2017 HUAWEI TECHNOLOGIES CO.,LTD and others. +# +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## +--- +- include: config-dpdk.yml + when: dpdk is defined and dpdk == "Enable" diff --git a/plugins/dpdk/roles/config-dpdk/tasks/neutron_agent.yml b/plugins/dpdk/roles/config-dpdk/tasks/neutron_agent.yml new file mode 100644 index 00000000..aa65142b --- /dev/null +++ b/plugins/dpdk/roles/config-dpdk/tasks/neutron_agent.yml @@ -0,0 +1,15 @@ +############################################################################# +# Copyright (c) 2017 HUAWEI TECHNOLOGIES CO.,LTD and others. +# +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## +--- +- name: config neutron-openvswitch-agent + lineinfile: + dest: /etc/neutron/plugins/ml2/openvswitch_agent.ini + regexp: '^firewall_driver' + line: "firewall_driver = openvswitch" + notify: service neutron-openvswitch-agent restart diff --git a/plugins/dpdk/roles/config-dpdk/vars/Ubuntu.yml b/plugins/dpdk/roles/config-dpdk/vars/Ubuntu.yml new file mode 100644 index 00000000..697785ad --- /dev/null +++ b/plugins/dpdk/roles/config-dpdk/vars/Ubuntu.yml @@ -0,0 +1,14 @@ +######################################################################### +# Copyright (c) 2017 HUAWEI TECHNOLOGIES CO.,LTD and others. +# +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +########################################################################## +--- +devbind_script: /root/dpdk/tools/dpdk-devbind.py +switch_driver_script: /root/dpdk_uio.sh +openvswitch_service: openvswitch-switch +ovs_agent_service: neutron-openvswitch-agent +libvirtd_service: libvirtd diff --git a/plugins/dpdk/roles/config-dpdk/vars/main.yml b/plugins/dpdk/roles/config-dpdk/vars/main.yml new file mode 100644 index 00000000..f6115b62 --- /dev/null +++ b/plugins/dpdk/roles/config-dpdk/vars/main.yml @@ -0,0 +1,10 @@ +########################################################################## +# Copyright (c) 2017 HUAWEI TECHNOLOGIES CO.,LTD and others. +# +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +########################################################################## +--- +dpdk_memory: 128 diff --git a/plugins/dpdk/roles/ins_dpdk/tasks/dpdk.yml b/plugins/dpdk/roles/ins_dpdk/tasks/dpdk.yml new file mode 100644 index 00000000..6a08386f --- /dev/null +++ b/plugins/dpdk/roles/ins_dpdk/tasks/dpdk.yml @@ -0,0 +1,81 @@ +# ############################################################################# +# Copyright (c) 2017 HUAWEI TECHNOLOGIES CO.,LTD and others. +# +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +# ############################################################################# +--- +- name: install prerequisites package + apt: + name: "{{ item }}" + state: present + with_items: + - git + - gcc + - make + - cmake + - libpcap0.8 + - libpcap0.8-dev + +- name: git clone DPDK code + git: + repo: "{{ dpdk_repo }}" + dest: "{{ dpdk_dir }}" + version: "{{ dpdk_version }}" + +- name: Configure DPDK + lineinfile: + dest: "{{ dpdk_dir }}/config/common_linuxapp" + regexp: '^{{ item.key }}=' + line: "{{ item.key }}={{ item.value }}" + with_items: + - key: CONFIG_RTE_BUILD_COMBINE_LIBS + value: y + register: dpdk_config_change + +- name: make config DPDK + command: make config T=x86_64-native-linuxapp-gcc chdir={{ dpdk_dir }} + +- name: Configure PMD + lineinfile: + dest: "{{ dpdk_dir }}/build/.config" + regexp: '^{{ item.key }}=' + line: "{{ item.key }}={{ item.value }}" + with_items: + - key: PMD_PCAP + value: y + +- name: Check if DPDK build exists + stat: path={{ dpdk_build }} + register: dpdk_build_status + +- name: Build DPDK + command: make install T=x86_64-native-linuxapp-gcc chdir={{ dpdk_dir }} + when: (dpdk_build_status.stat.isdir is not defined) or + (dpdk_rebuild is defined) or + dpdk_config_change.changed or dpdk_changed.changed + +- name: Get dpdk interface device name + command: echo "{{ compu_sys_mappings['tenant']['interface'] }}" + register: dpdk_device_name + when: compu_sys_mappings["tenant"]["type"] == "dpdk" + +- debug: + msg: "{{ dpdk_device_name }}" + +- name: Create DPDK scripts + template: + src: "templates/{{ item.name }}.j2" + dest: "/root/{{ item.name }}" + mode: 0755 + with_items: + - name: dpdk_uio.sh + dpdk_build: '{{ dpdk_build }}' + dpdk_dir: '{{ dpdk_dir }}' + device_name: '{{ dpdk_device_name.stdout | default("eth2") }}' + - name: dpdk_vfio.sh + dpdk_build: '{{ dpdk_build }}' + dpdk_dir: '{{ dpdk_dir }}' + device_name: '{{ dpdk_device_name.stdout | default("eth2") }}' diff --git a/plugins/dpdk/roles/ins_dpdk/tasks/hugepages.yml b/plugins/dpdk/roles/ins_dpdk/tasks/hugepages.yml new file mode 100644 index 00000000..3f41cf03 --- /dev/null +++ b/plugins/dpdk/roles/ins_dpdk/tasks/hugepages.yml @@ -0,0 +1,45 @@ +# ############################################################################# +# Copyright (c) 2017 HUAWEI TECHNOLOGIES CO.,LTD and others. +# +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +# ############################################################################# +--- +# yamllint disable rule:truthy +- name: Check hugepages + shell: grep -q intel_iommu /etc/default/grub + register: check_result + ignore_errors: True +# yamllint enable rule:truthy + +- name: Config grub + lineinfile: + dest: /etc/default/grub + regexp: '^GRUB_CMDLINE_LINUX_DEFAULT=""' + line: "{{ grub_cmdline }}" + state: present + when: check_result.rc == 1 + +- name: Update grub + shell: update-grub + when: check_result.rc == 1 + +- name: wait a moment + command: sleep 5 + when: check_result.rc == 1 + +- name: Reboot + shell: sleep 2 && shutdown -r now 'Reboot required' + become: true + async: 1 + poll: 0 + when: check_result.rc == 1 + ignore_errors: true + +- name: Wait for reboot + local_action: + module: wait_for + host={{ ansible_eth0.ipv4.address }} port=22 delay=1 timeout=300 + when: check_result.rc == 1 diff --git a/plugins/dpdk/roles/ins_dpdk/tasks/main.yml b/plugins/dpdk/roles/ins_dpdk/tasks/main.yml new file mode 100644 index 00000000..923dc3b4 --- /dev/null +++ b/plugins/dpdk/roles/ins_dpdk/tasks/main.yml @@ -0,0 +1,14 @@ +############################################################################## +# Copyright (c) 2016-2017 HUAWEI TECHNOLOGIES CO.,LTD and others. +# +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## +--- +- include: hugepages.yml + when: dpdk is defined and dpdk == "Enable" + +- include: dpdk.yml + when: dpdk is defined and dpdk == "Enable" diff --git a/plugins/dpdk/roles/ins_dpdk/templates/dpdk_uio.sh.j2 b/plugins/dpdk/roles/ins_dpdk/templates/dpdk_uio.sh.j2 new file mode 100644 index 00000000..560d30ca --- /dev/null +++ b/plugins/dpdk/roles/ins_dpdk/templates/dpdk_uio.sh.j2 @@ -0,0 +1,9 @@ +#!/bin/bash +ifdown {{ item.device_name }} +modprobe uio +lsmod |grep igb_uio +if [ $? == 0 ];then + rmmod igb_uio +fi +insmod {{ item.dpdk_build }}/kmod/igb_uio.ko +{{ item.dpdk_dir }}/tools/dpdk-devbind.py --bind=igb_uio {{ item.device_name }} diff --git a/plugins/dpdk/roles/ins_dpdk/templates/dpdk_vfio.sh.j2 b/plugins/dpdk/roles/ins_dpdk/templates/dpdk_vfio.sh.j2 new file mode 100644 index 00000000..58839342 --- /dev/null +++ b/plugins/dpdk/roles/ins_dpdk/templates/dpdk_vfio.sh.j2 @@ -0,0 +1,6 @@ +#!/bin/bash +ifdown {{ item.device_name }} +modprobe vfio-pci +chmod a+x /dev/vfio +chmod 0666 /dev/vfio/* +{{ item.dpdk_dir }}/tools/dpdk-devbind.py --bind=vfio-pci {{ item.device_name }} diff --git a/plugins/dpdk/roles/ins_dpdk/vars/main.yml b/plugins/dpdk/roles/ins_dpdk/vars/main.yml new file mode 100644 index 00000000..4bd4076e --- /dev/null +++ b/plugins/dpdk/roles/ins_dpdk/vars/main.yml @@ -0,0 +1,17 @@ +############################################################################## +# Copyright (c) 2016-2017 HUAWEI TECHNOLOGIES CO.,LTD and others. +# +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## +--- +# yamllint disable rule:line-length +grub_cmdline: GRUB_CMDLINE_LINUX_DEFAULT="hugepagesz=2M hugepages=2048 iommu=pt intel_iommu=on" +# yamllint enable rule:line-length + +dpdk_dir: /root/dpdk +dpdk_build: '{{ dpdk_dir }}/x86_64-native-linuxapp-gcc' +dpdk_repo: https://github.com/dpdk/dpdk.git +dpdk_version: v16.11 diff --git a/plugins/dpdk/roles/ins_ovs/tasks/main.yml b/plugins/dpdk/roles/ins_ovs/tasks/main.yml new file mode 100644 index 00000000..6570d06c --- /dev/null +++ b/plugins/dpdk/roles/ins_ovs/tasks/main.yml @@ -0,0 +1,11 @@ +# ############################################################################# +# Copyright (c) 2016-2017 HUAWEI TECHNOLOGIES CO.,LTD and others. +# +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +# ############################################################################# +--- +- include: ovs.yml + when: dpdk is defined and dpdk == "Enable" diff --git a/plugins/dpdk/roles/ins_ovs/tasks/ovs.yml b/plugins/dpdk/roles/ins_ovs/tasks/ovs.yml new file mode 100644 index 00000000..64475c6a --- /dev/null +++ b/plugins/dpdk/roles/ins_ovs/tasks/ovs.yml @@ -0,0 +1,93 @@ +############################################################################## +# Copyright (c) 2017 HUAWEI TECHNOLOGIES CO.,LTD and others. +# +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## +--- +- name: install prerequisites package + apt: + name: "{{ item }}" + state: present + with_items: + - git + - libnuma-dev + - dh-autoreconf + - python-pip + +- name: git clone open-vswitch code + git: + repo: "{{ ovs_repo }}" + dest: "{{ ovs_dir }}" + version: "{{ ovs_version }}" + +- name: install prerequisites package + pip: + name: six + +- name: Check if OVS configure script exists + stat: path={{ ovs_dir }}/configure + register: ovs_config_status + +- name: Bootstrap OVS if required + command: ./boot.sh chdir={{ ovs_dir }} + when: ovs_config_status.stat.exists == false or (ovs_rebuild is defined) or ovs_changed.changed + +- name: Check if OVS Makefile exists + stat: path={{ ovs_dir }}/Makefile + register: ovs_makefile_status + +# yamllint disable rule:line-length +- name: Configure OVS + command: ./configure --with-dpdk={{ dpdk_build }} CFLAGS="-g -O2 -Wno-cast-align" chdir={{ ovs_dir }} + when: ovs_makefile_status.stat.exists == false or (ovs_rebuild is defined) or ovs_changed.changed +# yamllint enable rule:line-length + +- name: Check if OVS distribution files exists + stat: path={{ ovs_dir }}/distfiles + register: ovs_distfiles_status + +- name: Build OVS + command: make CFLAGS='-O3 -march=native' chdir={{ ovs_dir }} + when: ovs_distfiles_status.stat.exists == false or (ovs_rebuild is defined) or ovs_changed.changed + +- name: Check if OVS tools are installed + stat: path=/usr/local/bin/ovsdb-tool + register: ovs_tools_status + +- name: Install OVS tools + command: make install chdir={{ ovs_dir }} + when: ovs_tools_status.stat.exists == false or (ovs_rebuild is defined) or ovs_changed.changed + +- name: Create OVS scripts + template: + src: "templates/{{ item }}.j2" + dest: "/opt/{{ item }}" + mode: 0755 + with_items: + - start_ovs_vswitchd.sh + +- name: Create folders + file: path={{ item }} state=directory + with_items: + - /usr/local/etc/openvswitch + - /usr/local/var/run/openvswitch + +- name: Clear database configuration if required + file: path=/usr/local/etc/openvswitch/conf.db state=absent + when: ovs_rebuild is defined or ovs_changed.changed + +- name: Check if database configuration exists + stat: path=/usr/local/etc/openvswitch/conf.db + register: ovs_dbconfig_status + +# yamllint disable rule:line-length +- name: Create database configuration + command: ovsdb-tool create /usr/local/etc/openvswitch/conf.db /usr/local/share/openvswitch/vswitch.ovsschema + when: ovs_dbconfig_status.stat.exists == false +# yamllint enable rule:line-length + +- name: Start OVS vswitchd with DPDK support enabled + command: /opt/start_ovs_vswitchd.sh diff --git a/plugins/dpdk/roles/ins_ovs/templates/start_ovs_vswitchd.sh.j2 b/plugins/dpdk/roles/ins_ovs/templates/start_ovs_vswitchd.sh.j2 new file mode 100644 index 00000000..a96c8721 --- /dev/null +++ b/plugins/dpdk/roles/ins_ovs/templates/start_ovs_vswitchd.sh.j2 @@ -0,0 +1,8 @@ +#!/bin/bash +ovsdb-server --remote=punix:/usr/local/var/run/openvswitch/db.sock \ + --remote=db:Open_vSwitch,Open_vSwitch,manager_options \ + --pidfile --detach + +export DB_SOCK=/usr/local/var/run/openvswitch/db.sock +sudo ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-init=true +sudo ovs-vswitchd unix:$DB_SOCK --pidfile --detach diff --git a/plugins/dpdk/roles/ins_ovs/vars/main.yml b/plugins/dpdk/roles/ins_ovs/vars/main.yml new file mode 100644 index 00000000..c5f14d4e --- /dev/null +++ b/plugins/dpdk/roles/ins_ovs/vars/main.yml @@ -0,0 +1,14 @@ +############################################################################## +# Copyright (c) 2016-2017 HUAWEI TECHNOLOGIES CO.,LTD and others. +# +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## +--- +dpdk_dir: /root/dpdk +dpdk_build: '{{ dpdk_dir }}/x86_64-native-linuxapp-gcc' +ovs_dir: /root/ovs +ovs_repo: https://github.com/openvswitch/ovs.git +ovs_version: v2.7.2 |