Build and deploy sriov module only on supported hosts. 49/113549/1
authorTodd Malsbary <todd.malsbary@intel.com>
Thu, 1 Oct 2020 21:17:59 +0000 (14:17 -0700)
committerTodd Malsbary <todd.malsbary@intel.com>
Mon, 5 Oct 2020 20:13:06 +0000 (13:13 -0700)
Building on the target host fixes a couple issues:
- In the containerized installer, the container image does not include
  the necessary kernel headers to build the module.
- The build and target host must have the same kernel version.  There
  is no guarantee of this.

The deploy uses NFD, similar to the QAT playbook.

Issue-ID: MULTICLOUD-1228
Signed-off-by: Todd Malsbary <todd.malsbary@intel.com>
Change-Id: I58705b73b8ce6d381b4649d5a20b8644e51e1b13

kud/deployment_infra/images/sriov-cni.yml
kud/deployment_infra/images/sriov-daemonset.yml
kud/deployment_infra/playbooks/configure-sriov.yml
kud/deployment_infra/playbooks/kud-vars.yml
kud/deployment_infra/playbooks/preconfigure-sriov.yml
kud/hosting_providers/containerized/installer.sh
kud/hosting_providers/vagrant/installer.sh

index 7503b87..570b00e 100644 (file)
@@ -21,6 +21,15 @@ spec:
         tier: node
         app: sriov-cni
     spec:
+      affinity:
+        nodeAffinity:
+          requiredDuringSchedulingIgnoredDuringExecution:
+            nodeSelectorTerms:
+            - matchExpressions:
+              - key: feature.node.kubernetes.io/network-sriov.capable
+                operator: In
+                values:
+                - "true"
       hostNetwork: true
       nodeSelector:
         beta.kubernetes.io/arch: amd64
index e392028..41b1cba 100644 (file)
@@ -46,6 +46,15 @@ spec:
         tier: node
         app: sriovdp
     spec:
+      affinity:
+        nodeAffinity:
+          requiredDuringSchedulingIgnoredDuringExecution:
+            nodeSelectorTerms:
+            - matchExpressions:
+              - key: feature.node.kubernetes.io/network-sriov.capable
+                operator: In
+                values:
+                - "true"
       hostNetwork: true
       hostPID: true
       nodeSelector:
index 45f276c..c0b7c9e 100644 (file)
@@ -9,21 +9,19 @@
 ##############################################################################
 
 - import_playbook: preconfigure-sriov.yml
-
 - hosts: localhost
-  become: yes
+  vars:
+    sriov_enabled: "{{ groups['kube-node'] | map('extract', hostvars, ['SRIOV_ENABLED']) | select() | list | length > 0 }}"
   tasks:
-    - debug:
-        var: SRIOV_NODE
     - name: Apply Multus
       shell: "/usr/local/bin/kubectl apply -f {{ playbook_dir }}/../images/multus-daemonset.yml"
-      when: SRIOV_NODE
+      when: sriov_enabled
     - name: Apply SRIOV CNI
       shell: "/usr/local/bin/kubectl apply -f {{ playbook_dir }}/../images/sriov-cni.yml"
-      when: SRIOV_NODE
+      when: sriov_enabled
     - name: Apply SRIOV DaemonSet
       shell: "/usr/local/bin/kubectl apply -f {{ playbook_dir }}/../images/sriov-daemonset.yml"
-      when: SRIOV_NODE
+      when: sriov_enabled
     - name: Apply SRIOV Network Attachment definition
       shell: "/usr/local/bin/kubectl apply -f {{ playbook_dir }}/sriov-nad.yml"
-      when: SRIOV_NODE
+      when: sriov_enabled
index 30e54f0..8f8ff5c 100644 (file)
@@ -62,7 +62,8 @@ helm_client_version: 2.13.1
 # kud playbooks not compatible with 2.8.0 - see MULTICLOUD-634
 ansible_version: 2.9.7
 
-sriov_dest: "{{ base_dest }}/sriov"
+sriov_pkgs: make,gcc
+sriov_dest: "{{ base_dest }}/sriov_driver"
 sriov_driver_source_type: "tarball"
 sriov_driver_version: 3.7.34
 sriov_driver_url: "https://downloadmirror.intel.com/28943/eng/iavf-{{ sriov_driver_version }}.tar.gz"
index 4c633ce..8c95aae 100644 (file)
 # http://www.apache.org/licenses/LICENSE-2.0
 ##############################################################################
 
-- hosts: kube-node
-  become: yes
-  pre_tasks:
-    - name: Create SRIOV driver folder in the target destination
-      file:
-        state: directory
-        path: "{{ item }}"
-      with_items:
-        - sriov
-    - copy:
-        src: "{{ playbook_dir }}/sriov_hardware_check.sh"
-        dest: sriov
-    - name: Changing perm of "sh", adding "+x"
-      shell: "chmod +x sriov_hardware_check.sh"
-      args:
-        chdir: "sriov"
-        warn: False
-    - name: Register SRIOV
-      shell: "echo {{ SRIOV | default(False) }}"
-    - name: Run the script and Re-evaluate the variable
-      command: sriov/sriov_hardware_check.sh
-      register: output
-    - set_fact:
-        _SRIOV: "{{ output.stdout }}"
-    - name: Recreate the conf file for every host
-      file:
-        path: /tmp/sriov.conf
-        state: absent
-      delegate_to: localhost
-    - lineinfile : >
-       dest=/tmp/sriov.conf
-       create=yes
-       line='{{_SRIOV}}'
-      delegate_to: localhost
-    - name: Clean the script and folder.
-      file:
-        path: sriov
-        state: absent
-
-# Run the following task only if the SRIOV is set to True
-# i.e when SRIOV hardware is available
 - hosts: localhost
   become: yes
   pre_tasks:
-    - name: Read SRIOV value from the conf file.
-      command: cat /tmp/sriov.conf
-      register: installer_output
-      become: yes
-    - set_fact:
-        SRIOV_NODE: "{{ installer_output.stdout }}"
     - name: Load kud variables
       include_vars:
         file: kud-vars.yml
-      when: SRIOV_NODE
   tasks:
-    - name: Create sriov folder
+    - name: Create SRIOV dest folder
       file:
         state: directory
         path: "{{ sriov_dest }}"
-      ignore_errors: yes
-      when: SRIOV_NODE
-    - name: Get SRIOV compatible driver
-      get_url: "url={{ sriov_driver_url }}  dest=/tmp/{{ sriov_package }}.tar.gz"
-      when: SRIOV_NODE
-    - name: Extract sriov source code
-      unarchive:
-         src: "/tmp/{{ sriov_package }}.tar.gz"
-         dest: "{{ sriov_dest }}"
-      when: SRIOV_NODE
-    - name: Build the default target
-      make:
-        chdir: "{{ sriov_dest }}/{{ sriov_package }}/src"
-      become: yes
-      when: SRIOV_NODE
-# Copy all the driver and install script into target node
+    - name: Fetching SRIOV driver
+      block:
+      - name: Download SRIOV driver tarball
+        get_url:
+          url: "{{ sriov_driver_url }}"
+          dest: "{{ sriov_dest }}/{{ sriov_package }}.tar.gz"
+
 - hosts: kube-node
   become: yes
   pre_tasks:
     - name: Load kud variables
       include_vars:
         file: kud-vars.yml
-      when: _SRIOV
   tasks:
-    - name: create SRIOV driver folder in the target destination
+    - name: Create a destination for driver folder in the target's /tmp
+      file:
+        state: directory
+        path: "{{ item }}"
+      with_items:
+        - "{{ base_dest }}/sriov/{{ sriov_package }}"
+    - name: Create SRIOV dest folder
+      file:
+        state: directory
+        path: "sriov"
+    - name: Register SRIOV env variable
+      shell: "echo {{ SRIOV_ENABLED | default(False) }}"
+    - name: Copy SRIOV check script to target
+      copy:
+        src: "{{ playbook_dir }}/sriov_hardware_check.sh"
+        dest: sriov
+        mode: 0755
+    - name: Run the script and re-evaluate the variable
+      command: "sriov/sriov_hardware_check.sh"
+      register: output
+    - debug:
+        var: output.stdout_lines
+    - set_fact:
+        SRIOV_ENABLED: "{{ output.stdout }}"
+    - debug:
+        var: output
+    - name: Clean the script and folder
+      file:
+        path: sriov
+        state: absent
+    - name: Install SRIOV compilation packges
+      package:
+        name: "{{ item }}"
+        state: present
+      with_items: "{{ sriov_pkgs }}"
+      when: SRIOV_ENABLED
+    - name: Extract SRIOV source code
+      unarchive:
+         src: "{{ sriov_dest }}/{{ sriov_package }}.tar.gz"
+         dest: "{{ base_dest }}/sriov"
+      when: SRIOV_ENABLED
+    - name: Build the SRIOV target
+      make:
+        chdir: "{{ base_dest }}/sriov/{{ sriov_package }}/src"
+      when: SRIOV_ENABLED
+    - name: Create SRIOV driver folder in the target destination
       file:
         state: directory
         path: "{{ item }}"
       with_items:
         - sriov_driver
-      when: _SRIOV
-    - copy:
-        src: "{{ sriov_dest }}/{{ sriov_package }}/src/iavf.ko"
+      when: SRIOV_ENABLED
+    - name: Copy SRIOV module to target destination
+      copy:
+        src: "{{ base_dest }}/sriov/{{ sriov_package }}/src/iavf.ko"
         dest: sriov_driver
-        remote_src: no
-      when: _SRIOV
-    - copy:
+        remote_src: yes
+      when: SRIOV_ENABLED
+    - name: Copy SRIOV install script to target
+      copy:
         src: "{{ playbook_dir }}/install_iavf_drivers.sh"
         dest: sriov_driver/install.sh
-        remote_src: no
-      when: _SRIOV
-    - name: Changing perm of "install.sh", adding "+x"
-      file: dest=sriov_driver/install.sh mode=a+x
-      when: _SRIOV
-    - name: Run a script with arguments
+        mode: 0755
+      when: SRIOV_ENABLED
+    - name: Run the install script with arguments
       shell: ./install.sh
       args:
         chdir: "sriov_driver"
-      when: _SRIOV
+      when: SRIOV_ENABLED
+    - name: Clean the SRIOV folder
+      file:
+        path: "{{ base_dest }}/sriov"
+        state: absent
index ae16b1d..c18829a 100755 (executable)
@@ -119,6 +119,8 @@ function install_addons {
     ansible-playbook $verbose -i \
         $kud_inventory $kud_playbooks/configure-kud.yml | \
         tee $cluster_log/setup-kud.log
+    # The order of KUD_ADDONS is important: some plugins (sriov, qat)
+    # require nfd to be enabled.
     for addon in ${KUD_ADDONS:-virtlet ovn4nfv nfd sriov cmk $plugins_name}; do
         echo "Deploying $addon using configure-$addon.yml playbook.."
         ansible-playbook $verbose -i \
index 71e4d8b..0ebc331 100755 (executable)
@@ -155,6 +155,8 @@ function install_addons {
     _install_ansible
     sudo ansible-galaxy install $verbose -r $kud_infra_folder/galaxy-requirements.yml --ignore-errors
     ansible-playbook $verbose -i $kud_inventory -e "base_dest=$HOME" $kud_playbooks/configure-kud.yml | sudo tee $log_folder/setup-kud.log
+    # The order of KUD_ADDONS is important: some plugins (sriov, qat)
+    # require nfd to be enabled.
     for addon in ${KUD_ADDONS:-topology-manager virtlet ovn4nfv nfd sriov qat optane cmk}; do
         echo "Deploying $addon using configure-$addon.yml playbook.."
         ansible-playbook $verbose -i $kud_inventory -e "base_dest=$HOME" $kud_playbooks/configure-${addon}.yml | sudo tee $log_folder/setup-${addon}.log