88 lines
2.3 KiB
Lua
88 lines
2.3 KiB
Lua
local MetaSchema = require "kong.db.schema.metaschema"
|
|
local Entity = require "kong.db.schema.entity"
|
|
local plugin_servers = require "kong.runloop.plugin_servers"
|
|
local wasm_plugins = require "kong.runloop.wasm.plugins"
|
|
local is_array = require "kong.tools.table".is_array
|
|
local load_module_if_exists = require "kong.tools.module".load_module_if_exists
|
|
|
|
|
|
local fmt = string.format
|
|
local tostring = tostring
|
|
|
|
|
|
local plugin_loader = {}
|
|
|
|
|
|
function plugin_loader.load_subschema(parent_schema, plugin, errors)
|
|
local plugin_schema = "kong.plugins." .. plugin .. ".schema"
|
|
local ok, schema = load_module_if_exists(plugin_schema)
|
|
if not ok then
|
|
ok, schema = wasm_plugins.load_schema(plugin)
|
|
end
|
|
if not ok then
|
|
ok, schema = plugin_servers.load_schema(plugin)
|
|
end
|
|
|
|
if not ok then
|
|
return nil, "no configuration schema found for plugin: " .. plugin
|
|
end
|
|
|
|
local err_t
|
|
ok, err_t = MetaSchema.MetaSubSchema:validate(schema)
|
|
if not ok then
|
|
return nil, tostring(errors:schema_violation(err_t))
|
|
end
|
|
|
|
local err
|
|
ok, err = Entity.new_subschema(parent_schema, plugin, schema)
|
|
if not ok then
|
|
return nil, "error initializing schema for plugin: " .. err
|
|
end
|
|
|
|
return schema
|
|
end
|
|
|
|
|
|
function plugin_loader.load_entity_schema(plugin, schema_def, errors)
|
|
local _, err_t = MetaSchema:validate(schema_def)
|
|
if err_t then
|
|
return nil, fmt("schema of custom plugin entity '%s.%s' is invalid: %s",
|
|
plugin, schema_def.name, tostring(errors:schema_violation(err_t)))
|
|
end
|
|
|
|
local schema, err = Entity.new(schema_def)
|
|
if err then
|
|
return nil, fmt("schema of custom plugin entity '%s.%s' is invalid: %s",
|
|
plugin, schema_def.name, err)
|
|
end
|
|
|
|
return schema
|
|
end
|
|
|
|
|
|
function plugin_loader.load_entities(plugin, errors, loader_fn)
|
|
local has_daos, daos_schemas = load_module_if_exists("kong.plugins." .. plugin .. ".daos")
|
|
if not has_daos then
|
|
return {}
|
|
end
|
|
if not is_array(daos_schemas, "strict") then
|
|
return nil, fmt("custom plugin '%s' returned non-array daos definition table", plugin)
|
|
end
|
|
|
|
local res = {}
|
|
local schema_def, ret, err
|
|
for i = 1, #daos_schemas do
|
|
schema_def = daos_schemas[i]
|
|
ret, err = loader_fn(plugin, schema_def, errors)
|
|
if err then
|
|
return nil, err
|
|
end
|
|
res[schema_def.name] = ret
|
|
end
|
|
|
|
return res
|
|
end
|
|
|
|
|
|
return plugin_loader
|