Add sriov-network addon helm chart 36/120036/3
authorTodd Malsbary <todd.malsbary@intel.com>
Fri, 19 Mar 2021 22:07:32 +0000 (15:07 -0700)
committerTodd Malsbary <todd.malsbary@intel.com>
Tue, 4 May 2021 20:14:30 +0000 (13:14 -0700)
This chart deploys the CR used by the sriov-network-operator.

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

kud/deployment_infra/helm/sriov-network/.helmignore [new file with mode: 0644]
kud/deployment_infra/helm/sriov-network/Chart.yaml [new file with mode: 0644]
kud/deployment_infra/helm/sriov-network/templates/_helpers.tpl [new file with mode: 0644]
kud/deployment_infra/helm/sriov-network/templates/sriovnetwork.yaml [new file with mode: 0644]
kud/deployment_infra/helm/sriov-network/templates/sriovnetworknodepolicy.yaml [new file with mode: 0644]
kud/deployment_infra/helm/sriov-network/values.yaml [new file with mode: 0644]
kud/tests/sriov-network.sh [new file with mode: 0644]
kud/tests/sriov.sh

diff --git a/kud/deployment_infra/helm/sriov-network/.helmignore b/kud/deployment_infra/helm/sriov-network/.helmignore
new file mode 100644 (file)
index 0000000..0e8a0eb
--- /dev/null
@@ -0,0 +1,23 @@
+# Patterns to ignore when building packages.
+# This supports shell glob matching, relative path matching, and
+# negation (prefixed with !). Only one pattern per line.
+.DS_Store
+# Common VCS dirs
+.git/
+.gitignore
+.bzr/
+.bzrignore
+.hg/
+.hgignore
+.svn/
+# Common backup files
+*.swp
+*.bak
+*.tmp
+*.orig
+*~
+# Various IDEs
+.project
+.idea/
+*.tmproj
+.vscode/
diff --git a/kud/deployment_infra/helm/sriov-network/Chart.yaml b/kud/deployment_infra/helm/sriov-network/Chart.yaml
new file mode 100644 (file)
index 0000000..8cf3a1d
--- /dev/null
@@ -0,0 +1,24 @@
+# Copyright 2021 Intel Corporation, Inc
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+apiVersion: v2
+appVersion: 4.8.0
+description: |
+  SR-IOV CNI plugin and Device plugin configuration.
+name: sriov-network
+sources:
+ - https://github.com/k8snetworkplumbingwg/sriov-network-operator
+home: https://github.com/k8snetworkplumbingwg/sriov-network-operator
+type: application
+version: 0.1.0
diff --git a/kud/deployment_infra/helm/sriov-network/templates/_helpers.tpl b/kud/deployment_infra/helm/sriov-network/templates/_helpers.tpl
new file mode 100644 (file)
index 0000000..08baf04
--- /dev/null
@@ -0,0 +1,34 @@
+{{/* vim: set filetype=mustache: */}}
+{{/*
+Expand the name of the chart.
+*/}}
+{{- define "sriov-network.name" -}}
+{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+
+{{/*
+Create chart name and version as used by the chart label.
+*/}}
+{{- define "sriov-network.chart" -}}
+{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+
+{{/*
+Common labels
+*/}}
+{{- define "sriov-network.labels" -}}
+helm.sh/chart: {{ include "sriov-network.chart" . }}
+{{ include "sriov-network.selectorLabels" . }}
+{{- if .Chart.AppVersion }}
+app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
+{{- end }}
+app.kubernetes.io/managed-by: {{ .Release.Service }}
+{{- end -}}
+
+{{/*
+Selector labels
+*/}}
+{{- define "sriov-network.selectorLabels" -}}
+app.kubernetes.io/name: {{ include "sriov-network.name" . }}
+app.kubernetes.io/instance: {{ .Release.Name }}
+{{- end -}}
diff --git a/kud/deployment_infra/helm/sriov-network/templates/sriovnetwork.yaml b/kud/deployment_infra/helm/sriov-network/templates/sriovnetwork.yaml
new file mode 100644 (file)
index 0000000..550f00d
--- /dev/null
@@ -0,0 +1,40 @@
+{{- range $network := .Values.networks }}
+---
+apiVersion: sriovnetwork.openshift.io/v1
+kind: SriovNetwork
+metadata:
+  name: {{ $network.networkName }}
+  labels:
+    {{- include "sriov-network.labels" $ | nindent 4 }}
+spec:
+  {{- with $network.capabilities }}
+  capabilities: | {{ . | nindent 4 }}
+  {{- end }}
+  ipam: | {{ $network.ipam | nindent 4 }}
+  {{- if $network.linkState }}
+  linkState: {{ $network.linkState }}
+  {{- end }}
+  {{- if $network.maxTxRate }}
+  maxTxRate: {{ $network.maxTxRate }}
+  {{- end }}
+  {{- with $network.metaPlugins }}
+  metaPlugins: | {{ . | nindent 4 }}
+  {{- end }}
+  {{- if $network.minTxRate }}
+  minTxRate: {{ $network.minTxRate }}
+  {{- end }}
+  networkNamespace: {{ $network.networkNamespace }}
+  resourceName: {{ $network.resourceName }}
+  {{- if $network.spoofChk }}
+  spoofChk: {{ $network.spoofChk }}
+  {{- end }}
+  {{- if $network.trust }}
+  trust: {{ $network.trust }}
+  {{- end }}
+  {{- if $network.vlan }}
+  vlan: {{ $network.vlan }}
+  {{- end }}
+  {{- if $network.vlanQoS }}
+  vlanQoS: {{ $network.vlanQoS }}
+  {{- end }}
+{{- end }}
diff --git a/kud/deployment_infra/helm/sriov-network/templates/sriovnetworknodepolicy.yaml b/kud/deployment_infra/helm/sriov-network/templates/sriovnetworknodepolicy.yaml
new file mode 100644 (file)
index 0000000..382df56
--- /dev/null
@@ -0,0 +1,52 @@
+{{- range $policy := .Values.policies }}
+---
+apiVersion: sriovnetwork.openshift.io/v1
+kind: SriovNetworkNodePolicy
+metadata:
+  name: {{ $policy.policyName }}
+  labels:
+    {{- include "sriov-network.labels" $ | nindent 4 }}
+spec:
+  {{- if $policy.deviceType }}
+  deviceType: {{ $policy.deviceType }}
+  {{- end }}
+  {{- if $policy.eSwitchMode }}
+  eSwitchMode: {{ $policy.eSwitchMode }}
+  {{- end }}
+  nicSelector:
+    {{- if $policy.nicSelector.deviceID }}
+    deviceID: {{ $policy.nicSelector.deviceID | quote }}
+    {{- end }}
+    {{- if $policy.nicSelector.netFilter }}
+    netFilter: {{ $policy.nicSelector.netFilter | quote }}
+    {{- end }}
+    {{- with $policy.nicSelector.pfNames }}
+    pfNames:
+    {{- toYaml . | nindent 4 }}
+    {{- end }}
+    {{- with $policy.nicSelector.rootDevices }}
+    rootDevices:
+    {{- toYaml . | nindent 4 }}
+    {{- end }}
+    {{- if $policy.nicSelector.vendor }}
+    vendor: {{ $policy.nicSelector.vendor | quote }}
+    {{- end }}
+  {{- if $policy.isRdma }}
+  isRdma: {{ $policy.isRdma }}
+  {{- end }}
+  {{- if $policy.linkType }}
+  linkType: {{ $policy.linkType }}
+  {{- end }}
+  {{- if $policy.mtu }}
+  mtu: {{ $policy.mtu }}
+  {{- end }}
+  {{- with $policy.nodeSelector }}
+  nodeSelector:
+    {{- toYaml . | nindent 4 }}
+  {{- end }}
+  numVfs: {{ $policy.numVfs }}
+  {{- if $policy.priority }}
+  priority: {{ $policy.priority }}
+  {{- end }}
+  resourceName: {{ $policy.resourceName }}
+{{- end }}
\ No newline at end of file
diff --git a/kud/deployment_infra/helm/sriov-network/values.yaml b/kud/deployment_infra/helm/sriov-network/values.yaml
new file mode 100644 (file)
index 0000000..d9a3822
--- /dev/null
@@ -0,0 +1,144 @@
+nameOverride: ""
+
+policies:
+- # policyName is the name of the policy
+  policyName: "policy-xl710"
+
+  # nicSelector selects the NICs to be configured.  At least one of
+  # vendor, deviceId, pfNames, or rootDevices must be deined.
+  nicSelector:
+    # deviceID is the device hex code of SR-IOV device.
+    deviceID: "1583"
+
+    # netFilter is the infrastructure networking selection
+    # filter. Allowed values are
+    # "openstack/NetworkID:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
+    #netFilter: ""
+
+    # pfNames is a list of the SR-IOV PF names.
+    #pfNames: []
+
+    # rootDevices is a list of the PCI addresses of SR-IOV PFs.
+    #rootDevices: []
+
+    # vendor is the vendor hex code of SR-IOV device. Allowed values are
+    # "8086", "15b3".
+    vendor: "8086"
+
+  # nodeSelector selects the nodes to be configured.
+  nodeSelector:
+    feature.node.kubernetes.io/network-sriov.capable: "true"
+    feature.node.kubernetes.io/pci-0200_8086_1583.present: "true"
+
+  # numVfs is the Number of VFs for each PF
+  numVfs: 8
+
+  # resourceName is the SR-IOV Network device plugin endpoint.
+  resourceName: "intel_sriov_nic"
+
+- policyName: "policy-82599es"
+  nicSelector:
+    deviceID: "10fb"
+    vendor: "8086"
+  nodeSelector:
+    feature.node.kubernetes.io/network-sriov.capable: "true"
+    feature.node.kubernetes.io/pci-0200_8086_10fb.present: "true"
+  numVfs: 8
+  resourceName: "intel_sriov_nic"
+
+- policyName: "policy-i350"
+  nicSelector:
+    deviceID: "1521"
+    vendor: "8086"
+  nodeSelector:
+    feature.node.kubernetes.io/network-sriov.capable: "true"
+    feature.node.kubernetes.io/pci-0200_8086_1521.present: "true"
+  numVfs: 2
+  resourceName: "intel_sriov_nic"
+
+networks:
+- # networkName is the name of both the SriovNetwork and the created
+  # NetworkAttachmentDefinition custom resource.
+  networkName: "sriov-intel"
+
+  # networkNamespace of the NetworkAttachmentDefinition custom resource.
+  networkNamespace: "default"
+
+  # ipam configuration to be used for the network.
+  ipam: |
+    {
+      "type": "host-local",
+      "subnet": "10.56.206.0/24",
+      "routes": [{
+        "dst": "0.0.0.0/0"
+      }],
+      "gateway": "10.56.206.1"
+    }
+
+  #
+  # Optional values are listed below.
+  #
+
+  # deviceType is the driver type for configured VFs. Allowed values are
+  # "netdevice" and "vfio-pci".
+  #deviceType: "netdevice"
+
+  # eSwitchMode NIC Device Mode. Allowed values are "legacy" and
+  # "switchdev".
+  #eSwitchMode: "switchdev"
+
+  # isRdma defaults to false.
+  #isRdma: true
+
+  # linkType is the NIC link type. Allowed values are "eth", "ETH",
+  # "ib", and "IB".
+  #linkType: "eth"
+
+  # mtu of VF
+  #mtu: 9000
+
+  # priority of the policy, higher priority policies can override lower
+  # ones.
+  #priority: 99
+
+  # capabilities to be configured for this network. Capabilities
+  # supported: (mac|ips), e.g. '{"mac": true}'
+  #capabilities: |
+  #  {
+  #    "mac": true
+  #  }
+
+  # linkState of VF (enable|disable|auto).
+  #linkState: "enable"
+
+  # maxTxRate, in Mbps, for the VF. Defaults to 0 (no rate limiting).
+  #maxTxRate: 0
+
+  # metaPlugins configuration to be used in order to chain metaplugins
+  # to the SR-IOV interface returned by the operator.
+  #metaPlugins: |
+  #  {
+  #    "type": "tuning",
+  #    "sysctl": {
+  #      "net.core.somaxconn": "500"
+  #    }
+  #  }
+
+  # minTxRate, in Mbps, for the VF. Defaults to 0 (no rate
+  # limiting). min_tx_rate should be <= max_tx_rate.
+  #minTxRate: 0
+
+  # spoofChk for VF, (on|off)
+  #spoofChk: "off"
+
+  # trust mode of VF (on|off)
+  #trust: "off"
+
+  # vlan ID to assign for the VF. Defaults to 0.
+  #vlan: 0
+
+  # vlanQoS ID to assign for the VF. Defaults to 0.
+  #vlanQoS: 0
+
+  # resourceName is the SR-IOV Network device plugin endpoint.
+  resourceName: "intel_sriov_nic"
diff --git a/kud/tests/sriov-network.sh b/kud/tests/sriov-network.sh
new file mode 100644 (file)
index 0000000..3191c2f
--- /dev/null
@@ -0,0 +1,102 @@
+#!/bin/bash
+# SPDX-license-identifier: Apache-2.0
+##############################################################################
+# Copyright (c) 2018
+# 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 pipefail
+
+sriov_capable_nodes=$(kubectl get nodes -o json | jq -r '.items[] | select((.status.capacity."intel.com/intel_sriov_nic"|tonumber)>=2) | .metadata.name')
+if [ -z "$sriov_capable_nodes" ]; then
+    echo "SRIOV test case cannot run on the cluster."
+    exit 0
+else
+    echo "SRIOV option avaiable in the cluster."
+fi
+
+pod_name=pod-case-01
+
+function create_pod_yaml_with_single_VF {
+
+cat << POD > $HOME/$pod_name-single.yaml
+apiVersion: v1
+kind: Pod
+metadata:
+  name: pod-case-01
+  annotations:
+    k8s.v1.cni.cncf.io/networks: sriov-intel
+spec:
+  containers:
+  - name: test-pod
+    image: docker.io/centos/tools:latest
+    command:
+    - /sbin/init
+    resources:
+      requests:
+        intel.com/intel_sriov_nic: '1'
+      limits:
+        intel.com/intel_sriov_nic: '1'
+POD
+}
+
+function create_pod_yaml_with_multiple_VF {
+
+cat << POD > $HOME/$pod_name-multiple.yaml
+apiVersion: v1
+kind: Pod
+metadata:
+  name: pod-case-01
+  annotations:
+    k8s.v1.cni.cncf.io/networks: sriov-intel, sriov-intel
+spec:
+  containers:
+  - name: test-pod
+    image: docker.io/centos/tools:latest
+    command:
+    - /sbin/init
+    resources:
+      requests:
+        intel.com/intel_sriov_nic: '2'
+      limits:
+        intel.com/intel_sriov_nic: '2'
+POD
+}
+create_pod_yaml_with_single_VF
+create_pod_yaml_with_multiple_VF
+
+for podType in ${POD_TYPE:-single multiple}; do
+
+    kubectl delete pod $pod_name --ignore-not-found=true --now --wait
+    allocated_node_resource=$(kubectl describe node | grep "intel.com/intel_sriov_nic" | tail -n1 |awk '{print $(NF)}')
+
+    echo "The allocated resource of the node is: " $allocated_node_resource
+
+    kubectl create -f $HOME/$pod_name-$podType.yaml --validate=false
+
+        for pod in $pod_name; do
+            status_phase=""
+            while [[ $status_phase != "Running" ]]; do
+                new_phase=$(kubectl get pods $pod | awk 'NR==2{print $3}')
+                if [[ $new_phase != $status_phase ]]; then
+                    echo "$(date +%H:%M:%S) - $pod-$podType : $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
+        done
+    allocated_node_resource=$(kubectl describe node | grep "intel.com/intel_sriov_nic" | tail -n1 |awk '{print $(NF)}')
+
+    echo " The current resource allocation after the pod creation is: " $allocated_node_resource
+    kubectl delete pod $pod_name --now
+    echo "Test complete."
+
+done
index e617ea6..7aa97f0 100755 (executable)
@@ -10,7 +10,7 @@
 
 set -o pipefail
 
-sriov_capable_nodes=$(kubectl get nodes -o json | jq -r '.items[] | select(.status.capacity."intel.com/intel_sriov_700">="2") | .metadata.name')
+sriov_capable_nodes=$(kubectl get nodes -o json | jq -r '.items[] | select((.status.capacity."intel.com/intel_sriov_700"|tonumber)>=2) | .metadata.name')
 if [ -z "$sriov_capable_nodes" ]; then
     echo "SRIOV test case cannot run on the cluster."
     exit 0