Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

tests(clustering/rpc): add cases for sync.v2.notify_new_version #14174

Merged
merged 13 commits into from
Jan 20, 2025
Merged
2 changes: 2 additions & 0 deletions kong/clustering/services/sync/rpc.lua
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,8 @@ function _M:init_dp(manager)
return self:sync_once()
end

ngx_log(ngx_DEBUG, "no sync runs, version is ", version)

return true
end)
end
Expand Down
87 changes: 87 additions & 0 deletions spec/02-integration/18-hybrid_rpc/09-notify_new_version_spec.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
local rep = string.rep
local helpers = require "spec.helpers"


-- register a rpc connected event in custom plugin rpc-notify-new-version-test
-- DISABLE rpc sync on cp side
-- ENABLE rpc sync on dp side
for _, strategy in helpers.each_strategy() do
describe("Hybrid Mode RPC #" .. strategy, function()

lazy_setup(function()
helpers.get_db_utils(strategy, {
"clustering_data_planes",
}) -- runs migrations

assert(helpers.start_kong({
role = "control_plane",
cluster_cert = "spec/fixtures/kong_clustering.crt",
cluster_cert_key = "spec/fixtures/kong_clustering.key",
database = strategy,
cluster_listen = "127.0.0.1:9005",
nginx_conf = "spec/fixtures/custom_nginx.template",
plugins = "bundled,rpc-notify-new-version-test",
nginx_worker_processes = 4, -- multiple workers
cluster_rpc = "on", -- enable rpc
cluster_rpc_sync = "off", -- disable 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",
nginx_conf = "spec/fixtures/custom_nginx.template",
plugins = "bundled,rpc-notify-new-version-test",
nginx_worker_processes = 4, -- multiple workers
cluster_rpc = "on", -- enable rpc
cluster_rpc_sync = "on", -- enable rpc sync
}))
end)

lazy_teardown(function()
helpers.stop_kong("servroot2")
helpers.stop_kong()
end)

describe("sync.v2.notify_new_version works", function()
it("on dp side", function()
local name = "servroot2/logs/error.log"

-- dp logs
assert.logfile(name).has.line(
"kong.test.notify_new_version ok", true, 10)

assert.logfile(name).has.line(
"no sync runs, version is " .. rep(".", 32), true, 10)
assert.logfile(name).has.line(
"no sync runs, version is " .. rep("0", 32), true, 10)

assert.logfile(name).has.line(
"sync_once retry count exceeded. retry_count: 6", true, 10)
assert.logfile(name).has.no.line(
"assertion failed", true, 0)

ADD-SP marked this conversation as resolved.
Show resolved Hide resolved
local name = nil

-- cp logs
for i = 0, 6 do
assert.logfile(name).has.line(
"kong.sync.v2.get_delta ok: " .. i, true, 10)
end

assert.logfile(name).has.line(
"kong.test.notify_new_version ok", true, 10)

assert.logfile(name).has.no.line(
"assertion failed", true, 0)
assert.logfile(name).has.no.line(
"[error]", true, 0)

end)
end)
end)
end -- for _, strategy
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
local fmt = string.format
local rep = string.rep


local RpcSyncV2NotifyNewVersioinTestHandler = {
VERSION = "1.0",
PRIORITY = 1000,
}


function RpcSyncV2NotifyNewVersioinTestHandler:init_worker()
local counter = 0

-- mock function on cp side
kong.rpc.callbacks:register("kong.sync.v2.get_delta", function(node_id, current_versions)
local latest_version = fmt("v02_%028x", 10)

local fake_uuid = "00000000-0000-0000-0000-111111111111"

-- a basic config data
local deltas = {
{
entity = {
id = fake_uuid,
name = "default",
},
type = "workspaces",
version = latest_version,
ws_id = fake_uuid,
},
}

ngx.log(ngx.DEBUG, "kong.sync.v2.get_delta ok: ", counter)
counter = counter + 1

return { default = { deltas = deltas, wipe = true, }, }
end)

-- test dp's sync.v2.notify_new_version on cp side
kong.rpc.callbacks:register("kong.test.notify_new_version", function(node_id)
local dp_node_id = next(kong.rpc.clients)
local method = "kong.sync.v2.notify_new_version"

-- no default
local msg = {}
local res, err = kong.rpc:call(dp_node_id, method, msg)
assert(not res)
assert(err == "default namespace does not exist inside params")

-- no default.new_version
local msg = { default = {}, }
local res, err = kong.rpc:call(dp_node_id, method, msg)
assert(not res)
assert(err == "'new_version' key does not exist")

-- less version string
-- "....." < "00000" < "v02_xx"
local msg = { default = { new_version = rep(".", 32), }, }
local res, err = kong.rpc:call(dp_node_id, method, msg)
assert(res)
assert(not err)

-- less or equal version string
-- "00000" < "v02_xx"
local msg = { default = { new_version = rep("0", 32), }, }
local res, err = kong.rpc:call(dp_node_id, method, msg)
assert(res)
assert(not err)

-- greater version string
local msg = { default = { new_version = fmt("v02_%028x", 20), }, }
local res, err = kong.rpc:call(dp_node_id, method, msg)
assert(res)
assert(not err)

ngx.log(ngx.DEBUG, "kong.test.notify_new_version ok")

return true
end)

local worker_events = assert(kong.worker_events)

-- if rpc is ready we will send test calls
worker_events.register(function(capabilities_list)
local node_id = "control_plane"

-- trigger cp's test
local res, err = kong.rpc:call(node_id, "kong.test.notify_new_version")
assert(res == true)
assert(not err)

ngx.log(ngx.DEBUG, "kong.test.notify_new_version ok")

end, "clustering:jsonrpc", "connected")
end


return RpcSyncV2NotifyNewVersioinTestHandler
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
return {
name = "rpc-notify-new-version-test",
fields = {
{
config = {
type = "record",
fields = {
},
},
},
},
}
Loading