Skip to content

Commit 0d11ae1

Browse files
authored
Don't register maps as native types in CEL rules (#1348)
1 parent e450e0c commit 0d11ae1

File tree

2 files changed

+71
-4
lines changed

2 files changed

+71
-4
lines changed

schemaregistry/rules/cel/cel_executor.go

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -206,12 +206,15 @@ func (c *Executor) newProgram(expr string, msg interface{}, decls []cel.EnvOptio
206206
var declType cel.EnvOption
207207
if ok {
208208
declType = cel.Types(protoType)
209-
} else {
209+
} else if typ.Kind() == reflect.Struct {
210210
declType = ext.NativeTypes(typ)
211211
}
212-
envOptions := make([]cel.EnvOption, len(decls))
213-
copy(envOptions, decls)
214-
envOptions = append(envOptions, declType)
212+
envOptions := decls
213+
if declType != nil {
214+
envOptions = make([]cel.EnvOption, len(decls))
215+
copy(envOptions, decls)
216+
envOptions = append(envOptions, declType)
217+
}
215218
env, err := c.env.Extend(envOptions...)
216219
if err != nil {
217220
return nil, err

schemaregistry/serde/jsonschema/json_schema_test.go

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -663,6 +663,70 @@ func TestJSONSchemaSerdeWithCELFieldTransformWithDef(t *testing.T) {
663663
serde.MaybeFail("deserialization", err, serde.Expect(&newobj, &obj2))
664664
}
665665

666+
func TestJSONSchemaSerdeWithCELFieldTransformWithSimpleMap(t *testing.T) {
667+
serde.MaybeFail = serde.InitFailFunc(t)
668+
var err error
669+
670+
conf := schemaregistry.NewConfig("mock://")
671+
672+
client, err := schemaregistry.NewClient(conf)
673+
serde.MaybeFail("Schema Registry configuration", err)
674+
675+
serConfig := NewSerializerConfig()
676+
serConfig.AutoRegisterSchemas = false
677+
serConfig.UseLatestVersion = true
678+
ser, err := NewSerializer(client, serde.ValueSerde, serConfig)
679+
serde.MaybeFail("Serializer configuration", err)
680+
681+
encRule := schemaregistry.Rule{
682+
Name: "test-cel",
683+
Kind: "TRANSFORM",
684+
Mode: "WRITE",
685+
Type: "CEL_FIELD",
686+
Expr: "name == 'StringField' ; value + '-suffix'",
687+
}
688+
ruleSet := schemaregistry.RuleSet{
689+
DomainRules: []schemaregistry.Rule{encRule},
690+
}
691+
692+
info := schemaregistry.SchemaInfo{
693+
Schema: demoSchema,
694+
SchemaType: "JSON",
695+
RuleSet: &ruleSet,
696+
}
697+
698+
id, err := client.Register("topic1-value", info, false)
699+
serde.MaybeFail("Schema registration", err)
700+
if id <= 0 {
701+
t.Errorf("Expected valid schema id, found %d", id)
702+
}
703+
704+
obj := make(map[string]interface{})
705+
obj["IntField"] = 123
706+
obj["DoubleField"] = 45.67
707+
obj["StringField"] = "hi"
708+
obj["BoolField"] = true
709+
obj["BytesField"] = base64.StdEncoding.EncodeToString([]byte{0, 0, 0, 1})
710+
bytes, err := ser.Serialize("topic1", &obj)
711+
serde.MaybeFail("serialization", err)
712+
713+
deser, err := NewDeserializer(client, serde.ValueSerde, NewDeserializerConfig())
714+
serde.MaybeFail("Deserializer configuration", err)
715+
deser.Client = ser.Client
716+
717+
obj2 := JSONDemoSchema{}
718+
// JSON decoding produces floats
719+
obj2.IntField = 123.0
720+
obj2.DoubleField = 45.67
721+
obj2.StringField = "hi-suffix"
722+
obj2.BoolField = true
723+
obj2.BytesField = base64.StdEncoding.EncodeToString([]byte{0, 0, 0, 1})
724+
725+
var newobj JSONDemoSchema
726+
err = deser.DeserializeInto("topic1", bytes, &newobj)
727+
serde.MaybeFail("deserialization", err, serde.Expect(&newobj, &obj2))
728+
}
729+
666730
func TestJSONSchemaSerdeWithCELFieldTransformComplex(t *testing.T) {
667731
serde.MaybeFail = serde.InitFailFunc(t)
668732
var err error

0 commit comments

Comments
 (0)