Files
2026-07-13 12:32:21 +08:00

273 lines
6.8 KiB
Lua

local constants = require "kong.constants"
local helpers = require "spec.helpers"
local cjson = require "cjson"
local SAMPLE_YAML_CONFIG = [[
_format_version: "1.1"
services:
- name: my-service
url: http://127.0.0.1:15555
routes:
- name: example-route
hosts:
- example.test
]]
local function admin_send(req)
local client = helpers.admin_client()
req.method = req.method or "POST"
req.headers = req.headers or {}
req.headers["Content-Type"] = req.headers["Content-Type"]
or "application/json"
local res, err = client:send(req)
if not res then
return nil, err
end
local status, body = res.status, cjson.decode((res:read_body()))
client:close()
return status, body
end
for _, strategy in helpers.each_strategy() do
describe("anonymous reports in Admin API #" .. strategy, function()
local dns_hostsfile
local yaml_file
local reports_server
lazy_setup(function()
dns_hostsfile = assert(os.tmpname() .. ".hosts")
local fd = assert(io.open(dns_hostsfile, "w"))
assert(fd:write("127.0.0.1 " .. constants.REPORTS.ADDRESS))
assert(fd:close())
yaml_file = helpers.make_yaml_file(SAMPLE_YAML_CONFIG)
end)
lazy_teardown(function()
os.remove(dns_hostsfile)
os.remove(yaml_file)
end)
before_each(function()
reports_server = helpers.tcp_server(constants.REPORTS.STATS_TLS_PORT, {tls=true})
assert(helpers.get_db_utils(strategy, {}))
assert(helpers.start_kong({
nginx_conf = "spec/fixtures/custom_nginx.template",
database = strategy,
dns_hostsfile = dns_hostsfile,
resolver_hosts_file = dns_hostsfile,
anonymous_reports = "on",
declarative_config = yaml_file,
}, {"routes", "services"}))
end)
after_each(function()
helpers.stop_kong()
end)
it("reports plugins added to services via /plugins", function()
local status, service
status, service = assert(admin_send({
method = "POST",
path = "/services",
body = {
protocol = "http",
host = "example.com",
},
}))
assert.same(201, status)
assert.string(service.id)
local plugin
status, plugin = assert(admin_send({
method = "POST",
path = "/plugins",
body = {
service = { id = service.id },
name = "tcp-log",
config = {
host = "dummy",
port = 666,
},
},
}))
assert.same(201, status)
assert.string(plugin.id)
local _, reports_data = assert(reports_server:join())
assert.match("signal=api", reports_data)
assert.match("e=s", reports_data)
assert.match("name=tcp%-log", reports_data)
end)
it("reports plugins added to services via /service/:id/plugins", function()
local status, service
status, service = assert(admin_send({
method = "POST",
path = "/services",
body = {
protocol = "http",
host = "example.com",
},
}))
assert.same(201, status)
assert.string(service.id)
local plugin
status, plugin = assert(admin_send({
method = "POST",
path = "/services/" .. service.id .. "/plugins",
body = {
name = "tcp-log",
config = {
host = "dummy",
port = 666,
},
},
}))
assert.same(201, status)
assert.string(plugin.id)
local _, reports_data = assert(reports_server:join())
assert.match("signal=api", reports_data)
assert.match("e=s", reports_data)
assert.match("name=tcp%-log", reports_data)
end)
it("reports plugins added to routes via /plugins", function()
local status, service
status, service = assert(admin_send({
method = "POST",
path = "/services",
body = {
protocol = "http",
host = "example.com",
},
}))
assert.same(201, status)
assert.string(service.id)
local route
status, route = assert(admin_send({
method = "POST",
path = "/routes",
body = {
protocols = { "http" },
hosts = { "dummy" },
service = { id = service.id },
},
}))
assert.same(201, status)
assert.string(route.id)
local plugin
status, plugin = assert(admin_send({
method = "POST",
path = "/plugins",
body = {
route = { id = route.id },
name = "tcp-log",
config = {
host = "dummy",
port = 666,
},
},
}))
assert.same(201, status)
assert.string(plugin.id)
local _, reports_data = assert(reports_server:join())
assert.match("signal=api", reports_data)
assert.match("e=r", reports_data)
assert.match("name=tcp%-log", reports_data)
end)
it("reports plugins added to routes via /routes/:id/plugins", function()
local status, service
status, service = assert(admin_send({
method = "POST",
path = "/services",
body = {
protocol = "http",
host = "example.com",
},
}))
assert.same(201, status)
assert.string(service.id)
local route
status, route = assert(admin_send({
method = "POST",
path = "/routes",
body = {
protocols = { "http" },
hosts = { "dummy" },
service = { id = service.id },
},
}))
assert.same(201, status)
assert.string(route.id)
local plugin
status, plugin = assert(admin_send({
method = "POST",
path = "/routes/" .. route.id .. "/plugins" ,
body = {
name = "tcp-log",
config = {
host = "dummy",
port = 666,
},
},
}))
assert.same(201, status)
assert.string(plugin.id)
local _, reports_data = assert(reports_server:join())
assert.match("signal=api", reports_data)
assert.match("e=r", reports_data)
assert.match("name=tcp%-log", reports_data)
end)
if strategy == "off" then
it("reports declarative reconfigure via /config", function()
local status, config = assert(admin_send({
path = "/config",
body = {
config = SAMPLE_YAML_CONFIG,
},
headers = {
["Content-Type"] = "multipart/form-data",
}
}))
assert.same(201, status)
assert.table(config)
local _, reports_data = assert(reports_server:join())
assert.match("signal=dbless-reconfigure", reports_data, nil, true)
-- it will be updated on-the-fly
-- but the version should still be 1.1
assert.match("decl_fmt_version=1.1", reports_data, nil, true)
end)
end
end)
end