Fix CEL equality bug for structs will nil field not marked as omitempty

Kubernetes-commit: 66b8a8427cf0be6f6a87ea3384e7213696bdfd4c
This commit is contained in:
Joe Betz 2025-04-30 09:16:44 -04:00 committed by Kubernetes Publisher
parent eeced267ad
commit c199f9d392
2 changed files with 18 additions and 4 deletions

View File

@ -318,6 +318,16 @@ func TestToValue(t *testing.T) {
"s2": struct2,
},
},
{
name: "compare: identical complex structs",
expression: "c1 == c2",
activation: map[string]typedValue{"c1": complex1, "c2": complex1Again},
},
{
name: "compare: different complex structs",
expression: "c1 != c2",
activation: map[string]typedValue{"c1": complex1, "c2": complex2},
},
{
name: "compare: struct and pointer to identical struct",
expression: "s1 == s1_ptr",

View File

@ -598,13 +598,17 @@ func (t *unstructuredMap) Equal(other ref.Val) ref.Val {
if t.Size() != oMap.Size() {
return types.False
}
for key, value := range t.value {
if propSchema, ok := t.propSchema(key); ok {
ov, found := oMap.Find(types.String(key))
if !found {
if _, ok := t.propSchema(key); ok {
v, found := t.Find(types.String(key))
ov, oFound := oMap.Find(types.String(key))
if found != oFound {
return types.False
}
v := UnstructuredToVal(value, propSchema)
if !found {
continue
}
vEq := v.Equal(ov)
if vEq != types.True {
return vEq // either false or error