mirror of
https://github.com/vmware-tanzu/velero.git
synced 2026-01-07 13:55:20 +00:00
issue-7036: make affinity as list and take 1st one
Signed-off-by: Lyndon-Li <lyonghui@vmware.com>
This commit is contained in:
@@ -286,8 +286,8 @@ func (s *nodeAgentServer) run() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var loadAffinity *nodeagent.LoadAffinity
|
var loadAffinity *nodeagent.LoadAffinity
|
||||||
if s.dataPathConfigs != nil {
|
if s.dataPathConfigs != nil && len(s.dataPathConfigs.LoadAffinity) > 0 {
|
||||||
loadAffinity = s.dataPathConfigs.LoadAffinity
|
loadAffinity = s.dataPathConfigs.LoadAffinity[0]
|
||||||
}
|
}
|
||||||
dataUploadReconciler := controller.NewDataUploadReconciler(s.mgr.GetClient(), s.kubeClient, s.csiSnapshotClient.SnapshotV1(), s.dataPathMgr, loadAffinity, repoEnsurer, clock.RealClock{}, credentialGetter, s.nodeName, s.fileSystem, s.config.dataMoverPrepareTimeout, s.logger, s.metrics)
|
dataUploadReconciler := controller.NewDataUploadReconciler(s.mgr.GetClient(), s.kubeClient, s.csiSnapshotClient.SnapshotV1(), s.dataPathMgr, loadAffinity, repoEnsurer, clock.RealClock{}, credentialGetter, s.nodeName, s.fileSystem, s.config.dataMoverPrepareTimeout, s.logger, s.metrics)
|
||||||
s.attemptDataUploadResume(dataUploadReconciler)
|
s.attemptDataUploadResume(dataUploadReconciler)
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ package exposer
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"reflect"
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
@@ -35,6 +36,7 @@ import (
|
|||||||
corev1 "k8s.io/api/core/v1"
|
corev1 "k8s.io/api/core/v1"
|
||||||
|
|
||||||
velerov1 "github.com/vmware-tanzu/velero/pkg/apis/velero/v1"
|
velerov1 "github.com/vmware-tanzu/velero/pkg/apis/velero/v1"
|
||||||
|
"github.com/vmware-tanzu/velero/pkg/nodeagent"
|
||||||
velerotest "github.com/vmware-tanzu/velero/pkg/test"
|
velerotest "github.com/vmware-tanzu/velero/pkg/test"
|
||||||
"github.com/vmware-tanzu/velero/pkg/util/boolptr"
|
"github.com/vmware-tanzu/velero/pkg/util/boolptr"
|
||||||
|
|
||||||
@@ -718,3 +720,114 @@ func TestPeekExpose(t *testing.T) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestToSystemAffinity(t *testing.T) {
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
loadAffinity *nodeagent.LoadAffinity
|
||||||
|
expected *corev1.Affinity
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "loadAffinity is nil",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "loadAffinity is empty",
|
||||||
|
loadAffinity: &nodeagent.LoadAffinity{},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "with match label",
|
||||||
|
loadAffinity: &nodeagent.LoadAffinity{
|
||||||
|
NodeSelector: metav1.LabelSelector{
|
||||||
|
MatchLabels: map[string]string{
|
||||||
|
"key-1": "value-1",
|
||||||
|
"key-2": "value-2",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
expected: &corev1.Affinity{
|
||||||
|
NodeAffinity: &corev1.NodeAffinity{
|
||||||
|
RequiredDuringSchedulingIgnoredDuringExecution: &corev1.NodeSelector{
|
||||||
|
NodeSelectorTerms: []corev1.NodeSelectorTerm{
|
||||||
|
{
|
||||||
|
MatchExpressions: []corev1.NodeSelectorRequirement{
|
||||||
|
{
|
||||||
|
Key: "key-1",
|
||||||
|
Values: []string{"value-1"},
|
||||||
|
Operator: corev1.NodeSelectorOpIn,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Key: "key-2",
|
||||||
|
Values: []string{"value-2"},
|
||||||
|
Operator: corev1.NodeSelectorOpIn,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "with match expression",
|
||||||
|
loadAffinity: &nodeagent.LoadAffinity{
|
||||||
|
NodeSelector: metav1.LabelSelector{
|
||||||
|
MatchLabels: map[string]string{
|
||||||
|
"key-1": "value-1",
|
||||||
|
"key-2": "value-2",
|
||||||
|
},
|
||||||
|
MatchExpressions: []metav1.LabelSelectorRequirement{
|
||||||
|
{
|
||||||
|
Key: "key-3",
|
||||||
|
Values: []string{"value-3-1", "value-3-2"},
|
||||||
|
Operator: metav1.LabelSelectorOpNotIn,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Key: "key-4",
|
||||||
|
Values: []string{"value-4-1", "value-4-2", "value-4-3"},
|
||||||
|
Operator: metav1.LabelSelectorOpDoesNotExist,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
expected: &corev1.Affinity{
|
||||||
|
NodeAffinity: &corev1.NodeAffinity{
|
||||||
|
RequiredDuringSchedulingIgnoredDuringExecution: &corev1.NodeSelector{
|
||||||
|
NodeSelectorTerms: []corev1.NodeSelectorTerm{
|
||||||
|
{
|
||||||
|
MatchExpressions: []corev1.NodeSelectorRequirement{
|
||||||
|
{
|
||||||
|
Key: "key-1",
|
||||||
|
Values: []string{"value-1"},
|
||||||
|
Operator: corev1.NodeSelectorOpIn,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Key: "key-2",
|
||||||
|
Values: []string{"value-2"},
|
||||||
|
Operator: corev1.NodeSelectorOpIn,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Key: "key-3",
|
||||||
|
Values: []string{"value-3-1", "value-3-2"},
|
||||||
|
Operator: corev1.NodeSelectorOpNotIn,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Key: "key-4",
|
||||||
|
Values: []string{"value-4-1", "value-4-2", "value-4-3"},
|
||||||
|
Operator: corev1.NodeSelectorOpDoesNotExist,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, test := range tests {
|
||||||
|
t.Run(test.name, func(t *testing.T) {
|
||||||
|
affinity := toSystemAffinity(test.loadAffinity)
|
||||||
|
assert.Equal(t, true, reflect.DeepEqual(affinity, test.expected))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -68,7 +68,7 @@ type Configs struct {
|
|||||||
LoadConcurrency *LoadConcurrency `json:"loadConcurrency,omitempty"`
|
LoadConcurrency *LoadConcurrency `json:"loadConcurrency,omitempty"`
|
||||||
|
|
||||||
// LoadAffinity is the config for data path load affinity.
|
// LoadAffinity is the config for data path load affinity.
|
||||||
LoadAffinity *LoadAffinity `json:"loadAffinity,omitempty"`
|
LoadAffinity []*LoadAffinity `json:"loadAffinity,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsRunning checks if the node agent daemonset is running properly. If not, return the error found
|
// IsRunning checks if the node agent daemonset is running properly. If not, return the error found
|
||||||
|
|||||||
Reference in New Issue
Block a user