# Copyright (c) 2017 Intel Corporation.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
---
#- patch: src="{{ item }}" basedir="{{ dpdk_path }}" strip=0
#  with_fileglob:
#    - "{{ local_nsb_path }}/patches/dpdk_custom_patch/rte_pipeline.patch"
#
#- patch: src="{{ item }}" basedir="{{ dpdk_path }}" strip=1
#  with_fileglob:
#    - "{{ local_nsb_path }}/patches/dpdk_custom_patch/0*.patch"

- name: find kernel for image, (including chroot)
  find_kernel:
    kernel: "{{ ansible_kernel }}"
  register: found_kernel

# Do this before installing kernel headers
- name: Set dpdk_kernel to be the kernel we found
  set_fact:
    dpdk_kernel: "{{ found_kernel.kernel }}"

- include: "{{ ansible_os_family }}.yml"

- name: set RTE_KERNELDIR to point to found kernel
  set_fact:
    RTE_KERNELDIR: "/lib/modules/{{ dpdk_kernel }}/build"

- command: make -j {{ ansible_processor_vcpus }} config T={{ dpdk_make_arch }} O={{ dpdk_make_arch }}
  args:
    chdir: "{{ dpdk_path }}"
  environment:
    RTE_KERNELDIR: "{{ RTE_KERNELDIR }}"

- name: enable RTE_PORT_STATS_COLLECT
  lineinfile:
    dest: "{{ dpdk_path }}/{{ dpdk_make_arch }}/.config"
    regexp: '^CONFIG_RTE_PORT_STATS_COLLECT=n'
    line: 'CONFIG_RTE_PORT_STATS_COLLECT=y'

- name: enable DPDK RTE_PORT_PCAP
  lineinfile:
    dest: "{{ dpdk_path }}/{{ dpdk_make_arch }}/.config"
    regexp: '^CONFIG_RTE_PORT_PCAP=n'
    line: 'CONFIG_RTE_PORT_PCAP=y'

- name: enable DPDK RTE_TABLE_STATS_COLLECT
  lineinfile:
    dest: "{{ dpdk_path }}/{{ dpdk_make_arch }}/.config"
    regexp: '^CONFIG_RTE_TABLE_STATS_COLLECT=n'
    line: 'CONFIG_RTE_TABLE_STATS_COLLECT=y'

- name: enable DPDK RTE_PIPELINE_STATS_COLLECT
  lineinfile:
    dest: "{{ dpdk_path }}/{{ dpdk_make_arch }}/.config"
    regexp: '^CONFIG_RTE_PIPELINE_STATS_COLLECT=n'
    line: 'CONFIG_RTE_PIPELINE_STATS_COLLECT=y'

# This is requied for collectd? but it breaks PROX?
#- name: enable CONFIG_RTE_BUILD_SHARED_LIB
#  lineinfile:
#    dest: "{{ dpdk_path }}/{{ dpdk_make_arch }}/.config"
#    regexp: '^CONFIG_RTE_BUILD_SHARED_LIB=n'
#    line: 'CONFIG_RTE_BUILD_SHARED_LIB=y'
#
#- name: enable DPDK CONFIG_RTE_EAL_PMD_PATH
#  lineinfile:
#    dest: "{{ dpdk_path }}/{{ dpdk_make_arch }}/.config"
#    regexp: '^CONFIG_RTE_EAL_PMD_PATH=""'
#    line: 'CONFIG_RTE_EAL_PMD_PATH="{{ dpdk_pmd_path }}"'

# TODO: disable ASLR

- name: make dpdk
  command: make -j {{ ansible_processor_vcpus }}
  args:
    chdir: "{{ dpdk_path }}/{{ dpdk_make_arch}}"
  environment:
    RTE_KERNELDIR: "{{ RTE_KERNELDIR }}"

#- name: make install DPDK into /usr for collectd and other programs
#  make:
#    chdir: "{{ dpdk_path }}/{{ dpdk_make_arch}}"
#    target: install
#    params: "T={{ RTE_TARGET }}"
##    params: "prefix={{ usr_prefix }}"
#  environment:
#    RTE_KERNELDIR: "{{ RTE_KERNELDIR }}"
#  become: yes

- file:
    path: "{{ dpdk_module_dir}}"
    state: directory

- copy:
    src: "{{ dpdk_path }}/{{ dpdk_make_arch }}/kmod/igb_uio.ko"
    dest: "{{ dpdk_module_dir }}/igb_uio.ko"
    remote_src: yes

- name: run depmod for dpdk_kernel
  command: depmod "{{ dpdk_kernel }}"

- file:
    path: "{{ INSTALL_BIN_PATH }}"
    state:  directory

- name: copy dpdk-devbind.py to correct location
  copy:
    src: "{{ dpdk_devbind[dpdk_version] }}"
    dest: "{{ INSTALL_BIN_PATH }}/dpdk-devbind.py"
    remote_src: yes
    force: yes
    mode: 0755

- name: make dpdk_nic_bind.py for backwards compatibility
  copy:
    src: "{{ dpdk_devbind[dpdk_version] }}"
    dest: "{{ INSTALL_BIN_PATH }}/dpdk_nic_bind.py"
    remote_src: yes
    force: yes
    mode: 0755