add python compatibility module
[multicloud/k8s.git] / kud / deployment_infra / playbooks / install_iavf_drivers.sh
1 #!/bin/bash
2
3 # Based on:
4 # https://gerrit.akraino.org/r/#/c/icn/+/1359/1/deploy/kud-plugin-addons/device-plugins/sriov/driver/install_iavf_drivers.sh
5
6 nic_models=(X710 XL710 X722)
7 nic_drivers=(i40e)
8 device_checkers=(is_not_used is_driver_match is_model_match)
9
10 function install_iavf_driver {
11     local ifname=$1
12
13     echo "Installing modules..."
14     echo "Installing i40evf blacklist file..."
15     mkdir -p "/etc/modprobe.d/"
16     echo "blacklist i40evf" > "/etc/modprobe.d/iavf-blacklist-i40evf.conf"
17
18     kver=`uname -a | awk '{print $3}'`
19     install_mod_dir=/lib/modules/$kver/updates/drivers/net/ethernet/intel/iavf/
20     echo "Installing driver in $install_mod_dir"
21     mkdir -p $install_mod_dir
22     cp iavf.ko $install_mod_dir
23
24     echo "Installing kernel module i40evf..."
25     depmod -a
26     modprobe i40evf
27     modprobe iavf
28
29     echo "Enabling VF on interface $ifname..."
30     echo "/sys/class/net/$ifname/device/sriov_numvfs"
31     echo '8' > /sys/class/net/$ifname/device/sriov_numvfs
32 }
33
34 function is_not_used {
35     local ifname=$1
36     route_info=`ip route show | grep $ifname`
37     if [ -z "$route_info" ]; then
38         return 1
39     else
40         return 0
41     fi
42 }
43
44 function is_driver_match {
45     local ifname=$1
46     driver=`cat /sys/class/net/$ifname/device/uevent | grep DRIVER | cut -f2 -d "="`
47     if [ ! -z "$driver" ]; then
48         for nic_driver in ${nic_drivers[@]}; do
49             if [ "$driver" = "$nic_driver" ]; then
50                 return 1
51             fi
52         done
53     fi
54     return 0
55 }
56
57 function is_model_match {
58     local ifname=$1
59     pci_addr=`cat /sys/class/net/$ifname/device/uevent | grep PCI_SLOT_NAME | cut -f2 -d "=" | cut -f2,3 -d ":"`
60     if [ ! -z "$pci_addr" ]; then
61         for nic_model in ${nic_models[@]}; do
62             model_match=$(lspci | grep $pci_addr | grep $nic_model)
63             if [ ! -z "$model_match" ]; then
64                 return 1
65             fi
66         done
67     fi
68     return 0
69 }
70
71 function get_sriov_ifname {
72     for net_device in /sys/class/net/*/ ; do
73         if [ -e $net_device/device/sriov_numvfs ] ; then
74             ifname=$(basename $net_device)
75             for device_checker in ${device_checkers[@]}; do
76                 eval $device_checker $ifname
77                 if [ "$?" = "0" ]; then
78                     ifname=""
79                     break
80                 fi
81             done
82             if [ ! -z "$ifname" ]; then
83                 echo $ifname
84                 return
85             fi
86         fi
87     done
88     echo ''
89 }
90
91 if [ $# -ne 1 ] ; then
92     ifname=$(get_sriov_ifname)
93     if [ -z "$ifname" ]; then
94         echo "Cannot find Nic with SRIOV support."
95     else
96         install_iavf_driver $ifname
97     fi
98 else
99     ifname=$1
100     if [ ! -e /sys/class/net/$ifname/device/sriov_numvfs ] ; then
101         echo "${ifname} is not a valid sriov interface"
102     else
103         install_iavf_driver $ifname
104     fi
105 fi