From 5d9bd257818ec6b3bda6f8c54d65502fcca611d4 Mon Sep 17 00:00:00 2001
From: Chris Hines <chris.hines@monash.edu>
Date: Wed, 13 Jul 2016 04:44:31 +0000
Subject: [PATCH] role to configure routes and mellanox device name. Add the
 drivers to this role latter

---
 roles/m3_networking/files/ibdev2netdev.sh     | 222 ++++++++++++++++++
 roles/m3_networking/tasks/main.yml            | 164 +++++++++++++
 roles/m3_networking/templates/90-mlx.rules.j2 |   7 +
 .../templates/Ethernet connection 1           |  17 ++
 .../templates/EthernetConnection              |  15 ++
 .../templates/MellanoxConnection              |  18 ++
 roles/m3_networking/templates/ifcfg-conf.j2   |   8 +
 roles/m3_networking/vars/mellanoxVars.yml     |   5 +
 8 files changed, 456 insertions(+)
 create mode 100755 roles/m3_networking/files/ibdev2netdev.sh
 create mode 100644 roles/m3_networking/tasks/main.yml
 create mode 100644 roles/m3_networking/templates/90-mlx.rules.j2
 create mode 100644 roles/m3_networking/templates/Ethernet connection 1
 create mode 100644 roles/m3_networking/templates/EthernetConnection
 create mode 100644 roles/m3_networking/templates/MellanoxConnection
 create mode 100644 roles/m3_networking/templates/ifcfg-conf.j2
 create mode 100644 roles/m3_networking/vars/mellanoxVars.yml

diff --git a/roles/m3_networking/files/ibdev2netdev.sh b/roles/m3_networking/files/ibdev2netdev.sh
new file mode 100755
index 00000000..4fb4708a
--- /dev/null
+++ b/roles/m3_networking/files/ibdev2netdev.sh
@@ -0,0 +1,222 @@
+#! /bin/bash
+#
+#modified by simon to print device name
+#
+
+
+usage()
+{
+        echo "$(basename $0) <options>"
+        echo "-h, --help                print help message"
+        echo "-v, --verbose             print more info"
+}
+
+function find_pdev()
+{
+	pdevlist=$(ls /sys/bus/pci/devices)
+
+	for pdev in $pdevlist; do
+		if [ -d /sys/bus/pci/devices/$pdev/infiniband ]; then
+			ibd=$(ls /sys/bus/pci/devices/$pdev/infiniband/)
+			if [ "x$ibd" == "x$1" ]; then
+				echo -n $pdev
+			fi
+		fi
+	done
+}
+
+case $1 in
+        "-h" | "--help")
+                usage
+                exit 0
+                ;;
+esac
+
+if (( $# > 1 )); then
+	usage
+	exit -1
+fi
+
+if (( $# == 1 )) && [ "$1" != "-v" ]; then
+	usage
+        exit -1
+fi
+
+ibdevs=$(ls /sys/class/infiniband/)
+
+devs=
+for netpath in /sys/class/net/*
+do
+    if (grep 0x15b3 ${netpath}/device/vendor > /dev/null 2>&1); then
+        devs="$devs ${netpath##*/}"
+    fi
+done
+
+if [ "x$devs" == "x" ]; then
+	# no relevant devices - quit immediately
+	exit
+fi
+
+for d in $devs; do
+	if [ -f /sys/class/net/$d/dev_id ]; then
+		oldstyle=n
+		break
+	fi
+done
+
+if [ "x$oldstyle" == "xn" ]; then
+	for d in $ibdevs; do
+		ibrsc=$(cat /sys/class/infiniband/$d/device/resource)
+		eths=$(ls /sys/class/net/)
+		for eth in $eths; do
+			filepath_resource=/sys/class/net/$eth/device/resource
+
+			if [ -f $filepath_resource ]; then
+				ethrsc=$(cat $filepath_resource)
+				if [ "x$ethrsc" == "x$ibrsc" ]; then
+					filepath_devid=/sys/class/net/$eth/dev_id
+					filepath_devport=/sys/class/net/$eth/dev_port
+					if [ -f $filepath_devid ]; then
+						port1=0
+						if [ -f $filepath_devport ]; then
+							port1=$(cat $filepath_devport)
+							port1=$(printf "%d" $port1)
+						fi
+
+						port=$(cat $filepath_devid)
+						port=$(printf "%d" $port)
+						if [ $port1 -gt $port ]; then
+							port=$port1
+						fi
+
+						port=$(( port + 1 ))
+
+						filepath_carrier=/sys/class/net/$eth/carrier
+
+						if [ -f $filepath_carrier ]; then
+							link_state=$(cat $filepath_carrier 2> /dev/null)
+        	                                        if (( link_state == 1 )); then
+                	                                        link_state="Up"
+                        	                        else
+                                	                        link_state="Down"
+                                        	        fi
+						else
+							link_state="NA"
+						fi
+
+						x=$(find_pdev $d)
+						if [ "$1" == "-v" ]; then
+							filepath_portstate=/sys/class/infiniband/$d/ports/$port/state
+							filepath_deviceid=/sys/class/infiniband/$d/device/device
+							filepath_fwver=/sys/class/infiniband/$d/fw_ver
+							filepath_vpd=/sys/class/infiniband/$d/device/vpd
+
+							# read port state
+							if [ -f $filepath_portstate ]; then
+								ibstate=$(printf "%-6s" $(cat $filepath_portstate | gawk '{print $2}'))
+							else
+								ibstate="NA"
+							fi
+
+							# read device
+							if [ -f $filepath_deviceid ]; then
+								devid=$(printf "MT%d" $(cat $filepath_deviceid))
+							else
+								devid="NA"
+							fi
+
+							# read FW version
+							if [ -f $filepath_fwver ]; then
+								fwver=$(cat $filepath_fwver)
+							else
+								fwver="NA"
+							fi
+
+							# read device description and part ID from the VPD
+							if [ -f $filepath_vpd ]; then
+								tmp=$IFS
+								IFS=":"
+								vpd_content=`cat $filepath_vpd`
+								devdesc=$(printf "%-15s" $(echo $vpd_content | strings | head -1))
+								partid=$(printf "%-11s" $(echo $vpd_content | strings | head -4 | tail -1 | gawk '{print $1}'))
+								IFS=$tmp
+							else
+								devdesc=""
+								partid="NA"
+							fi
+							#echo "$x $d ($devid - $partid) $devdesc fw $fwver port $port ($ibstate) ==> $eth ($link_state)"
+							echo -n "$eth"
+						else
+							echo -n "$eth"
+							#echo "$d port $port ==> $eth ($link_state)"
+						fi
+					fi
+				fi
+			fi
+		done
+	done
+else
+##########################
+### old style
+##########################
+
+function print_line()
+{
+	echo -n "$eth"
+#	echo "$1 port $2 <===> $3"
+
+}
+
+function find_guid()
+{
+	ibdevs=$(ls /sys/class/infiniband/)
+	for ibdev in $ibdevs; do
+		ports=$(ls /sys/class/infiniband/$ibdev/ports/)
+		for port in $ports; do
+			gids=$(ls /sys/class/infiniband/$ibdev/ports/$port/gids)
+			for gid in $gids; do
+				pguid=$(cat /sys/class/infiniband/$ibdev/ports/$port/gids/$gid | cut -b 21- | sed -e 's/://g')
+				if [ x$pguid == x$1 ]; then
+					print_line $ibdev $port $2
+				fi
+			done
+		done
+	done
+}
+
+function find_mac()
+{
+	ibdevs=$(ls /sys/class/infiniband/)
+	for ibdev in $ibdevs; do
+		ports=$(ls /sys/class/infiniband/$ibdev/ports/)
+		for port in $ports; do
+			gids=$(ls /sys/class/infiniband/$ibdev/ports/$port/gids)
+			for gid in $gids; do
+				first=$(cat /sys/class/infiniband/$ibdev/ports/$port/gids/$gid | cut -b 21-22)
+				first=$(( first ^ 2 ))
+				first=$(printf "%02x" $first)
+				second=$(cat /sys/class/infiniband/$ibdev/ports/$port/gids/$gid | cut -b 21- | sed -e 's/://g' | cut -b 3-6)
+				third=$(cat /sys/class/infiniband/$ibdev/ports/$port/gids/$gid | cut -b 21- | sed -e 's/://g' | cut -b 11-)
+				pmac=$first$second$third
+				if [ x$pmac == x$1 ]; then
+					print_line $ibdev $port $2
+				fi
+			done
+		done
+	done
+}
+
+ifcs=$(ifconfig -a | egrep '^eth|^ib' | gawk '{print $1}')
+
+for ifc in $ifcs; do
+	len=$(cat /sys/class/net/$ifc/addr_len)
+	if (( len == 20 )); then
+		guid=$(cat /sys/class/net/$ifc/address | cut -b 37- | sed -e 's/://g')
+		find_guid $guid $ifc
+	elif (( len == 6)); then
+		mac=$(cat /sys/class/net/$ifc/address | sed -e 's/://g')	
+		find_mac $mac $ifc
+	fi
+done
+fi
+
diff --git a/roles/m3_networking/tasks/main.yml b/roles/m3_networking/tasks/main.yml
new file mode 100644
index 00000000..e7caa626
--- /dev/null
+++ b/roles/m3_networking/tasks/main.yml
@@ -0,0 +1,164 @@
+---
+- include_vars: mellanoxVars.yml
+
+- name: install rules to make sure the Mellanox card is mlx0
+  template: src="90-mlx.rules.j2" dest="/etc/udev/rules.d/90-mlx.rules" mode=644 owner=root
+  become: true
+  become_user: root
+
+- name: set NetworkManager to use keyfiles
+  lineinfile: dest=/etc/NetworkManager/NetworkManager.conf regexp="plugins=.*" line="plugins=keyfile" backrefs=True
+  become: true
+  become_user: root
+
+- name: set configs 
+  template: src=EthernetConnection dest=/etc/NetworkManager/system-connections/EthernetConnection mode=600
+  become: true
+  become_user: root
+#
+#- name: set configs 
+#  template: src=MellanoxConnection dest=/etc/NetworkManager/system-connections/MellanoxConnection
+#  become: true
+#  become_user: root
+ 
+
+#- name: yum install dependencies
+#  yum:  name=perl,pciutils,gtk2,atk,cairo,gcc-gfortran,libxml2-python,tcsh,libnl,lsof,tcl,tk
+#  sudo: true
+#  ignore_errors: true
+#  when: ansible_os_family == "RedHat"
+#  
+#- name: test for existing installation of drivers
+#  command: ibv_devinfo
+#  sudo: true
+#  register: drivers_installed
+#  ignore_errors: true
+#
+#
+## This is NASTY. Don't upgrade production systems without taking them out of the queue first.
+##- name: yum update to upgrade kernel
+##  shell: "yum update -y"
+##  sudo: true
+##  ignore_errors: true
+##  when: ansible_os_family == "RedHat" and  drivers_installed|failed
+#  
+##
+## A REBOOT IS NEEDED AFTER a KERNEL UPDATE
+##
+##- name: restart machine
+##  shell: sleep 5; sudo shutdown -r now "Ansible updates triggered"
+##  async: 2
+##  poll: 0
+##  ignore_errors: true
+##  sudo: true
+##  when: ansible_os_family == "RedHat" and  drivers_installed|failed
+##
+##- name: waiting for server to come back
+##  local_action: wait_for host={{ ansible_host }} state=started port=22 delay=10 search_regex=OpenSSH
+##  sudo: false
+##
+##- name: waiting for server to come back number 2
+##  local_action: wait_for host={{ ansible_host }} state=started port=22 delay=10 search_regex=OpenSSH
+##  sudo: false
+#
+#
+#- name: copy driver source
+#  #make this a variable
+#  unarchive: copy=yes src="files/{{ MELLANOX_DRIVER_SRC }}.tgz" dest=/tmp 
+#  sudo: true
+#  #when: drivers_installed|failed and ansible_os_family=="RedHat" and ansible_distribution_major_version == "7"
+#  when: drivers_installed|failed 
+#
+#- name: install drivers
+#  shell: ./mlnxofedinstall -q
+#  args:
+#    #more changes
+#    chdir: "/tmp/{{ MELLANOX_DRIVER_SRC }}"
+#  sudo: true
+#  when: drivers_installed|failed 
+#
+##
+## get IP address before reboot
+##
+#- name: get IP address
+#  local_action: command ./scripts/map_ib_ip.pl {{ inventory_hostname }}
+#  register: ip_address
+#  sudo: false
+#  #when: drivers_installed|failed
+#
+##get the interface name
+#- name: get devide name of Mellanox Interface from  ibdev2netdev.sh
+#  script: ibdev2netdev.sh
+#  register: MELLANOX_DEVICE_NAME
+#  sudo: true
+#
+#- name: create /etc/sysconfig/network-scripts/ifcfg-<device name> 
+#  template: dest=/etc/sysconfig/network-scripts/ifcfg-{{ MELLANOX_DEVICE_NAME.stdout }}  src=ifcfg-conf.j2 owner=root group=root
+#  sudo: true
+#  when:  ansible_os_family=="RedHat"
+#
+#
+##ubuntu equivalent of previous command
+#- name: Ubuntu network interfaces - line 1
+#  lineinfile:
+#  args: 
+#      dest: /etc/network/interfaces
+#      line: auto {{ MELLANOX_DEVICE_NAME.stdout }}
+#      state: present
+#  sudo: true
+#  when: ansible_os_family=="Debian" and  drivers_installed|failed
+#
+#- name: Ubuntu network interfaces - line 2
+#  lineinfile:
+#  args: 
+#      dest: /etc/network/interfaces
+#      line: iface {{ MELLANOX_DEVICE_NAME.stdout }} inet static
+#      state: present
+#      insertafter: "auto {{ MELLANOX_DEVICE_NAME.stdout }}"
+#  sudo: true
+#  when: ansible_os_family=="Debian" and  drivers_installed|failed
+#
+#- name: Ubuntu network interfaces - line 3
+#  lineinfile:
+#  args: 
+#      dest: /etc/network/interfaces
+#      line: address {{ ip_address.stdout }}
+#      state: present
+#      insertafter: "iface {{ MELLANOX_DEVICE_NAME.stdout }} inet static"
+#  sudo: true
+#  when: ansible_os_family=="Debian" and  drivers_installed|failed
+##
+## A REBOOT IS NEEDED AFTER SUCCESSFUL INSTALL
+##
+#- name: restart machine
+#  shell: "sleep 5; sudo shutdown -r now"
+#  async: 2
+#  poll: 1
+#  ignore_errors: true
+#  sudo: true
+#  when: ansible_os_family=="RedHat" and  drivers_installed|failed
+#
+#- name: restart machine for Ubuntu -cos it is 'special'
+#  shell: "sleep 5; sudo shutdown -r now"
+#  async: 2
+#  poll: 1
+#  ignore_errors: true
+#  sudo: true
+#  when: ansible_os_family=="Debian" and  drivers_installed|failed
+#
+#- name: waiting for server to come back
+#  local_action: wait_for host={{ ansible_host }} state=started port=22 delay=10 search_regex=OpenSSH
+#  sudo: false
+#  when: drivers_installed|failed
+#
+#- name: waiting for server to come back 2
+#  local_action: wait_for host={{ ansible_host }} state=started port=22 delay=10 search_regex=OpenSSH
+#  when: drivers_installed|failed
+#
+#- name: bring up interface
+#  #variable=eth0 or ens6 or eth1
+#  command: ifup {{ MELLANOX_DEVICE_NAME.stdout }} 
+#  sudo: true
+#  when: ansible_os_family=="RedHat" and ansible_distribution_major_version == "7"
+#   
+#  
diff --git a/roles/m3_networking/templates/90-mlx.rules.j2 b/roles/m3_networking/templates/90-mlx.rules.j2
new file mode 100644
index 00000000..09fe9a36
--- /dev/null
+++ b/roles/m3_networking/templates/90-mlx.rules.j2
@@ -0,0 +1,7 @@
+KERNEL=="umad*", NAME="infiniband/%k" MODE="0666"
+KERNEL=="issm*", NAME="infiniband/%k"
+KERNEL=="ucm*", NAME="infiniband/%k", MODE="0666"
+KERNEL=="uverbs*", NAME="infiniband/%k", MODE="0666"
+KERNEL=="ucma", NAME="infiniband/%k", MODE="0666"
+KERNEL=="rdma_cm", NAME="infiniband/%k", MODE="0666"
+DRIVERS=="*mlx*", SUBSYSTEM=="net", ACTION=="add", NAME="mlx0", RUN+="/usr/bin/systemctl --no-block start mlnx_interface_mgr@%k.service"
diff --git a/roles/m3_networking/templates/Ethernet connection 1 b/roles/m3_networking/templates/Ethernet connection 1
new file mode 100644
index 00000000..36946f70
--- /dev/null
+++ b/roles/m3_networking/templates/Ethernet connection 1	
@@ -0,0 +1,17 @@
+[connection]
+id=Ethernet connection 1
+uuid=346d20c3-1fc9-4157-9d7f-dae14c4bccce
+type=ethernet
+permissions=
+secondaries=
+interface-name=mlx0
+
+
+[ipv4]
+address1=172.16.193.12/32
+dns-search=
+method=manual
+
+[ipv6]
+dns-search=
+method=auto
diff --git a/roles/m3_networking/templates/EthernetConnection b/roles/m3_networking/templates/EthernetConnection
new file mode 100644
index 00000000..2f72ae4e
--- /dev/null
+++ b/roles/m3_networking/templates/EthernetConnection
@@ -0,0 +1,15 @@
+[connection]
+id=EthernetConnection
+type=ethernet
+permissions=
+secondaries=
+
+[ipv4]
+dns-search=
+method=auto
+route1=118.138.240.0/21,172.16.207.254
+route2=130.194.0.0/16,172.16.207.254
+
+[ipv6]
+dns-search=
+method=auto
diff --git a/roles/m3_networking/templates/MellanoxConnection b/roles/m3_networking/templates/MellanoxConnection
new file mode 100644
index 00000000..eb62ff24
--- /dev/null
+++ b/roles/m3_networking/templates/MellanoxConnection
@@ -0,0 +1,18 @@
+[connection]
+id=MellanoxConnection
+type=infiniband
+interface-name=mlx0
+permissions=
+secondaries=
+
+[infiniband]
+transport-mode=datagram
+
+[ipv4]
+address1=172.16.192.12/32
+dns-search=
+method=manual
+
+[ipv6]
+dns-search=
+method=auto
diff --git a/roles/m3_networking/templates/ifcfg-conf.j2 b/roles/m3_networking/templates/ifcfg-conf.j2
new file mode 100644
index 00000000..ecd3c4f5
--- /dev/null
+++ b/roles/m3_networking/templates/ifcfg-conf.j2
@@ -0,0 +1,8 @@
+DEVICE={{ MELLANOX_DEVICE_NAME.stdout }}
+ONBOOT=yes
+NM_CONTROLLED=no
+BOOTPROTO=none
+IPADDR={{ ip_address.stdout }}
+PREFIX=22
+MTU=9000
+
diff --git a/roles/m3_networking/vars/mellanoxVars.yml b/roles/m3_networking/vars/mellanoxVars.yml
new file mode 100644
index 00000000..5b53fe8f
--- /dev/null
+++ b/roles/m3_networking/vars/mellanoxVars.yml
@@ -0,0 +1,5 @@
+---
+ #note. do not add '.tgz' to driver src. done in playbook
+ #MELLANOX_DRIVER_SRC: "{% if ansible_os_family == 'RedHat'  %}MLNX_OFED_LINUX-3.1-1.0.3-rhel7.1-x86_64-ext{% elif ansible_os_family == 'Debian' %}MLNX_OFED_LINUX-3.1-1.0.3-ubuntu14.04-x86_64{% endif %}"
+ #MELLANOX_DRIVER_SRC: "{% if ansible_os_family == 'RedHat'  %}MLNX_OFED_LINUX-3.1-1.0.3-rhel7.2-x86_64-ext{% elif ansible_os_family == 'Debian' %}MLNX_OFED_LINUX-3.1-1.0.3-ubuntu14.04-x86_64{% endif %}"
+ MELLANOX_DRIVER_SRC: "{% if ansible_os_family == 'RedHat'  %}MLNX_OFED_LINUX-3.2-2.0.0.0-rhel7.2-x86_64{% elif ansible_os_family == 'Debian' %}MLNX_OFED_LINUX-3.1-1.0.3-ubuntu14.04-x86_64{% endif %}"
-- 
GitLab