diff --git a/go.mod b/go.mod index bdc0293ec..47be40779 100644 --- a/go.mod +++ b/go.mod @@ -49,7 +49,7 @@ require ( gopkg.in/go-jose/go-jose.v2 v2.6.3 gopkg.in/natefinch/lumberjack.v2 v2.2.1 k8s.io/api v0.0.0-20250503031400-f7e72be095ee - k8s.io/apimachinery v0.0.0-20250503031111-512f488de379 + k8s.io/apimachinery v0.0.0-20250506031221-863c50fec75c k8s.io/client-go v0.0.0-20250503031754-7aa362d5dd59 k8s.io/component-base v0.0.0-20250503032835-394b28e84ba2 k8s.io/klog/v2 v2.130.1 diff --git a/go.sum b/go.sum index a8958e7a5..5f2d5c409 100644 --- a/go.sum +++ b/go.sum @@ -369,8 +369,8 @@ honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= k8s.io/api v0.0.0-20250503031400-f7e72be095ee h1:+YExLdNpiASfnQXQfpyLIGIps0RcJPNt7NdiCVH8Bys= k8s.io/api v0.0.0-20250503031400-f7e72be095ee/go.mod h1:AsuSCzGYZszSLf5GB+qx8FBGGirk0I/TZUkQJFsPRAQ= -k8s.io/apimachinery v0.0.0-20250503031111-512f488de379 h1:SRKtgNyQVTGF7yOs8CXK9AhZMd/1g5h4YlHAkYVXq5Y= -k8s.io/apimachinery v0.0.0-20250503031111-512f488de379/go.mod h1:b+h1nads2hmyfwvvorkgHUriRTTaJ2p2mk0l03sESn8= +k8s.io/apimachinery v0.0.0-20250506031221-863c50fec75c h1:hSSNaL3pe6mN9q2QvuUT9PPDpgdfOoUTEWvBodVOM4Y= +k8s.io/apimachinery v0.0.0-20250506031221-863c50fec75c/go.mod h1:b+h1nads2hmyfwvvorkgHUriRTTaJ2p2mk0l03sESn8= k8s.io/client-go v0.0.0-20250503031754-7aa362d5dd59 h1:n8NUttTLfP515BaQfYTG+ktgOhXknisqBRg2ttvGMzM= k8s.io/client-go v0.0.0-20250503031754-7aa362d5dd59/go.mod h1:M+V5ZD54hCEexMLVuebHThquNdpXZdNqpuDCoD1LjSM= k8s.io/component-base v0.0.0-20250503032835-394b28e84ba2 h1:Sn22KR7kHIivpSgJYqNzt5d2mBYBipLAXLK02SlVqHM= diff --git a/pkg/cel/common/values_test.go b/pkg/cel/common/values_test.go index 9610deced..7acfe6963 100644 --- a/pkg/cel/common/values_test.go +++ b/pkg/cel/common/values_test.go @@ -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", diff --git a/pkg/cel/common/valuesunstructured.go b/pkg/cel/common/valuesunstructured.go index 0b8d52001..229916624 100644 --- a/pkg/cel/common/valuesunstructured.go +++ b/pkg/cel/common/valuesunstructured.go @@ -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