require 'spec_helper'

describe 'tripleo::host::sriov::numvfs_persistence' do

  describe 'confugure numvfs for persistence' do

    let :title do
      'numvfs'
    end

    let :params do
      {
        :name           => 'persistence',
        :vf_defs        => ['eth0:10','eth1:8'],
        :content_string => "Hashbang\n",
        :udev_rules     => ""
      }
    end

    it 'configures persistence' do
      is_expected.to contain_file('/etc/sysconfig/allocate_vfs').with(
        :ensure  => 'file',
        :content => "Hashbang\n[ \"eth0\" == \"\$1\" ] && echo 10 > /sys/class/net/eth0/device/sriov_numvfs\n[ \"eth1\" == \"\$1\" ] && echo 8 > /sys/class/net/eth1/device/sriov_numvfs\n",
        :group   => 'root',
        :mode    => '0755',
        :owner   => 'root',
      )
      is_expected.to contain_file('/sbin/ifup-local').with(
        :group   => 'root',
        :mode    => '0755',
        :owner   => 'root',
        :content => '#!/bin/bash',
        :replace => false,
      )
      is_expected.to contain_file('/etc/udev/rules.d/70-tripleo-reset-sriov.rules').with(
        :ensure  => 'file',
        :content => "KERNEL==\"eth0\", RUN+=\"/etc/sysconfig/allocate_vfs %k\"\nKERNEL==\"eth1\", RUN+=\"/etc/sysconfig/allocate_vfs %k\"\n",
        :group   => 'root',
        :mode    => '0755',
        :owner   => 'root',
        :replace => true
      )
      is_expected.to contain_file_line('call_ifup-local').with(
        :path => '/sbin/ifup-local',
        :line => '/etc/sysconfig/allocate_vfs $1',
      )
    end
  end
end

describe 'tripleo::host::sriov::numvfs_persistence' do

  describe 'confugure numvfs for persistence' do

    let :title do
      'numvfs'
    end

    let :params do
      {
        :name           => 'persistence',
        :vf_defs        => ['eth0:10:switchdev','eth1:8:legacy'],
        :content_string => "Hashbang\n",
        :udev_rules     => ""
      }
    end

    it 'configures persistence' do
      is_expected.to contain_file('/etc/sysconfig/allocate_vfs').with(
        :ensure  => 'file',
        :content => "Hashbang\nset -ex
set -o pipefail

if [ \"eth0\" == \"$1\" ]
then
  exec 1> >(logger -s -t $(basename $0)) 2>&1
  vendor_id=\"$(cat /sys/class/net/eth0/device/vendor)\"
  if [ \"$(cat /sys/class/net/eth0/device/sriov_numvfs)\" == \"0\" ]
  then
    echo 10 > /sys/class/net/eth0/device/sriov_numvfs
  else
    exit 0
  fi
  if [ $vendor_id == \"0x15b3\" ]
  then
    vfs_pci_list=$(grep PCI_SLOT_NAME /sys/class/net/eth0/device/virtfn*/uevent | cut -d'=' -f2)
    for pci in $vfs_pci_list
    do
      echo \"$pci\" > /sys/bus/pci/drivers/mlx5_core/unbind
    done
  fi
  interface_pci=$(grep PCI_SLOT_NAME /sys/class/net/eth0/device/uevent | cut -d'=' -f2)
  /usr/sbin/devlink dev eswitch set pci/\"$interface_pci\" mode switchdev
  /usr/sbin/ifup eth0
  if [[ \"$(/usr/sbin/devlink dev eswitch show pci/\"$interface_pci\")\" =~ \"mode switchdev\" ]]
  then
    echo \"PCI device $interface_pci set to mode switchdev.\"
  else
    echo \"Failed to set PCI device $interface_pci to mode switchdev.\"
    exit 1
  fi
  interface_device=$(cat /sys/class/net/eth0/device/device)
  if [ \"$interface_device\" == \"0x1013\" ] || [ \"$interface_device\" == \"0x1015\" ]
  then
    /usr/sbin/devlink dev eswitch set pci/\"$interface_pci\" inline-mode transport
  fi
  /usr/sbin/ethtool -K eth0 hw-tc-offload on
fi\n[ \"eth1\" == \"\$1\" ] && echo 8 > /sys/class/net/eth1/device/sriov_numvfs\n",
        :group   => 'root',
        :mode    => '0755',
        :owner   => 'root',
      )
      is_expected.to contain_file('/sbin/ifup-local').with(
        :group   => 'root',
        :mode    => '0755',
        :owner   => 'root',
        :content => '#!/bin/bash',
        :replace => false,
      )
      is_expected.to contain_file('/etc/udev/rules.d/70-tripleo-reset-sriov.rules').with(
        :ensure  => 'file',
        :content => "KERNEL==\"eth0\", RUN+=\"/etc/sysconfig/allocate_vfs %k\"\nKERNEL==\"eth1\", RUN+=\"/etc/sysconfig/allocate_vfs %k\"\n",
        :group   => 'root',
        :mode    => '0755',
        :owner   => 'root',
        :replace => true
      )
      is_expected.to contain_file_line('call_ifup-local').with(
        :path => '/sbin/ifup-local',
        :line => '/etc/sysconfig/allocate_vfs $1',
      )
    end
  end
end
