Integrate Topology Manager 30/109630/16
authorchenjie1 <chenjie.xu@intel.com>
Sun, 28 Jun 2020 07:36:51 +0000 (15:36 +0800)
committermid_one <chenjie.xu@intel.com>
Mon, 10 Aug 2020 14:53:41 +0000 (22:53 +0800)
Integrate topology manager by utilizing ansible
scripts from openness.

Issue-ID: MULTICLOUD-1102
Signed-off-by: ChenjieXu <chenjie.xu@intel.com>
Change-Id: Ibaaf77e44c97edffe1ae03bf77c2422c89783e75

kud/deployment_infra/playbooks/configure-topology-manager.yml [new file with mode: 0644]
kud/deployment_infra/playbooks/kud-vars.yml
kud/hosting_providers/vagrant/installer.sh
kud/tests/topology-manager.sh [new file with mode: 0755]

diff --git a/kud/deployment_infra/playbooks/configure-topology-manager.yml b/kud/deployment_infra/playbooks/configure-topology-manager.yml
new file mode 100644 (file)
index 0000000..012bc8b
--- /dev/null
@@ -0,0 +1,66 @@
+---
+# SPDX-license-identifier: Apache-2.0
+##############################################################################
+# Copyright (c) 2020
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+
+- hosts: kube-node
+  tasks:
+    - name: Load kud variables
+      include_vars:
+        file: kud-vars.yml
+
+    - name: creating kubelet config
+      become: yes
+      blockinfile:
+        path: "{{ kubernetes_config_file }}"
+        marker: "# {mark} OpenNESS configuration - General"
+        create: yes
+        block: |
+          featureGates:
+            TopologyManager: {{ False if topology_manager.policy == 'none' else True }}
+      notify:
+      - enable and restart kubelet
+
+    - name: customize kubelet config - CPU Manager
+      become: yes
+      blockinfile:
+        path: "{{ kubernetes_config_file }}"
+        marker: "# {mark} OpenNESS configuration - CPU Manager"
+        block: |
+          cpuManagerPolicy: {{ cpu_manager.policy }}
+        state: "{{ 'present' if cpu_manager.policy == 'static' else 'absent' }}"
+      notify:
+      - remove cpu manager checkpoint file
+      - enable and restart kubelet
+
+    - name: customize kubelet config - Topology Manager
+      become: yes
+      blockinfile:
+        path: "{{ kubernetes_config_file }}"
+        marker: "# {mark} OpenNESS configuration - Topology Manager"
+        block: |
+          topologyManagerPolicy: {{ topology_manager.policy }}
+        state: "{{ 'absent' if topology_manager.policy == 'none' else 'present' }}"
+      notify:
+      - enable and restart kubelet
+
+  handlers:
+    - name: enable and restart kubelet
+      become: yes
+      systemd:
+        name: kubelet
+        daemon_reload: yes
+        enabled: yes
+        masked: no
+        state: restarted
+
+    - name: remove cpu manager checkpoint file
+      become: yes
+      file:
+        path: "{{ cpu_manager.checkpoint_file }}"
+        state: absent
index 4988a47..30e54f0 100644 (file)
@@ -79,3 +79,10 @@ optane_ipmctl_source_type: "tarball"
 optane_ipmctl_version: 02.00.00.3474
 optane_ipmctl_url: "https://launchpad.net/ubuntu/+archive/primary/+sourcefiles/ipmctl/{{ optane_package }}.tar.xz"
 optane_ipmctl_package: ipmctl_02.00.00.3474+really01.00.00.3469.orig
+
+kubernetes_config_file: "/etc/kubernetes/kubelet-config.yaml"
+cpu_manager:
+  policy: "static" # Options: none (disabled), static (default)
+  checkpoint_file: "/var/lib/kubelet/cpu_manager_state"
+topology_manager:
+  policy: "best-effort" # Options: none (disabled), best-effort (default), restricted, single-numa-node
index 27ab7fc..71e4d8b 100755 (executable)
@@ -155,13 +155,13 @@ 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
-    for addon in ${KUD_ADDONS:-virtlet ovn4nfv nfd sriov qat optane cmk}; do
+    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
     done
     echo "Run the test cases if testing_enabled is set to true."
     if [[ "${testing_enabled}" == "true" ]]; then
-        for addon in ${KUD_ADDONS:-multus virtlet ovn4nfv nfd sriov qat optane cmk}; do
+        for addon in ${KUD_ADDONS:-multus topology-manager virtlet ovn4nfv nfd sriov qat optane cmk}; do
             pushd $kud_tests
             bash ${addon}.sh
             popd
diff --git a/kud/tests/topology-manager.sh b/kud/tests/topology-manager.sh
new file mode 100755 (executable)
index 0000000..bbffd4d
--- /dev/null
@@ -0,0 +1,112 @@
+#!/bin/bash
+# SPDX-license-identifier: Apache-2.0
+##############################################################################
+# Copyright (c) 2020
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+
+set -o errexit
+set -o nounset
+set -o pipefail
+
+source _common.sh
+source _functions.sh
+
+ethernet_adpator_version=$( lspci | grep "Ethernet Controller XL710" | head -n 1 | cut -d " " -f 8 )
+if [ -z "$ethernet_adpator_version" ]; then
+    echo " Ethernet adapator version is not set. Topology manager test case cannot run on this machine"
+    exit 0
+else
+    echo "NIC card specs match. Topology manager option avaiable for this version."
+fi
+
+pod_name=pod-topology-manager
+csar_id=bd55cccc-bf34-11ea-b3de-0242ac130004
+
+function create_pod_yaml {
+    local csar_id=$1
+    _checks_args $csar_id
+    pushd ${CSAR_DIR}/${csar_id}
+
+    cat << POD > $pod_name.yaml
+kind: Pod
+apiVersion: v1
+metadata:
+  name: $pod_name
+  annotations:
+    k8s.v1.cni.cncf.io/networks: sriov-eno2
+spec:
+  containers:
+  - name: $pod_name
+    image: docker.io/centos/tools:latest
+    command:
+    - /sbin/init
+    resources:
+      limits:
+        cpu: "1"
+        memory: "500Mi"
+        intel.com/intel_sriov_700: '1'
+      requests:
+        cpu: "1"
+        memory: "500Mi"
+        intel.com/intel_sriov_700: '1'
+POD
+    popd
+}
+
+create_pod_yaml ${csar_id}
+kubectl delete pod $pod_name --ignore-not-found=true --now --wait
+kubectl create -f ${CSAR_DIR}/${csar_id}/$pod_name.yaml --validate=false
+
+status_phase=""
+while [[ $status_phase != "Running" ]]; do
+    new_phase=$(kubectl get pods $pod_name | awk 'NR==2{print $3}')
+    if [[ $new_phase != $status_phase ]]; then
+        echo "$(date +%H:%M:%S) - $pod_name : $new_phase"
+        status_phase=$new_phase
+    fi
+    if [[ $new_phase == "Running" ]]; then
+        echo "Pod is up and running.."
+    fi
+    if [[ $new_phase == "Err"* ]]; then
+        exit 1
+    fi
+done
+
+container_id=$(kubectl describe pod $pod_name | grep "Container ID" | awk '{print $3}' )
+container_id=${container_id#docker://}
+container_id=${container_id:0:12}
+
+apt-get install -y jq
+cpu_core=$(cat /var/lib/kubelet/cpu_manager_state | jq -r .| grep ${container_id} | awk -F ':' '{print $2}'| awk -F '"' '{print $2}')
+numa_node_number=$(lscpu | grep "NUMA node(s)" | awk -F ':' '{print $2}')
+for (( node=0; node<$numa_node_number; node++ )); do
+    ranges=$(lscpu | grep "NUMA node"$node | awk -F ':' '{print $2}')
+    ranges=(${ranges//,/ })
+    for range in ${ranges[@]}; do
+        min=$(echo $range | awk -F '-' '{print $1}')
+        max=$(echo $range | awk -F '-' '{print $2}')
+        if [ $cpu_core -ge $min ] && [ $cpu_core -le $max ]; then
+            cpu_numa_node=$node
+        fi
+    done
+done
+
+vf_pci=$(kubectl exec -it $pod_name env | grep PCIDEVICE_INTEL_COM_INTEL_SRIOV_700 | awk -F '=' '{print $2}' | sed 's/\r//g')
+vf_numa_node=$(cat /sys/bus/pci/devices/$vf_pci/numa_node)
+
+echo "The allocated cpu core is:" $cpu_core
+echo "The numa node of the allocated cpu core is:" $cpu_numa_node
+echo "The PCI address of the allocated vf is:" $vf_pci
+echo "The numa node of the allocated vf is:" $vf_numa_node
+if [ $cpu_numa_node == $vf_numa_node ]; then
+    echo "The allocated cpu core and vf are on the same numa node"
+else
+    echo "The allocated cpu core and vf are on different numa nodes"
+fi
+
+kubectl delete pod $pod_name --now
+echo "Test complete."