Files
kong--kong/spec/03-plugins/11-correlation-id/02-schema_spec.lua
T
2026-07-13 12:32:21 +08:00

222 lines
6.7 KiB
Lua

local schema_def = require "kong.plugins.correlation-id.schema"
local v = require("spec.helpers").validate_plugin_config_schema
local helpers = require "spec.helpers"
local uuid = require "resty.jit-uuid"
local pgmoon_json = require("pgmoon.json")
local cjson = require "cjson"
describe("Schema: correlation-id", function ()
it("requried field must be included", function()
local ok, err = v({
generator = ngx.null,
}, schema_def)
assert.falsy(ok)
assert.is_not_nil(err)
assert.equals("required field missing", err.config.generator)
end)
end)
local strategy = "postgres"
describe("Plugin: correlation-id (schema) #a [#" .. strategy .."]", function()
local admin_client, bp, db, plugin_id,ws
local plugin_config = {
generator = ngx.null,
header_name = "Kong-Request-ID",
echo_downstream = true,
}
local function render(template, keys)
return (template:gsub("$%(([A-Z_]+)%)", keys))
end
lazy_setup(function()
local plugin_name = "correlation-id"
bp, db = helpers.get_db_utils(strategy, { "plugins", "workspaces", })
ws = db.workspaces:select_by_name("default")
assert.is_truthy(ws)
plugin_id = uuid.generate_v4()
local sql = render([[
INSERT INTO plugins (id, name, config, enabled, ws_id) VALUES
('$(ID)', '$(PLUGIN_NAME)', $(CONFIG)::jsonb, TRUE, '$(WS_ID)');
COMMIT;
]], {
ID = plugin_id,
PLUGIN_NAME = plugin_name,
CONFIG = pgmoon_json.encode_json(plugin_config),
WS_ID = ws.id,
})
local res, err = db.connector:query(sql)
assert.is_nil(err)
assert.is_not_nil(res)
end)
describe("in traditional mode", function()
lazy_setup(function()
assert(helpers.start_kong({
database = strategy,
}))
end)
before_each(function()
admin_client = helpers.admin_client()
end)
after_each(function()
admin_client:close()
end)
lazy_teardown(function()
if admin_client then
admin_client:close()
end
assert(helpers.stop_kong())
end)
it("auto-complete generator if it is `null` in database", function()
local sql = 'SELECT config FROM plugins WHERE id=\''.. plugin_id ..'\';'
local res, err = db.connector:query(sql)
assert.is_nil(err)
assert.is_nil(res[1].generator)
res = admin_client:get("/plugins")
res = cjson.decode(assert.res_status(200, res))
assert.equals(res.data[1].config.generator, "uuid#counter")
end)
end)
for _, v in ipairs({ {"off", "off"}, {"on", "off"}, {"on", "on"}, }) do
local rpc, rpc_sync = v[1], v[2]
describe("in hybrid mode" .. " rpc_sync=" .. rpc_sync, function()
local route
lazy_setup(function()
-- if the database is not cleared, the residual RPC connection information
-- between different tests will cause the test to fail.
local plugin_name = "correlation-id"
bp, db = helpers.get_db_utils(strategy, { "plugins", "workspaces", })
ws = db.workspaces:select_by_name("default")
plugin_id = uuid.generate_v4()
local sql = render([[
INSERT INTO plugins (id, name, config, enabled, ws_id) VALUES
('$(ID)', '$(PLUGIN_NAME)', $(CONFIG)::jsonb, TRUE, '$(WS_ID)');
COMMIT;
]], {
ID = plugin_id,
PLUGIN_NAME = plugin_name,
CONFIG = pgmoon_json.encode_json(plugin_config),
WS_ID = ws.id,
})
local res, err = db.connector:query(sql)
assert.is_nil(err)
assert.is_not_nil(res)
route = bp.routes:insert({
hosts = {"example.com"},
})
bp.plugins:insert {
name = "request-termination",
route = { id = route.id },
config = {
status_code = 200,
},
}
local sql = render([[
UPDATE plugins SET route_id='$(ROUTE_ID)',
protocols=ARRAY['grpc','grpcs','http','https'],
cache_key='$(CACHE_KEY)'
WHERE id='$(ID)';
COMMIT;
]], {
ROUTE_ID = route.id,
--CACHE_KEY = "plugins:correlation-id:"..route.id.."::::"..ws.id,
CACHE_KEY = "plugins|"..ws.id.."|route|"..route.id.."|"..plugin_id,
ID = plugin_id,
})
local _, err = db.connector:query(sql)
assert.is_nil(err)
assert(helpers.start_kong({
role = "control_plane",
cluster_cert = "spec/fixtures/kong_clustering.crt",
cluster_cert_key = "spec/fixtures/kong_clustering.key",
database = strategy,
prefix = "servroot",
cluster_listen = "127.0.0.1:9005",
nginx_conf = "spec/fixtures/custom_nginx.template",
cluster_rpc = rpc,
cluster_rpc_sync = rpc_sync,
}))
assert(helpers.start_kong({
role = "data_plane",
database = "off",
prefix = "servroot2",
cluster_cert = "spec/fixtures/kong_clustering.crt",
cluster_cert_key = "spec/fixtures/kong_clustering.key",
cluster_control_plane = "127.0.0.1:9005",
proxy_listen = "0.0.0.0:9002",
status_listen = "127.0.0.1:9100",
cluster_rpc = rpc,
cluster_rpc_sync = rpc_sync,
}))
if rpc_sync == "on" then
assert.logfile("servroot2/logs/error.log").has.line("[kong.sync.v2] full sync ends", true, 10)
end
end)
before_each(function()
admin_client = helpers.admin_client()
end)
after_each(function()
admin_client:close()
end)
lazy_teardown(function()
if admin_client then
admin_client:close()
end
helpers.stop_kong("servroot")
helpers.stop_kong("servroot2")
end)
it("auto-complete generator if it is `null` in database", function()
local sql = 'SELECT config FROM plugins WHERE id=\''.. plugin_id ..'\';'
local res, err = db.connector:query(sql)
assert.is_nil(err)
assert.is_nil(res[1].generator)
local status_client = helpers.http_client("127.0.0.1", 9100, 20000)
helpers.wait_until(function()
res = status_client:get("/status/ready")
return pcall(assert.res_status, 200, res)
end, 30)
status_client:close()
res = admin_client:get("/routes/".. route.id .. "/plugins/" .. plugin_id)
res = cjson.decode(assert.res_status(200, res))
assert.equals("uuid#counter", res.config.generator)
local proxy_client = helpers.proxy_client(20000, 9002, "127.0.0.1")
helpers.pwait_until(function()
res = assert(proxy_client:send {
method = "GET",
path = "/",
headers = {
["Host"] = "example.com",
}
})
assert.res_status(200, res)
assert.is_not_nil(res.headers["Kong-Request-ID"])
end, 10)
proxy_client:close()
end)
end)
end -- for rpc, rpc_sync
end)