Skip to content

Commit 63c497f

Browse files
authored
tests(clustering/rpc): add cases for sync.v2.notify_new_version (#14174)
KAG-6205
1 parent 443c075 commit 63c497f

File tree

4 files changed

+199
-0
lines changed

4 files changed

+199
-0
lines changed

kong/clustering/services/sync/rpc.lua

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,8 @@ function _M:init_dp(manager)
141141
return self:sync_once()
142142
end
143143

144+
ngx_log(ngx_DEBUG, "no sync runs, version is ", version)
145+
144146
return true
145147
end)
146148
end
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
local rep = string.rep
2+
local helpers = require "spec.helpers"
3+
4+
5+
-- register a rpc connected event in custom plugin rpc-notify-new-version-test
6+
-- DISABLE rpc sync on cp side
7+
-- ENABLE rpc sync on dp side
8+
for _, strategy in helpers.each_strategy() do
9+
describe("Hybrid Mode RPC #" .. strategy, function()
10+
11+
lazy_setup(function()
12+
helpers.get_db_utils(strategy, {
13+
"clustering_data_planes",
14+
}) -- runs migrations
15+
16+
assert(helpers.start_kong({
17+
role = "control_plane",
18+
cluster_cert = "spec/fixtures/kong_clustering.crt",
19+
cluster_cert_key = "spec/fixtures/kong_clustering.key",
20+
database = strategy,
21+
cluster_listen = "127.0.0.1:9005",
22+
nginx_conf = "spec/fixtures/custom_nginx.template",
23+
plugins = "bundled,rpc-notify-new-version-test",
24+
nginx_worker_processes = 4, -- multiple workers
25+
cluster_rpc = "on", -- enable rpc
26+
cluster_rpc_sync = "off", -- disable rpc sync
27+
}))
28+
29+
assert(helpers.start_kong({
30+
role = "data_plane",
31+
database = "off",
32+
prefix = "servroot2",
33+
cluster_cert = "spec/fixtures/kong_clustering.crt",
34+
cluster_cert_key = "spec/fixtures/kong_clustering.key",
35+
cluster_control_plane = "127.0.0.1:9005",
36+
proxy_listen = "0.0.0.0:9002",
37+
nginx_conf = "spec/fixtures/custom_nginx.template",
38+
plugins = "bundled,rpc-notify-new-version-test",
39+
nginx_worker_processes = 4, -- multiple workers
40+
cluster_rpc = "on", -- enable rpc
41+
cluster_rpc_sync = "on", -- enable rpc sync
42+
}))
43+
end)
44+
45+
lazy_teardown(function()
46+
helpers.stop_kong("servroot2")
47+
helpers.stop_kong()
48+
end)
49+
50+
describe("sync.v2.notify_new_version works", function()
51+
it("on dp side", function()
52+
local name = "servroot2/logs/error.log"
53+
54+
-- dp logs
55+
assert.logfile(name).has.line(
56+
"kong.test.notify_new_version ok", true, 10)
57+
58+
assert.logfile(name).has.line(
59+
"no sync runs, version is " .. rep(".", 32), true, 10)
60+
assert.logfile(name).has.line(
61+
"no sync runs, version is " .. rep("0", 32), true, 10)
62+
63+
assert.logfile(name).has.line(
64+
"sync_once retry count exceeded. retry_count: 6", true, 10)
65+
assert.logfile(name).has.no.line(
66+
"assertion failed", true, 0)
67+
68+
local name = nil
69+
70+
-- cp logs
71+
for i = 0, 6 do
72+
assert.logfile(name).has.line(
73+
"kong.sync.v2.get_delta ok: " .. i, true, 10)
74+
end
75+
76+
assert.logfile(name).has.line(
77+
"kong.test.notify_new_version ok", true, 10)
78+
79+
assert.logfile(name).has.no.line(
80+
"assertion failed", true, 0)
81+
assert.logfile(name).has.no.line(
82+
"[error]", true, 0)
83+
84+
end)
85+
end)
86+
end)
87+
end -- for _, strategy
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
local fmt = string.format
2+
local rep = string.rep
3+
4+
5+
local RpcSyncV2NotifyNewVersioinTestHandler = {
6+
VERSION = "1.0",
7+
PRIORITY = 1000,
8+
}
9+
10+
11+
function RpcSyncV2NotifyNewVersioinTestHandler:init_worker()
12+
local counter = 0
13+
14+
-- mock function on cp side
15+
kong.rpc.callbacks:register("kong.sync.v2.get_delta", function(node_id, current_versions)
16+
local latest_version = fmt("v02_%028x", 10)
17+
18+
local fake_uuid = "00000000-0000-0000-0000-111111111111"
19+
20+
-- a basic config data
21+
local deltas = {
22+
{
23+
entity = {
24+
id = fake_uuid,
25+
name = "default",
26+
},
27+
type = "workspaces",
28+
version = latest_version,
29+
ws_id = fake_uuid,
30+
},
31+
}
32+
33+
ngx.log(ngx.DEBUG, "kong.sync.v2.get_delta ok: ", counter)
34+
counter = counter + 1
35+
36+
return { default = { deltas = deltas, wipe = true, }, }
37+
end)
38+
39+
-- test dp's sync.v2.notify_new_version on cp side
40+
kong.rpc.callbacks:register("kong.test.notify_new_version", function(node_id)
41+
local dp_node_id = next(kong.rpc.clients)
42+
local method = "kong.sync.v2.notify_new_version"
43+
44+
-- no default
45+
local msg = {}
46+
local res, err = kong.rpc:call(dp_node_id, method, msg)
47+
assert(not res)
48+
assert(err == "default namespace does not exist inside params")
49+
50+
-- no default.new_version
51+
local msg = { default = {}, }
52+
local res, err = kong.rpc:call(dp_node_id, method, msg)
53+
assert(not res)
54+
assert(err == "'new_version' key does not exist")
55+
56+
-- less version string
57+
-- "....." < "00000" < "v02_xx"
58+
local msg = { default = { new_version = rep(".", 32), }, }
59+
local res, err = kong.rpc:call(dp_node_id, method, msg)
60+
assert(res)
61+
assert(not err)
62+
63+
-- less or equal version string
64+
-- "00000" < "v02_xx"
65+
local msg = { default = { new_version = rep("0", 32), }, }
66+
local res, err = kong.rpc:call(dp_node_id, method, msg)
67+
assert(res)
68+
assert(not err)
69+
70+
-- greater version string
71+
local msg = { default = { new_version = fmt("v02_%028x", 20), }, }
72+
local res, err = kong.rpc:call(dp_node_id, method, msg)
73+
assert(res)
74+
assert(not err)
75+
76+
ngx.log(ngx.DEBUG, "kong.test.notify_new_version ok")
77+
78+
return true
79+
end)
80+
81+
local worker_events = assert(kong.worker_events)
82+
83+
-- if rpc is ready we will send test calls
84+
worker_events.register(function(capabilities_list)
85+
local node_id = "control_plane"
86+
87+
-- trigger cp's test
88+
local res, err = kong.rpc:call(node_id, "kong.test.notify_new_version")
89+
assert(res == true)
90+
assert(not err)
91+
92+
ngx.log(ngx.DEBUG, "kong.test.notify_new_version ok")
93+
94+
end, "clustering:jsonrpc", "connected")
95+
end
96+
97+
98+
return RpcSyncV2NotifyNewVersioinTestHandler
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
return {
2+
name = "rpc-notify-new-version-test",
3+
fields = {
4+
{
5+
config = {
6+
type = "record",
7+
fields = {
8+
},
9+
},
10+
},
11+
},
12+
}

0 commit comments

Comments
 (0)