File 0008-Fix-node-labeller-bug-Remove-proper-labels-search-fo.patch of Package kubevirt.28988
From 61a279f6f6ccee4be80ac05d92dbdf20fb6a0866 Mon Sep 17 00:00:00 2001
From: Itamar Holder <iholder@redhat.com>
Date: Thu, 16 Jun 2022 09:59:26 +0300
Subject: [PATCH 1/3] Fix node labeller bug: Remove proper labels & search for
prefix
This commit fixes two node labeller bugs:
1. Remove host model CPU and required features from node properly
2. Remove labels by prefix instead of "Contains"
Signed-off-by: Itamar Holder <iholder@redhat.com>
---
.../node-labeller/node_labeller.go | 24 ++++++++++---------
1 file changed, 13 insertions(+), 11 deletions(-)
diff --git a/pkg/virt-handler/node-labeller/node_labeller.go b/pkg/virt-handler/node-labeller/node_labeller.go
index f7bf0cf78..76953cb7c 100644
--- a/pkg/virt-handler/node-labeller/node_labeller.go
+++ b/pkg/virt-handler/node-labeller/node_labeller.go
@@ -304,22 +304,24 @@ func (n *NodeLabeller) HostCapabilities() *api.Capabilities {
// removeLabellerLabels removes labels from node
func (n *NodeLabeller) removeLabellerLabels(node *v1.Node) {
for label := range node.Labels {
- if strings.Contains(label, util.DeprecatedLabelNamespace+util.DeprecatedcpuModelPrefix) ||
- strings.Contains(label, util.DeprecatedLabelNamespace+util.DeprecatedcpuFeaturePrefix) ||
- strings.Contains(label, util.DeprecatedLabelNamespace+util.DeprecatedHyperPrefix) ||
- strings.Contains(label, kubevirtv1.CPUFeatureLabel) ||
- strings.Contains(label, kubevirtv1.CPUModelLabel) ||
- strings.Contains(label, kubevirtv1.SupportedHostModelMigrationCPU) ||
- strings.Contains(label, kubevirtv1.CPUTimerLabel) ||
- strings.Contains(label, kubevirtv1.HypervLabel) ||
- strings.Contains(label, kubevirtv1.RealtimeLabel) ||
- strings.Contains(label, kubevirtv1.SEVLabel) {
+ if strings.HasPrefix(label, util.DeprecatedLabelNamespace+util.DeprecatedcpuModelPrefix) ||
+ strings.HasPrefix(label, util.DeprecatedLabelNamespace+util.DeprecatedcpuFeaturePrefix) ||
+ strings.HasPrefix(label, util.DeprecatedLabelNamespace+util.DeprecatedHyperPrefix) ||
+ strings.HasPrefix(label, kubevirtv1.CPUFeatureLabel) ||
+ strings.HasPrefix(label, kubevirtv1.CPUModelLabel) ||
+ strings.HasPrefix(label, kubevirtv1.SupportedHostModelMigrationCPU) ||
+ strings.HasPrefix(label, kubevirtv1.CPUTimerLabel) ||
+ strings.HasPrefix(label, kubevirtv1.HypervLabel) ||
+ strings.HasPrefix(label, kubevirtv1.RealtimeLabel) ||
+ strings.HasPrefix(label, kubevirtv1.SEVLabel) ||
+ strings.HasPrefix(label, kubevirtv1.HostModelCPULabel) ||
+ strings.HasPrefix(label, kubevirtv1.HostModelRequiredFeaturesLabel) {
delete(node.Labels, label)
}
}
for annotation := range node.Annotations {
- if strings.Contains(annotation, util.DeprecatedLabellerNamespaceAnnotation) {
+ if strings.HasPrefix(annotation, util.DeprecatedLabellerNamespaceAnnotation) {
delete(node.Annotations, annotation)
}
}
--
2.39.0
From 5353dbe992b8406ca5824e40a3f9a3f140db5edd Mon Sep 17 00:00:00 2001
From: Itamar Holder <iholder@redhat.com>
Date: Thu, 16 Jun 2022 10:31:34 +0300
Subject: [PATCH 2/3] Refactor node-labeller: add isNodeLabellerLabel()
function
Signed-off-by: Itamar Holder <iholder@redhat.com>
---
.../node-labeller/node_labeller.go | 38 +++++++++++++------
1 file changed, 26 insertions(+), 12 deletions(-)
diff --git a/pkg/virt-handler/node-labeller/node_labeller.go b/pkg/virt-handler/node-labeller/node_labeller.go
index 76953cb7c..ca40b4c4c 100644
--- a/pkg/virt-handler/node-labeller/node_labeller.go
+++ b/pkg/virt-handler/node-labeller/node_labeller.go
@@ -43,6 +43,21 @@ import (
"kubevirt.io/kubevirt/pkg/virt-handler/node-labeller/util"
)
+var nodeLabellerLabels = []string{
+ util.DeprecatedLabelNamespace + util.DeprecatedcpuModelPrefix,
+ util.DeprecatedLabelNamespace + util.DeprecatedcpuFeaturePrefix,
+ util.DeprecatedLabelNamespace + util.DeprecatedHyperPrefix,
+ kubevirtv1.CPUFeatureLabel,
+ kubevirtv1.CPUModelLabel,
+ kubevirtv1.SupportedHostModelMigrationCPU,
+ kubevirtv1.CPUTimerLabel,
+ kubevirtv1.HypervLabel,
+ kubevirtv1.RealtimeLabel,
+ kubevirtv1.SEVLabel,
+ kubevirtv1.HostModelCPULabel,
+ kubevirtv1.HostModelRequiredFeaturesLabel,
+}
+
//NodeLabeller struct holds informations needed to run node-labeller
type NodeLabeller struct {
clientset kubecli.KubevirtClient
@@ -304,18 +319,7 @@ func (n *NodeLabeller) HostCapabilities() *api.Capabilities {
// removeLabellerLabels removes labels from node
func (n *NodeLabeller) removeLabellerLabels(node *v1.Node) {
for label := range node.Labels {
- if strings.HasPrefix(label, util.DeprecatedLabelNamespace+util.DeprecatedcpuModelPrefix) ||
- strings.HasPrefix(label, util.DeprecatedLabelNamespace+util.DeprecatedcpuFeaturePrefix) ||
- strings.HasPrefix(label, util.DeprecatedLabelNamespace+util.DeprecatedHyperPrefix) ||
- strings.HasPrefix(label, kubevirtv1.CPUFeatureLabel) ||
- strings.HasPrefix(label, kubevirtv1.CPUModelLabel) ||
- strings.HasPrefix(label, kubevirtv1.SupportedHostModelMigrationCPU) ||
- strings.HasPrefix(label, kubevirtv1.CPUTimerLabel) ||
- strings.HasPrefix(label, kubevirtv1.HypervLabel) ||
- strings.HasPrefix(label, kubevirtv1.RealtimeLabel) ||
- strings.HasPrefix(label, kubevirtv1.SEVLabel) ||
- strings.HasPrefix(label, kubevirtv1.HostModelCPULabel) ||
- strings.HasPrefix(label, kubevirtv1.HostModelRequiredFeaturesLabel) {
+ if isNodeLabellerLabel(label) {
delete(node.Labels, label)
}
}
@@ -342,3 +346,13 @@ func isNodeRealtimeCapable() (bool, error) {
st := strings.Trim(string(ret), "\n")
return fmt.Sprintf("%s = -1", kernelSchedRealtimeRuntimeInMicrosecods) == st, nil
}
+
+func isNodeLabellerLabel(label string) bool {
+ for _, prefix := range nodeLabellerLabels {
+ if strings.HasPrefix(label, prefix) {
+ return true
+ }
+ }
+
+ return false
+}
--
2.39.0
From 3201e11c52685b6f239e8560c3c2f9d36523fece Mon Sep 17 00:00:00 2001
From: Itamar Holder <iholder@redhat.com>
Date: Thu, 16 Jun 2022 10:21:03 +0300
Subject: [PATCH 3/3] Test that node label labellers are being removed properly
Signed-off-by: Itamar Holder <iholder@redhat.com>
---
.../node-labeller/cpu_plugin_test.go | 166 ++++++++++++++++++
1 file changed, 166 insertions(+)
diff --git a/pkg/virt-handler/node-labeller/cpu_plugin_test.go b/pkg/virt-handler/node-labeller/cpu_plugin_test.go
index a3f4d8943..aee47373e 100644
--- a/pkg/virt-handler/node-labeller/cpu_plugin_test.go
+++ b/pkg/virt-handler/node-labeller/cpu_plugin_test.go
@@ -23,6 +23,7 @@ package nodelabeller
import (
"path"
+ "strings"
"github.com/golang/mock/gomock"
. "github.com/onsi/ginkgo/v2"
@@ -183,4 +184,169 @@ var _ = Describe("Node-labeller config", func() {
Expect(nlController.SEV.ReducedPhysBits).To(BeEmpty())
})
})
+
+ It("Make sure proper labels are removed on removeLabellerLabels()", func() {
+ node := &k8sv1.Node{
+ ObjectMeta: metav1.ObjectMeta{
+ Labels: nodeLabels,
+ },
+ }
+
+ nlController.removeLabellerLabels(node)
+
+ badKey := ""
+ for key, _ := range node.Labels {
+ for _, labellerPrefix := range nodeLabellerLabels {
+ if strings.HasPrefix(key, labellerPrefix) {
+ badKey = key
+ break
+ }
+ }
+ }
+ Expect(badKey).To(BeEmpty())
+ })
})
+
+var nodeLabels = map[string]string{
+ "beta.kubernetes.io/arch": "amd64",
+ "beta.kubernetes.io/os": "linux",
+ "cpu-feature.node.kubevirt.io/3dnowprefetch": "true",
+ "cpu-feature.node.kubevirt.io/abm": "true",
+ "cpu-feature.node.kubevirt.io/adx": "true",
+ "cpu-feature.node.kubevirt.io/aes": "true",
+ "cpu-feature.node.kubevirt.io/amd-ssbd": "true",
+ "cpu-feature.node.kubevirt.io/amd-stibp": "true",
+ "cpu-feature.node.kubevirt.io/arat": "true",
+ "cpu-feature.node.kubevirt.io/arch-capabilities": "true",
+ "cpu-feature.node.kubevirt.io/avx": "true",
+ "cpu-feature.node.kubevirt.io/avx2": "true",
+ "cpu-feature.node.kubevirt.io/bmi1": "true",
+ "cpu-feature.node.kubevirt.io/bmi2": "true",
+ "cpu-feature.node.kubevirt.io/clflushopt": "true",
+ "cpu-feature.node.kubevirt.io/erms": "true",
+ "cpu-feature.node.kubevirt.io/f16c": "true",
+ "cpu-feature.node.kubevirt.io/fma": "true",
+ "cpu-feature.node.kubevirt.io/fsgsbase": "true",
+ "cpu-feature.node.kubevirt.io/hypervisor": "true",
+ "cpu-feature.node.kubevirt.io/ibpb": "true",
+ "cpu-feature.node.kubevirt.io/ibrs": "true",
+ "cpu-feature.node.kubevirt.io/ibrs-all": "true",
+ "cpu-feature.node.kubevirt.io/invpcid": "true",
+ "cpu-feature.node.kubevirt.io/invtsc": "true",
+ "cpu-feature.node.kubevirt.io/md-clear": "true",
+ "cpu-feature.node.kubevirt.io/mds-no": "true",
+ "cpu-feature.node.kubevirt.io/movbe": "true",
+ "cpu-feature.node.kubevirt.io/mpx": "true",
+ "cpu-feature.node.kubevirt.io/pcid": "true",
+ "cpu-feature.node.kubevirt.io/pclmuldq": "true",
+ "cpu-feature.node.kubevirt.io/pdcm": "true",
+ "cpu-feature.node.kubevirt.io/pdpe1gb": "true",
+ "cpu-feature.node.kubevirt.io/popcnt": "true",
+ "cpu-feature.node.kubevirt.io/pschange-mc-no": "true",
+ "cpu-feature.node.kubevirt.io/rdctl-no": "true",
+ "cpu-feature.node.kubevirt.io/rdrand": "true",
+ "cpu-feature.node.kubevirt.io/rdseed": "true",
+ "cpu-feature.node.kubevirt.io/rdtscp": "true",
+ "cpu-feature.node.kubevirt.io/skip-l1dfl-vmentry": "true",
+ "cpu-feature.node.kubevirt.io/smap": "true",
+ "cpu-feature.node.kubevirt.io/smep": "true",
+ "cpu-feature.node.kubevirt.io/spec-ctrl": "true",
+ "cpu-feature.node.kubevirt.io/ss": "true",
+ "cpu-feature.node.kubevirt.io/ssbd": "true",
+ "cpu-feature.node.kubevirt.io/sse4.2": "true",
+ "cpu-feature.node.kubevirt.io/stibp": "true",
+ "cpu-feature.node.kubevirt.io/tsc-deadline": "true",
+ "cpu-feature.node.kubevirt.io/tsc_adjust": "true",
+ "cpu-feature.node.kubevirt.io/tsx-ctrl": "true",
+ "cpu-feature.node.kubevirt.io/umip": "true",
+ "cpu-feature.node.kubevirt.io/vme": "true",
+ "cpu-feature.node.kubevirt.io/vmx": "true",
+ "cpu-feature.node.kubevirt.io/x2apic": "true",
+ "cpu-feature.node.kubevirt.io/xgetbv1": "true",
+ "cpu-feature.node.kubevirt.io/xsave": "true",
+ "cpu-feature.node.kubevirt.io/xsavec": "true",
+ "cpu-feature.node.kubevirt.io/xsaveopt": "true",
+ "cpu-feature.node.kubevirt.io/xsaves": "true",
+ "cpu-model-migration.node.kubevirt.io/Broadwell-noTSX": "true",
+ "cpu-model-migration.node.kubevirt.io/Broadwell-noTSX-IBRS": "true",
+ "cpu-model-migration.node.kubevirt.io/Haswell-noTSX": "true",
+ "cpu-model-migration.node.kubevirt.io/Haswell-noTSX-IBRS": "true",
+ "cpu-model-migration.node.kubevirt.io/IvyBridge": "true",
+ "cpu-model-migration.node.kubevirt.io/IvyBridge-IBRS": "true",
+ "cpu-model-migration.node.kubevirt.io/Nehalem": "true",
+ "cpu-model-migration.node.kubevirt.io/Nehalem-IBRS": "true",
+ "cpu-model-migration.node.kubevirt.io/Opteron_G1": "true",
+ "cpu-model-migration.node.kubevirt.io/Opteron_G2": "true",
+ "cpu-model-migration.node.kubevirt.io/Penryn": "true",
+ "cpu-model-migration.node.kubevirt.io/SandyBridge": "true",
+ "cpu-model-migration.node.kubevirt.io/SandyBridge-IBRS": "true",
+ "cpu-model-migration.node.kubevirt.io/Skylake-Client-IBRS": "true",
+ "cpu-model-migration.node.kubevirt.io/Skylake-Client-noTSX-IBRS": "true",
+ "cpu-model-migration.node.kubevirt.io/Westmere": "true",
+ "cpu-model-migration.node.kubevirt.io/Westmere-IBRS": "true",
+ "cpu-model.node.kubevirt.io/Broadwell-noTSX": "true",
+ "cpu-model.node.kubevirt.io/Broadwell-noTSX-IBRS": "true",
+ "cpu-model.node.kubevirt.io/Haswell-noTSX": "true",
+ "cpu-model.node.kubevirt.io/Haswell-noTSX-IBRS": "true",
+ "cpu-model.node.kubevirt.io/IvyBridge": "true",
+ "cpu-model.node.kubevirt.io/IvyBridge-IBRS": "true",
+ "cpu-model.node.kubevirt.io/Nehalem": "true",
+ "cpu-model.node.kubevirt.io/Nehalem-IBRS": "true",
+ "cpu-model.node.kubevirt.io/Opteron_G1": "true",
+ "cpu-model.node.kubevirt.io/Opteron_G2": "true",
+ "cpu-model.node.kubevirt.io/Penryn": "true",
+ "cpu-model.node.kubevirt.io/SandyBridge": "true",
+ "cpu-model.node.kubevirt.io/SandyBridge-IBRS": "true",
+ "cpu-model.node.kubevirt.io/Skylake-Client-noTSX-IBRS": "true",
+ "cpu-model.node.kubevirt.io/Westmere": "true",
+ "cpu-model.node.kubevirt.io/Westmere-IBRS": "true",
+ "cpu-timer.node.kubevirt.io/tsc-frequency": "2111998000",
+ "cpu-timer.node.kubevirt.io/tsc-scalable": "false",
+ "cpu-vendor.node.kubevirt.io/Intel": "true",
+ "cpumanager": "false",
+ "host-model-cpu.node.kubevirt.io/Skylake-Client-IBRS": "true",
+ "host-model-required-features.node.kubevirt.io/amd-ssbd": "true",
+ "host-model-required-features.node.kubevirt.io/amd-stibp": "true",
+ "host-model-required-features.node.kubevirt.io/arch-capabilities": "true",
+ "host-model-required-features.node.kubevirt.io/clflushopt": "true",
+ "host-model-required-features.node.kubevirt.io/hypervisor": "true",
+ "host-model-required-features.node.kubevirt.io/ibpb": "true",
+ "host-model-required-features.node.kubevirt.io/ibrs": "true",
+ "host-model-required-features.node.kubevirt.io/ibrs-all": "true",
+ "host-model-required-features.node.kubevirt.io/invtsc": "true",
+ "host-model-required-features.node.kubevirt.io/md-clear": "true",
+ "host-model-required-features.node.kubevirt.io/mds-no": "true",
+ "host-model-required-features.node.kubevirt.io/pdcm": "true",
+ "host-model-required-features.node.kubevirt.io/pdpe1gb": "true",
+ "host-model-required-features.node.kubevirt.io/pschange-mc-no": "true",
+ "host-model-required-features.node.kubevirt.io/rdctl-no": "true",
+ "host-model-required-features.node.kubevirt.io/skip-l1dfl-vmentry": "true",
+ "host-model-required-features.node.kubevirt.io/ss": "true",
+ "host-model-required-features.node.kubevirt.io/ssbd": "true",
+ "host-model-required-features.node.kubevirt.io/stibp": "true",
+ "host-model-required-features.node.kubevirt.io/tsc_adjust": "true",
+ "host-model-required-features.node.kubevirt.io/tsx-ctrl": "true",
+ "host-model-required-features.node.kubevirt.io/umip": "true",
+ "host-model-required-features.node.kubevirt.io/vmx": "true",
+ "host-model-required-features.node.kubevirt.io/xsaves": "true",
+ "hyperv.node.kubevirt.io/base": "true",
+ "hyperv.node.kubevirt.io/frequencies": "true",
+ "hyperv.node.kubevirt.io/ipi": "true",
+ "hyperv.node.kubevirt.io/reenlightenment": "true",
+ "hyperv.node.kubevirt.io/reset": "true",
+ "hyperv.node.kubevirt.io/runtime": "true",
+ "hyperv.node.kubevirt.io/synic": "true",
+ "hyperv.node.kubevirt.io/synic2": "true",
+ "hyperv.node.kubevirt.io/synictimer": "true",
+ "hyperv.node.kubevirt.io/time": "true",
+ "hyperv.node.kubevirt.io/tlbflush": "true",
+ "hyperv.node.kubevirt.io/vpindex": "true",
+ "kubernetes.io/arch": "amd64",
+ "kubernetes.io/hostname": "node01",
+ "kubernetes.io/os": "linux",
+ "kubevirt.io/schedulable": "true",
+ "node-role.kubernetes.io/control-plane": "",
+ "node-role.kubernetes.io/master": "",
+ "node.kubernetes.io/exclude-from-external-load-balancers": "",
+ "scheduling.node.kubevirt.io/tsc-frequency-2111998000": "true",
+}
--
2.39.0