kong/spec/02-integration/09-hybrid_mode/03-pki_spec.lua (135 lines of code) (raw):

local helpers = require "spec.helpers" local cjson = require "cjson.safe" local confs = helpers.get_clustering_protocols() for cluster_protocol, conf in pairs(confs) do for _, strategy in helpers.each_strategy() do describe("CP/DP PKI sync works with #" .. strategy .. " backend, protocol " .. cluster_protocol, function() lazy_setup(function() helpers.get_db_utils(strategy, { "routes", "services", }) -- runs migrations assert(helpers.start_kong({ role = "control_plane", legacy_hybrid_protocol = (cluster_protocol == "json (by switch)"), cluster_cert = "spec/fixtures/kong_clustering.crt", cluster_cert_key = "spec/fixtures/kong_clustering.key", db_update_frequency = 0.1, database = strategy, cluster_listen = "127.0.0.1:9005", nginx_conf = conf, -- additional attributes for PKI: cluster_mtls = "pki", cluster_ca_cert = "spec/fixtures/kong_clustering_ca.crt", })) assert(helpers.start_kong({ role = "data_plane", legacy_hybrid_protocol = (cluster_protocol == "json (by switch)"), nginx_conf = conf, database = "off", prefix = "servroot2", cluster_cert = "spec/fixtures/kong_clustering_client.crt", cluster_cert_key = "spec/fixtures/kong_clustering_client.key", cluster_control_plane = "127.0.0.1:9005", proxy_listen = "0.0.0.0:9002", -- additional attributes for PKI: cluster_mtls = "pki", cluster_server_name = "kong_clustering", cluster_ca_cert = "spec/fixtures/kong_clustering.crt", })) end) lazy_teardown(function() helpers.stop_kong("servroot2") helpers.stop_kong() end) describe("status API", function() it("shows DP status", function() helpers.wait_until(function() local admin_client = helpers.admin_client() finally(function() admin_client:close() end) local res = assert(admin_client:get("/clustering/data-planes")) local body = assert.res_status(200, res) local json = cjson.decode(body) for _, v in pairs(json.data) do if v.ip == "127.0.0.1" then return true end end end, 5) end) it("shows DP status (#deprecated)", function() helpers.wait_until(function() local admin_client = helpers.admin_client() finally(function() admin_client:close() end) local res = assert(admin_client:get("/clustering/status")) local body = assert.res_status(200, res) local json = cjson.decode(body) for _, v in pairs(json) do if v.ip == "127.0.0.1" then return true end end end, 5) end) end) describe("sync works", function() local route_id it("proxy on DP follows CP config", function() local admin_client = helpers.admin_client(10000) finally(function() admin_client:close() end) local res = assert(admin_client:post("/services", { body = { name = "mockbin-service", url = "https://127.0.0.1:15556/request", }, headers = {["Content-Type"] = "application/json"} })) assert.res_status(201, res) res = assert(admin_client:post("/services/mockbin-service/routes", { body = { paths = { "/" }, }, headers = {["Content-Type"] = "application/json"} })) local body = assert.res_status(201, res) local json = cjson.decode(body) route_id = json.id helpers.wait_until(function() local proxy_client = helpers.http_client("127.0.0.1", 9002) res = proxy_client:send({ method = "GET", path = "/", }) local status = res and res.status proxy_client:close() if status == 200 then return true end end, 10) end) it("cache invalidation works on config change", function() local admin_client = helpers.admin_client() finally(function() admin_client:close() end) local res = assert(admin_client:send({ method = "DELETE", path = "/routes/" .. route_id, })) assert.res_status(204, res) helpers.wait_until(function() local proxy_client = helpers.http_client("127.0.0.1", 9002) res = proxy_client:send({ method = "GET", path = "/", }) -- should remove the route from DP local status = res and res.status proxy_client:close() if status == 404 then return true end end, 5) end) end) end) end end