Fix CEL equality bug for structs will nil field not marked as omitempty
Kubernetes-commit: 66b8a8427cf0be6f6a87ea3384e7213696bdfd4c
This commit is contained in:
parent
eeced267ad
commit
c199f9d392
|
@ -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",
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue