222 lines
6.7 KiB
Lua
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)
|