Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 13 additions & 2 deletions internal/controller/driver_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -1731,7 +1731,7 @@ func mergeDriverSpecs(dest, src *csiv1.DriverSpec) {
if dest.Annotations == nil {
dest.Annotations = src.Annotations
}
if dest.Affinity == nil {
if isAffinityEmpty(dest.Affinity) {
dest.Affinity = src.Affinity
}
if dest.Tolerations == nil {
Expand Down Expand Up @@ -1786,7 +1786,7 @@ func mergeDriverSpecs(dest, src *csiv1.DriverSpec) {
if dest.Annotations == nil {
dest.Annotations = src.Annotations
}
if dest.Affinity == nil {
if isAffinityEmpty(dest.Affinity) {
dest.Affinity = src.Affinity
}
if dest.Tolerations == nil {
Expand Down Expand Up @@ -1855,3 +1855,14 @@ func mergeDriverSpecs(dest, src *csiv1.DriverSpec) {
dest.CephFsClientType = src.CephFsClientType
}
}

// isAffinityEmpty checks if an Affinity is nil or has no meaningful content.
// This handles the case where an Affinity struct is non-nil but contains only
// empty nested structs (e.g., &Affinity{NodeAffinity: &NodeAffinity{}}).
func isAffinityEmpty(affinity *corev1.Affinity) bool {
if affinity == nil {
return true
}
return reflect.DeepEqual(affinity, &corev1.Affinity{}) ||
reflect.DeepEqual(affinity, &corev1.Affinity{NodeAffinity: &corev1.NodeAffinity{}})
}
42 changes: 40 additions & 2 deletions internal/controller/driver_controller_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,12 @@ import (

. "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega"
corev1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/types"
"sigs.k8s.io/controller-runtime/pkg/reconcile"

metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"

csiv1 "github.com/ceph/ceph-csi-operator/api/v1"
)

Expand Down Expand Up @@ -82,3 +82,41 @@ var _ = Describe("Driver Controller", func() {
})
})
})

var _ = Describe("isAffinityEmpty", func() {
It("should return true for nil affinity", func() {
Expect(isAffinityEmpty(nil)).To(BeTrue())
})

It("should return true for empty affinity struct", func() {
Expect(isAffinityEmpty(&corev1.Affinity{})).To(BeTrue())
})

It("should return true for affinity with empty NodeAffinity", func() {
affinity := &corev1.Affinity{
NodeAffinity: &corev1.NodeAffinity{},
}
Expect(isAffinityEmpty(affinity)).To(BeTrue())
})

It("should return false for affinity with NodeAffinity content", func() {
affinity := &corev1.Affinity{
NodeAffinity: &corev1.NodeAffinity{
RequiredDuringSchedulingIgnoredDuringExecution: &corev1.NodeSelector{
NodeSelectorTerms: []corev1.NodeSelectorTerm{
{
MatchExpressions: []corev1.NodeSelectorRequirement{
{
Key: "kubernetes.io/hostname",
Operator: corev1.NodeSelectorOpNotIn,
Values: []string{"node1"},
},
},
},
},
},
},
}
Expect(isAffinityEmpty(affinity)).To(BeFalse())
})
})