in api/internal/core/store/validate.go [236:320]
func (v *APISIXJsonSchemaValidator) Validate(obj interface{}) error {
ret, err := v.schema.Validate(gojsonschema.NewGoLoader(obj))
if err != nil {
log.Errorf("schema validate failed: %s, s: %v, obj: %v", err, v.schema, obj)
return fmt.Errorf("schema validate failed: %s", err)
}
if !ret.Valid() {
errString := buffer.Buffer{}
for i, vErr := range ret.Errors() {
if i != 0 {
errString.AppendString("\n")
}
errString.AppendString(vErr.String())
}
log.Errorf("schema validate failed:s: %v, obj: %#v", v.schemaDef, obj)
return fmt.Errorf("schema validate failed: %s", errString.String())
}
//custom check
if err := checkConf(obj); err != nil {
return err
}
plugins, schemaType := getPlugins(obj)
for pluginName, pluginConf := range plugins {
schemaValue := conf.Schema.Get("plugins." + pluginName + "." + schemaType).Value()
if schemaValue == nil && schemaType == "consumer_schema" {
schemaValue = conf.Schema.Get("plugins." + pluginName + ".schema").Value()
}
if schemaValue == nil {
log.Errorf("schema validate failed: schema not found, %s, %s", "plugins."+pluginName, schemaType)
return fmt.Errorf("schema validate failed: schema not found, path: %s", "plugins."+pluginName)
}
schemaMap := schemaValue.(map[string]interface{})
schemaByte, err := json.Marshal(schemaMap)
if err != nil {
log.Warnf("schema validate failed: schema json encode failed, path: %s, %w", "plugins."+pluginName, err)
return fmt.Errorf("schema validate failed: schema json encode failed, path: %s, %w", "plugins."+pluginName, err)
}
s, err := gojsonschema.NewSchema(gojsonschema.NewBytesLoader(schemaByte))
if err != nil {
log.Errorf("init schema validate failed: %s", err)
return fmt.Errorf("schema validate failed: %s", err)
}
// check property disable, if is bool, remove from json schema checking
conf := pluginConf.(map[string]interface{})
var exchange bool
disable, ok := conf["disable"]
if ok {
if fmt.Sprintf("%T", disable) == "bool" {
delete(conf, "disable")
exchange = true
}
}
// check schema
ret, err := s.Validate(gojsonschema.NewGoLoader(conf))
if err != nil {
log.Errorf("schema validate failed: %s", err)
return fmt.Errorf("schema validate failed: %s", err)
}
// put the value back to the property disable
if exchange {
conf["disable"] = disable
}
if !ret.Valid() {
errString := buffer.Buffer{}
for i, vErr := range ret.Errors() {
if i != 0 {
errString.AppendString("\n")
}
errString.AppendString(vErr.String())
}
return fmt.Errorf("schema validate failed: %s", errString.String())
}
}
return nil
}