From 4ae068c5b2c47e2939d7fbe724d163ca0db435f8 Mon Sep 17 00:00:00 2001 From: ChuanFF <48383420+ChuanFF@users.noreply.github.com> Date: Thu, 5 Jun 2025 00:30:09 +0800 Subject: [PATCH 01/29] Update informer_factory.lua Spelling error. post_List should be post_list --- apisix/discovery/kubernetes/informer_factory.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apisix/discovery/kubernetes/informer_factory.lua b/apisix/discovery/kubernetes/informer_factory.lua index fd434c047391..3420c1aed58f 100644 --- a/apisix/discovery/kubernetes/informer_factory.lua +++ b/apisix/discovery/kubernetes/informer_factory.lua @@ -298,7 +298,7 @@ local function list_watch(informer, apiserver) end informer.fetch_state = "list finished" - if informer.post_List then + if informer.post_list then informer:post_list() end From a51fc471c6554a8066e4f35e4f279ab1af022251 Mon Sep 17 00:00:00 2001 From: chuanFF Date: Thu, 21 Aug 2025 00:03:24 +0800 Subject: [PATCH 02/29] fix: endpointslice should cached when modified, then all slices merge and set in dict --- apisix/discovery/kubernetes/init.lua | 193 ++++++++++++++++++++------- 1 file changed, 142 insertions(+), 51 deletions(-) diff --git a/apisix/discovery/kubernetes/init.lua b/apisix/discovery/kubernetes/init.lua index 695a9dd7f684..666b4e81d174 100644 --- a/apisix/discovery/kubernetes/init.lua +++ b/apisix/discovery/kubernetes/init.lua @@ -16,6 +16,7 @@ -- local ngx = ngx +local unpack = unpack local ipairs = ipairs local pairs = pairs local string = string @@ -51,70 +52,153 @@ local function sort_nodes_cmp(left, right) return left.port < right.port end -local function on_endpoint_slices_modified(handle, endpoint) +local function update_endpoint_slices_cache(handle, endpoint_key, slice, slice_name) + if not handle.endpoint_slices_cache[endpoint_key] then + handle.update_endpoint_slices_cache[endpoint_key] = {} + end + local endpoint_slices = handle.endpoint_slices_cache[endpoint_key] + endpoint_slices[slice_name] = slice +end + +local function get_endpoints_from_cache(handle, endpoint_key) + local cached_endpoint_slices = handle.endpoint_slices_cache[endpoint_key] or {} + local service_endpoints = {} + for _, endpoint_slice in pairs(cached_endpoint_slices) do + for port, nodes in pairs(endpoint_slice) do + if not service_endpoints[port] then + service_endpoints[port] = core.table.new(0, #nodes) + end + core.table.insert_tail(service_endpoints[port], unpack(nodes)) + end + end + return service_endpoints +end + +local function update_endpoint_dict(handle, endpoints, endpoint_key) + local endpoints_content = core.json.encode(endpoints, true) + local endpoints_version = ngx.crc32_long(endpoints_content) + local _, err + _, err = handle.endpoint_dict:safe_set(endpoint_key .. "#version", endpoints_version) + if err then + core.log.error("set endpoint version into discovery DICT failed, ", err) + end + _, err = handle.endpoint_dict:safe_set(endpoint_key, endpoints_content) + if err then + core.log.error("set endpoint into discovery DICT failed, ", err) + handle.endpoint_dict:delete(endpoint_key .. "#version") + end +end + +local function on_endpoint_slices_modified(handle, endpoint_slice) + if not endpoint_slice.metadata then + core.log.error("endpoint_slice has no metadata, endpointSlice: ", core.json.delay_encode(endpoint_slice)) + return + end + if not endpoint_slice.metadata.name then + core.log.error("endpoint_slice has no metadata.name, endpointSlice: ", core.json.delay_encode(endpoint_slice)) + return + end + if not endpoint_slice.metadata.namespace then + core.log.error("endpoint_slice has no metadata.namespace, endpointSlice: ", core.json.delay_encode(endpoint_slice)) + return + end + if not endpoint_slice.metadata.labels or not endpoint_slice.metadata.labels["kubernetes.io/service-name"] then + core.log.error("endpoint_slice has no service-name, endpointSlice: ", core.json.delay_encode(endpoint_slice)) + return + end + if handle.namespace_selector and - not handle:namespace_selector(endpoint.metadata.namespace) then + not handle:namespace_selector(endpoint_slice.metadata.namespace) then return end - core.log.debug(core.json.delay_encode(endpoint)) - core.table.clear(endpoint_buffer) + core.log.debug(core.json.delay_encode(endpoint_slice)) + --record nodes to every port in service + local port_to_nodes = {} - local endpointslices = endpoint.endpoints - if type(endpointslices) == "table" then - for _, endpointslice in ipairs(endpointslices) do - if endpointslice.addresses then - local addresses = endpointslice.addresses - for _, port in ipairs(endpoint.ports or {}) do - local port_name - if port.name then - port_name = port.name - elseif port.targetPort then - port_name = tostring(port.targetPort) - else - port_name = tostring(port.port) - end - - if endpointslice.conditions and endpointslice.conditions.ready then - local nodes = endpoint_buffer[port_name] - if nodes == nil then - nodes = core.table.new(0, #endpointslices * #addresses) - endpoint_buffer[port_name] = nodes - end - - for _, address in ipairs(addresses) do - core.table.insert(nodes, { - host = address.ip, - port = port.port, - weight = handle.default_weight - }) - end - end + local slice_endpoints = endpoint_slice.endpoints + if not slice_endpoints or slice_endpoints == ngx.null then + slice_endpoints = {} + end + + for _, endpoint in ipairs(slice_endpoints) do + if endpoint.addresses + and endpoint.conditions + and endpoint.conditions.ready then + local addresses = endpoint.addresses + for _, port in ipairs(endpoint_slice.ports or {}) do + local port_name + if port.name then + port_name = port.name + elseif port.targetPort then + port_name = tostring(port.targetPort) + else + port_name = tostring(port.port) end + + local nodes = port_to_nodes[port_name] + if nodes == nil then + nodes = core.table.new(0, #slice_endpoints * #addresses) + port_to_nodes[port_name] = nodes + end + + for _, address in ipairs(addresses) do + core.table.insert(nodes, { + host = address, + port = port.port, + weight = handle.default_weight + }) + end + end end end - for _, ports in pairs(endpoint_buffer) do - for _, nodes in pairs(ports) do - core.table.sort(nodes, sort_nodes_cmp) - end + local endpoint_key = endpoint_slice.metadata.namespace .. "/" .. endpoint_slice.metadata.labels["kubernetes.io/service-name"] + update_endpoint_slices_cache(handle, endpoint_key, port_to_nodes, endpoint_slice.metadata.name) + + local cached_service_endpoints = get_endpoints_from_cache(handle, endpoint_key) + for _, nodes in pairs(cached_service_endpoints) do + core.table.sort(nodes, sort_nodes_cmp) end - local endpoint_key = endpoint.metadata.namespace .. "/" .. endpoint.metadata.name - local endpoint_content = core.json.encode(endpoint_buffer, true) - local endpoint_version = ngx.crc32_long(endpoint_content) - local _, err - _, err = handle.endpoint_dict:safe_set(endpoint_key .. "#version", endpoint_version) - if err then - core.log.error("set endpoint version into discovery DICT failed, ", err) + update_endpoint_dict(handle, cached_service_endpoints, endpoint_key) +end + +local function on_endpoint_slices_deleted(handle, endpoint_slice) + if not endpoint_slice.metadata then + core.log.error("endpoint_slice has no metadata, endpointSlice: ", core.json.delay_encode(endpoint_slice)) return end - _, err = handle.endpoint_dict:safe_set(endpoint_key, endpoint_content) - if err then - core.log.error("set endpoint into discovery DICT failed, ", err) - handle.endpoint_dict:delete(endpoint_key .. "#version") + if not endpoint_slice.metadata.name then + core.log.error("endpoint_slice has no metadata.name, endpointSlice: ", core.json.delay_encode(endpoint_slice)) + return + end + if not endpoint_slice.metadata.namespace then + core.log.error("endpoint_slice has no metadata.namespace, endpointSlice: ", core.json.delay_encode(endpoint_slice)) + return end + if not endpoint_slice.metadata.labels or not endpoint_slice.metadata.labels["kubernetes.io/service-name"] then + core.log.error("endpoint_slice has no service-name, endpointSlice: ", core.json.delay_encode(endpoint_slice)) + return + end + + if handle.namespace_selector and + not handle:namespace_selector(endpoint_slice.metadata.namespace) then + return + end + + core.log.debug(core.json.delay_encode(endpoint_slice)) + + local endpoint_key = endpoint_slice.metadata.namespace .. "/" .. endpoint_slice.metadata.labels["kubernetes.io/service-name"] + update_endpoint_slices_cache(handle, endpoint_key, nil, endpoint_slice.metadata.name) + + local cached_service_endpoints = get_endpoints_from_cache(handle, endpoint_key) + for _, nodes in pairs(cached_service_endpoints) do + core.table.sort(nodes, sort_nodes_cmp) + end + + update_endpoint_dict(handle, cached_service_endpoints, endpoint_key) end local function on_endpoint_modified(handle, endpoint) @@ -196,6 +280,7 @@ end local function pre_list(handle) handle.endpoint_dict:flush_all() + handle.endpoint_slices_cache = {} end @@ -468,11 +553,14 @@ local function single_mode_init(conf) if conf.watch_endpoint_slices then endpoints_informer.on_added = on_endpoint_slices_modified endpoints_informer.on_modified = on_endpoint_slices_modified + endpoints_informer.on_deleted = on_endpoint_slices_deleted + endpoints_informer.endpoint_slices_cache = {} else endpoints_informer.on_added = on_endpoint_modified endpoints_informer.on_modified = on_endpoint_modified + endpoints_informer.on_deleted = on_endpoint_deleted end - endpoints_informer.on_deleted = on_endpoint_deleted + endpoints_informer.pre_list = pre_list endpoints_informer.post_list = post_list @@ -574,11 +662,14 @@ local function multiple_mode_init(confs) if conf.watch_endpoint_slices then endpoints_informer.on_added = on_endpoint_slices_modified endpoints_informer.on_modified = on_endpoint_slices_modified + endpoints_informer.on_deleted = on_endpoint_slices_deleted + endpoints_informer.endpoint_slices_cache = {} else endpoints_informer.on_added = on_endpoint_modified endpoints_informer.on_modified = on_endpoint_modified + endpoints_informer.on_deleted = on_endpoint_deleted end - endpoints_informer.on_deleted = on_endpoint_deleted + endpoints_informer.pre_list = pre_list endpoints_informer.post_list = post_list From 955e58d252c293b7028beb4d7a9b2a7b3653dcd2 Mon Sep 17 00:00:00 2001 From: chuanFF Date: Mon, 15 Sep 2025 22:57:36 +0800 Subject: [PATCH 03/29] =?UTF-8?q?=E9=87=8D=E5=91=BD=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apisix/discovery/kubernetes/init.lua | 71 ++++++++++++---------------- 1 file changed, 31 insertions(+), 40 deletions(-) diff --git a/apisix/discovery/kubernetes/init.lua b/apisix/discovery/kubernetes/init.lua index 666b4e81d174..9eb2c5dfeacb 100644 --- a/apisix/discovery/kubernetes/init.lua +++ b/apisix/discovery/kubernetes/init.lua @@ -54,38 +54,40 @@ end local function update_endpoint_slices_cache(handle, endpoint_key, slice, slice_name) if not handle.endpoint_slices_cache[endpoint_key] then - handle.update_endpoint_slices_cache[endpoint_key] = {} + handle.endpoint_slices_cache[endpoint_key] = {} end local endpoint_slices = handle.endpoint_slices_cache[endpoint_key] endpoint_slices[slice_name] = slice end local function get_endpoints_from_cache(handle, endpoint_key) - local cached_endpoint_slices = handle.endpoint_slices_cache[endpoint_key] or {} - local service_endpoints = {} - for _, endpoint_slice in pairs(cached_endpoint_slices) do - for port, nodes in pairs(endpoint_slice) do - if not service_endpoints[port] then - service_endpoints[port] = core.table.new(0, #nodes) + local endpoint_slices = handle.endpoint_slices_cache[endpoint_key] or {} + local endpoints = {} + for _, endpoint_slice in pairs(endpoint_slices) do + for port, targets in pairs(endpoint_slice) do + if not endpoints[port] then + endpoints[port] = core.table.new(0, #targets) end - core.table.insert_tail(service_endpoints[port], unpack(nodes)) + core.table.insert_tail(endpoints[port], unpack(targets)) end end - return service_endpoints + return endpoints end local function update_endpoint_dict(handle, endpoints, endpoint_key) - local endpoints_content = core.json.encode(endpoints, true) - local endpoints_version = ngx.crc32_long(endpoints_content) + local endpoint_content = core.json.encode(endpoints, true) + local endpoint_version = ngx.crc32_long(endpoint_content) local _, err - _, err = handle.endpoint_dict:safe_set(endpoint_key .. "#version", endpoints_version) + _, err = handle.endpoint_dict:safe_set(endpoint_key .. "#version", endpoint_version) if err then core.log.error("set endpoint version into discovery DICT failed, ", err) + return false, err end - _, err = handle.endpoint_dict:safe_set(endpoint_key, endpoints_content) + _, err = handle.endpoint_dict:safe_set(endpoint_key, endpoint_content) if err then core.log.error("set endpoint into discovery DICT failed, ", err) handle.endpoint_dict:delete(endpoint_key .. "#version") + return false, err end end @@ -142,9 +144,9 @@ local function on_endpoint_slices_modified(handle, endpoint_slice) port_to_nodes[port_name] = nodes end - for _, address in ipairs(addresses) do + for _, ip in ipairs(addresses) do core.table.insert(nodes, { - host = address, + host = ip, port = port.port, weight = handle.default_weight }) @@ -157,12 +159,12 @@ local function on_endpoint_slices_modified(handle, endpoint_slice) local endpoint_key = endpoint_slice.metadata.namespace .. "/" .. endpoint_slice.metadata.labels["kubernetes.io/service-name"] update_endpoint_slices_cache(handle, endpoint_key, port_to_nodes, endpoint_slice.metadata.name) - local cached_service_endpoints = get_endpoints_from_cache(handle, endpoint_key) - for _, nodes in pairs(cached_service_endpoints) do + local cached_endpoints = get_endpoints_from_cache(handle, endpoint_key) + for _, nodes in pairs(cached_endpoints) do core.table.sort(nodes, sort_nodes_cmp) end - update_endpoint_dict(handle, cached_service_endpoints, endpoint_key) + update_endpoint_dict(handle, cached_endpoints, endpoint_key) end local function on_endpoint_slices_deleted(handle, endpoint_slice) @@ -193,12 +195,12 @@ local function on_endpoint_slices_deleted(handle, endpoint_slice) local endpoint_key = endpoint_slice.metadata.namespace .. "/" .. endpoint_slice.metadata.labels["kubernetes.io/service-name"] update_endpoint_slices_cache(handle, endpoint_key, nil, endpoint_slice.metadata.name) - local cached_service_endpoints = get_endpoints_from_cache(handle, endpoint_key) - for _, nodes in pairs(cached_service_endpoints) do + local cached_endpoints = get_endpoints_from_cache(handle, endpoint_key) + for _, nodes in pairs(cached_endpoints) do core.table.sort(nodes, sort_nodes_cmp) end - update_endpoint_dict(handle, cached_service_endpoints, endpoint_key) + update_endpoint_dict(handle, cached_endpoints, endpoint_key) end local function on_endpoint_modified(handle, endpoint) @@ -241,27 +243,14 @@ local function on_endpoint_modified(handle, endpoint) end end - for _, ports in pairs(endpoint_buffer) do - for _, nodes in pairs(ports) do - core.table.sort(nodes, sort_nodes_cmp) - end + + for _, nodes in pairs(endpoint_buffer) do + core.table.sort(nodes, sort_nodes_cmp) end - local endpoint_key = endpoint.metadata.namespace .. "/" .. endpoint.metadata.name - local endpoint_content = core.json.encode(endpoint_buffer, true) - local endpoint_version = ngx.crc32_long(endpoint_content) - local _, err - _, err = handle.endpoint_dict:safe_set(endpoint_key .. "#version", endpoint_version) - if err then - core.log.error("set endpoint version into discovery DICT failed, ", err) - return - end - _, err = handle.endpoint_dict:safe_set(endpoint_key, endpoint_content) - if err then - core.log.error("set endpoint into discovery DICT failed, ", err) - handle.endpoint_dict:delete(endpoint_key .. "#version") - end + local endpoint_key = endpoint.metadata.namespace .. "/" .. endpoint.metadata.name + update_endpoint_dict(handle, endpoint_buffer, endpoint_key) end @@ -280,7 +269,9 @@ end local function pre_list(handle) handle.endpoint_dict:flush_all() - handle.endpoint_slices_cache = {} + if handle.endpoint_slices_cache then + handle.endpoint_slices_cache = {} + end end From cb0d9be02fe89ec3dd62a6afa2125e3c3113975d Mon Sep 17 00:00:00 2001 From: chuanFF Date: Tue, 23 Sep 2025 00:41:58 +0800 Subject: [PATCH 04/29] =?UTF-8?q?endpointslices=E7=89=B9=E6=80=A7=20?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E7=94=A8=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- t/kubernetes/discovery/kubernetes4.t | 478 +++++++++++++++++++++++++++ 1 file changed, 478 insertions(+) create mode 100644 t/kubernetes/discovery/kubernetes4.t diff --git a/t/kubernetes/discovery/kubernetes4.t b/t/kubernetes/discovery/kubernetes4.t new file mode 100644 index 000000000000..a36d5dfcd014 --- /dev/null +++ b/t/kubernetes/discovery/kubernetes4.t @@ -0,0 +1,478 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +BEGIN { + our $token_file = "/tmp/var/run/secrets/kubernetes.io/serviceaccount/token"; + our $token_value = eval {`cat $token_file 2>/dev/null`}; + + our $yaml_config = <<_EOC_; +apisix: + node_listen: 1984 +deployment: + role: data_plane + role_data_plane: + config_provider: yaml +discovery: + kubernetes: + - id: first + service: + host: "127.0.0.1" + port: "6443" + client: + token_file: "/tmp/var/run/secrets/kubernetes.io/serviceaccount/token" + watch_endpoint_slices: true + - id: second + service: + schema: "http" + host: "127.0.0.1" + port: "6445" + client: + token_file: "/tmp/var/run/secrets/kubernetes.io/serviceaccount/token" + watch_endpoint_slices: true + +_EOC_ + + our $single_yaml_config = <<_EOC_; +apisix: + node_listen: 1984 +deployment: + role: data_plane + role_data_plane: + config_provider: yaml +discovery: + kubernetes: + service: + host: "127.0.0.1" + port: "6443" + client: + token_file: "/tmp/var/run/secrets/kubernetes.io/serviceaccount/token" + watch_endpoint_slices: true +_EOC_ + + our $scale_ns_c = <<_EOC_; +[ + { + "op": "replace_endpointslices", + "name": "ep", + "namespace": "ns-c", + "endpoints": [ + { + "addresses": [ + "10.0.0.1" + ], + "conditions": { + "ready": true, + "serving": true, + "terminating": false + }, + "nodeName": "kind-control-plane" + } + ] + "ports": [ + { + "name": "p1", + "port": 5001 + } + ] + } +] +_EOC_ + +} + +use t::APISIX 'no_plan'; + +repeat_each(1); +log_level('warn'); +no_root_location(); +no_shuffle(); +workers(4); + +add_block_preprocessor(sub { + my ($block) = @_; + + my $apisix_yaml = $block->apisix_yaml // <<_EOC_; +routes: [] +#END +_EOC_ + + $block->set_value("apisix_yaml", $apisix_yaml); + + my $main_config = $block->main_config // <<_EOC_; +env KUBERNETES_SERVICE_HOST=127.0.0.1; +env KUBERNETES_SERVICE_PORT=6443; +env KUBERNETES_CLIENT_TOKEN=$::token_value; +env KUBERNETES_CLIENT_TOKEN_FILE=$::token_file; +_EOC_ + + $block->set_value("main_config", $main_config); + + my $config = $block->config // <<_EOC_; + location /queries { + content_by_lua_block { + local core = require("apisix.core") + local d = require("apisix.discovery.kubernetes") + + ngx.sleep(1) + + ngx.req.read_body() + local request_body = ngx.req.get_body_data() + local queries = core.json.decode(request_body) + local response_body = "{" + for _,query in ipairs(queries) do + local nodes = d.nodes(query) + if nodes==nil or #nodes==0 then + response_body=response_body.." "..0 + else + response_body=response_body.." "..#nodes + end + end + ngx.say(response_body.." }") + } + } + + location /operators { + content_by_lua_block { + local http = require("resty.http") + local core = require("apisix.core") + local ipairs = ipairs + + ngx.req.read_body() + local request_body = ngx.req.get_body_data() + local operators = core.json.decode(request_body) + + core.log.info("get body ", request_body) + core.log.info("get operators ", #operators) + for _, op in ipairs(operators) do + local method, path, body + local headers = { + ["Host"] = "127.0.0.1:6445" + } + + if op.op == "replace_endpointslices" then + method = "PATCH" + path = "/apis/discovery.k8s.io/v1/namespaces/" .. op.namespace .. "/endpointslices/" .. op.name + if #op.endpoints == 0 then + body = '[{"path":"/endpoints","op":"replace","value":[]}]' + else + local t = { { op = "replace", path = "/endpoints", value = op.endpoints }, { op = "replace", path = "/ports", value = op.ports } } + body = core.json.encode(t, true) + end + headers["Content-Type"] = "application/json-patch+json" + end + + if op.op == "delete_endpointslices" then + method = "DELETE" + path = "/apis/discovery.k8s.io/v1/namespaces/" .. op.namespace .. "/endpointslices/" .. op.name + end + + + local httpc = http.new() + core.log.info("begin to connect ", "127.0.0.1:6445") + local ok, message = httpc:connect({ + scheme = "http", + host = "127.0.0.1", + port = 6445, + }) + if not ok then + core.log.error("connect 127.0.0.1:6445 failed, message : ", message) + ngx.say("FAILED") + end + local res, err = httpc:request({ + method = method, + path = path, + headers = headers, + body = body, + }) + if err ~= nil then + core.log.err("operator k8s cluster error: ", err) + return 500 + end + + ngx.sleep(1) + + local k8s = require("apisix.discovery.kubernetes") + local data = k8s.dump_data() + ngx.say(core.json.encode(data,true)) + + if res.status ~= 200 and res.status ~= 201 and res.status ~= 409 then + return res.status + end + end + ngx.say("DONE") + } + } + + location /dump { + content_by_lua_block { + local json_decode = require("toolkit.json").decode + local core = require("apisix.core") + local http = require "resty.http" + local httpc = http.new() + + ngx.sleep(1) + + local dump_uri = "http://127.0.0.1:" .. ngx.var.server_port .. "/v1/discovery/kubernetes/dump" + local res, err = httpc:request_uri(dump_uri, { method = "GET"}) + if err then + ngx.log(ngx.ERR, err) + ngx.status = res.status + return + end + + local body = json_decode(res.body) + local endpoints = body.endpoints + ngx.say(core.json.encode(endpoints,true)) + } + } + +_EOC_ + + $block->set_value("config", $config); + +}); + +run_tests(); + +__DATA__ + +=== TEST 1: create namespace and endpoints +--- yaml_config eval: $::yaml_config +--- request +POST /operators +[ + { + "op": "replace_endpointslices", + "namespace": "ns-a", + "name": "my-service-ab1", + "metadata": { + "labels": { + "kubernetes.io/service-name": "my-service" + } + }, + "endpoints": [ + { + "addresses": [ + "10.0.0.1" + ], + "conditions": { + "ready": true, + "serving": true, + "terminating": false + }, + "nodeName": "my-service-node1" + }, + { + "addresses": [ + "10.0.0.2" + ], + "conditions": { + "ready": true, + "serving": true, + "terminating": false + }, + "nodeName": "my-service-node2" + }, + ], + "ports": [ + { + "name": "p1", + "port": 5001 + } + ] + } +] +--- more_headers +Content-type: application/json +--- response_body_like +.*"name":"default/kubernetes".* + + + +=== TEST 2: test multi-k8s watching endpointSlices +--- yaml_config eval: $::yaml_config +--- request +GET /queries +[ + "first/ns-a/my-service:p1" +] +--- more_headers +Content-type: application/json +--- response_body eval +qr{ 2 } + + + + +=== TEST 3: test single-k8s watching endpointSlices +--- yaml_config eval: $::single_yaml_config +--- request +GET /queries +[ + "ns-a/my-service:p1" +] +--- more_headers +Content-type: application/json +--- response_body eval +qr{ 2 } + + + + +=== TEST 4: test endpointSlice added +--- yaml_config eval: $::yaml_config +--- request +POST /operators +[ + { + "op": "replace_endpointslices", + "namespace": "ns-a", + "name": "my-service-ab2", + "metadata": { + "labels": { + "kubernetes.io/service-name": "my-service" + } + }, + "endpoints": [ + { + "addresses": [ + "10.0.0.3" + ], + "conditions": { + "ready": true, + "serving": true, + "terminating": false + }, + "nodeName": "my-service-node3" + }, + { + "addresses": [ + "10.0.0.4" + ], + "conditions": { + "ready": true, + "serving": true, + "terminating": false + }, + "nodeName": "my-service-node4" + }, + ], + "ports": [ + { + "name": "p1", + "port": 5001 + } + ] + } +] +--- more_headers +Content-type: application/json +--- response_body_like +.*"name":"default/kubernetes".* + + + + + +=== TEST 5: test endpointSlice added for multi-k8s watching endpointSlices +--- yaml_config eval: $::yaml_config +--- request +GET /queries +[ + "first/ns-a/my-service:p1" +] +--- more_headers +Content-type: application/json +--- response_body eval +qr{ 4 } + + + + + +=== TEST 6: test endpointSlice added for single-k8s watching endpointSlices +--- yaml_config eval: $::single_yaml_config +--- request +GET /queries +[ + "ns-a/my-service:p1" +] +--- more_headers +Content-type: application/json +--- response_body eval +qr{ 4 } + + + + +=== TEST 7: test endpointSlice deleted +--- yaml_config eval: $::yaml_config +--- request +POST /operators +[ + { + "op": "delete_endpointslices", + "namespace": "ns-a", + "name": "my-service-ab2", + } +] +--- more_headers +Content-type: application/json +--- response_body_like +.*"name":"default/kubernetes".* + + + + +=== TEST 8: test endpointSlice deleted for multi-k8s watching endpointSlices +--- yaml_config eval: $::yaml_config +--- request +GET /queries +[ + "first/ns-a/my-service:p1" +] +--- more_headers +Content-type: application/json +--- response_body eval +qr{ 2 } + + + + + +=== TEST 9: test endpointSlice deleted for single-k8s watching endpointSlices +--- yaml_config eval: $::single_yaml_config +--- request +GET /queries +[ + "ns-a/my-service:p1" +] +--- more_headers +Content-type: application/json +--- response_body eval +qr{ 2 } + + + + + + + + + + + From 2eb8f62a09d16db2f593fb46b1ffa49c240b3135 Mon Sep 17 00:00:00 2001 From: chuanFF Date: Tue, 23 Sep 2025 00:46:09 +0800 Subject: [PATCH 05/29] =?UTF-8?q?endpointslices=E7=89=B9=E6=80=A7=20?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E7=94=A8=E4=BE=8B=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- t/kubernetes/discovery/kubernetes3.t | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/t/kubernetes/discovery/kubernetes3.t b/t/kubernetes/discovery/kubernetes3.t index 60b224820f38..d0415086a59e 100644 --- a/t/kubernetes/discovery/kubernetes3.t +++ b/t/kubernetes/discovery/kubernetes3.t @@ -258,9 +258,13 @@ __DATA__ POST /operators [ { - "op": "replace_endpointslices", "namespace": "ns-a", - "name": "epslice", + "name": "epslice-ab1", + "metadata": { + "labels": { + "kubernetes.io/service-name": "epslice" + } + }, "endpoints": [ { "addresses": [ @@ -301,7 +305,12 @@ POST /operators { "op": "replace_endpointslices", "namespace": "ns-b", - "name": "epslice", + "name": "epslice-ab1", + "metadata": { + "labels": { + "kubernetes.io/service-name": "epslice" + } + }, "endpoints": [ { "addresses": [ @@ -342,7 +351,12 @@ POST /operators { "op": "replace_endpointslices", "namespace": "ns-c", - "name": "epslice", + "name": "epslice-ab1", + "metadata": { + "labels": { + "kubernetes.io/service-name": "epslice" + } + }, "endpoints": [ { "addresses": [ From 405cd1d0381cf8709d25fc754ba62d00b97cc467 Mon Sep 17 00:00:00 2001 From: chuanFF Date: Tue, 23 Sep 2025 14:03:47 +0800 Subject: [PATCH 06/29] =?UTF-8?q?=E6=B5=8B=E8=AF=95=E7=94=A8=E4=BE=8B?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- t/kubernetes/configs/endpointslices.yaml | 12 +++++++--- t/kubernetes/discovery/kubernetes3.t | 24 +++++++++---------- t/kubernetes/discovery/kubernetes4.t | 30 ++++++++++++------------ 3 files changed, 36 insertions(+), 30 deletions(-) diff --git a/t/kubernetes/configs/endpointslices.yaml b/t/kubernetes/configs/endpointslices.yaml index d2285123346d..6b13198f6d08 100644 --- a/t/kubernetes/configs/endpointslices.yaml +++ b/t/kubernetes/configs/endpointslices.yaml @@ -24,8 +24,10 @@ metadata: kind: EndpointSlice apiVersion: discovery.k8s.io/v1 metadata: - name: epslice + name: service-a-epslice1 namespace: ns-a + labels: + "kubernetes.io/service-name": service-a addressType: IPv4 endpoints: [ ] --- @@ -39,8 +41,10 @@ metadata: kind: EndpointSlice apiVersion: discovery.k8s.io/v1 metadata: - name: epslice + name: service-a-epslice1 namespace: ns-b + labels: + "kubernetes.io/service-name": service-a addressType: IPv4 endpoints: [ ] --- @@ -54,8 +58,10 @@ metadata: kind: EndpointSlice apiVersion: discovery.k8s.io/v1 metadata: - name: epslice + name: service-a-epslice1 namespace: ns-c + labels: + "kubernetes.io/service-name": service-a addressType: IPv4 endpoints: [ ] --- diff --git a/t/kubernetes/discovery/kubernetes3.t b/t/kubernetes/discovery/kubernetes3.t index d0415086a59e..eae3fe949589 100644 --- a/t/kubernetes/discovery/kubernetes3.t +++ b/t/kubernetes/discovery/kubernetes3.t @@ -259,10 +259,10 @@ POST /operators [ { "namespace": "ns-a", - "name": "epslice-ab1", + "name": "service-a-epslice1", "metadata": { "labels": { - "kubernetes.io/service-name": "epslice" + "kubernetes.io/service-name": "service-a" } }, "endpoints": [ @@ -305,10 +305,10 @@ POST /operators { "op": "replace_endpointslices", "namespace": "ns-b", - "name": "epslice-ab1", + "name": "service-a-epslice1", "metadata": { "labels": { - "kubernetes.io/service-name": "epslice" + "kubernetes.io/service-name": "service-a" } }, "endpoints": [ @@ -351,10 +351,10 @@ POST /operators { "op": "replace_endpointslices", "namespace": "ns-c", - "name": "epslice-ab1", + "name": "service-a-epslice1", "metadata": { "labels": { - "kubernetes.io/service-name": "epslice" + "kubernetes.io/service-name": "service-a" } }, "endpoints": [ @@ -403,8 +403,8 @@ Content-type: application/json --- request GET /queries [ - "first/ns-a/epslice:p1","first/ns-a/epslice:p1","first/ns-b/epslice:p2","first/ns-b/epslice:p2","first/ns-c/epslice:p3","first/ns-c/epslice:p3", - "second/ns-a/epslice:p1","second/ns-a/epslice:p1","second/ns-b/epslice:p2","second/ns-b/epslice:p2","second/ns-c/epslice:p3","second/ns-c/epslice:p3" + "first/ns-a/service-a:p1","first/ns-a/service-a:p1","first/ns-b/service-a:p2","first/ns-b/service-a:p2","first/ns-c/service-a:p3","first/ns-c/service-a:p3", + "second/ns-a/service-a:p1","second/ns-a/service-a:p1","second/ns-b/service-a:p2","second/ns-b/service-a:p2","second/ns-c/service-a:p3","second/ns-c/service-a:p3" ] --- more_headers Content-type: application/json @@ -442,8 +442,8 @@ discovery: --- request GET /queries [ - "first/ns-a/epslice:p1","first/ns-a/epslice:p1","first/ns-b/epslice:p2","first/ns-b/epslice:p2","first/ns-c/epslice:p3","first/ns-c/epslice:p3", - "second/ns-a/epslice:p1","second/ns-a/epslice:p1","second/ns-b/epslice:p2","second/ns-b/epslice:p2","second/ns-c/epslice:p3","second/ns-c/epslice:p3" + "first/ns-a/service-a:p1","first/ns-a/service-a:p1","first/ns-b/service-a:p2","first/ns-b/service-a:p2","first/ns-c/service-a:p3","first/ns-c/service-a:p3", + "second/ns-a/service-a:p1","second/ns-a/service-a:p1","second/ns-b/service-a:p2","second/ns-b/service-a:p2","second/ns-c/service-a:p3","second/ns-c/service-a:p3" ] --- more_headers Content-type: application/json @@ -482,8 +482,8 @@ discovery: --- request GET /queries [ - "first/ns-a/epslice:p1","first/ns-a/epslice:p1","first/ns-b/epslice:p2","first/ns-b/epslice:p2","first/ns-c/epslice:p3","first/ns-c/epslice:p3", - "second/ns-a/epslice:p1","second/ns-a/epslice:p1","second/ns-b/epslice:p2","second/ns-b/epslice:p2","second/ns-c/epslice:p3","second/ns-c/epslice:p3" + "first/ns-a/service-a:p1","first/ns-a/service-a:p1","first/ns-b/service-a:p2","first/ns-b/service-a:p2","first/ns-c/service-a:p3","first/ns-c/service-a:p3", + "second/ns-a/service-a:p1","second/ns-a/service-a:p1","second/ns-b/service-a:p2","second/ns-b/service-a:p2","second/ns-c/service-a:p3","second/ns-c/service-a:p3" ] --- more_headers Content-type: application/json diff --git a/t/kubernetes/discovery/kubernetes4.t b/t/kubernetes/discovery/kubernetes4.t index a36d5dfcd014..80a4fa2c3712 100644 --- a/t/kubernetes/discovery/kubernetes4.t +++ b/t/kubernetes/discovery/kubernetes4.t @@ -258,10 +258,10 @@ POST /operators { "op": "replace_endpointslices", "namespace": "ns-a", - "name": "my-service-ab1", + "name": "service-a-epslice1", "metadata": { "labels": { - "kubernetes.io/service-name": "my-service" + "kubernetes.io/service-name": "service-a" } }, "endpoints": [ @@ -274,7 +274,7 @@ POST /operators "serving": true, "terminating": false }, - "nodeName": "my-service-node1" + "nodeName": "service-a-node1" }, { "addresses": [ @@ -285,7 +285,7 @@ POST /operators "serving": true, "terminating": false }, - "nodeName": "my-service-node2" + "nodeName": "service-a-node2" }, ], "ports": [ @@ -308,7 +308,7 @@ Content-type: application/json --- request GET /queries [ - "first/ns-a/my-service:p1" + "first/ns-a/service-a:p1" ] --- more_headers Content-type: application/json @@ -323,7 +323,7 @@ qr{ 2 } --- request GET /queries [ - "ns-a/my-service:p1" + "ns-a/service-a:p1" ] --- more_headers Content-type: application/json @@ -341,10 +341,10 @@ POST /operators { "op": "replace_endpointslices", "namespace": "ns-a", - "name": "my-service-ab2", + "name": "service-a-epslice2", "metadata": { "labels": { - "kubernetes.io/service-name": "my-service" + "kubernetes.io/service-name": "service-a" } }, "endpoints": [ @@ -357,7 +357,7 @@ POST /operators "serving": true, "terminating": false }, - "nodeName": "my-service-node3" + "nodeName": "service-a-node3" }, { "addresses": [ @@ -368,7 +368,7 @@ POST /operators "serving": true, "terminating": false }, - "nodeName": "my-service-node4" + "nodeName": "service-a-node4" }, ], "ports": [ @@ -393,7 +393,7 @@ Content-type: application/json --- request GET /queries [ - "first/ns-a/my-service:p1" + "first/ns-a/service-a:p1" ] --- more_headers Content-type: application/json @@ -409,7 +409,7 @@ qr{ 4 } --- request GET /queries [ - "ns-a/my-service:p1" + "ns-a/service-a:p1" ] --- more_headers Content-type: application/json @@ -427,7 +427,7 @@ POST /operators { "op": "delete_endpointslices", "namespace": "ns-a", - "name": "my-service-ab2", + "name": "service-a-epslice2", } ] --- more_headers @@ -443,7 +443,7 @@ Content-type: application/json --- request GET /queries [ - "first/ns-a/my-service:p1" + "first/ns-a/service-a:p1" ] --- more_headers Content-type: application/json @@ -459,7 +459,7 @@ qr{ 2 } --- request GET /queries [ - "ns-a/my-service:p1" + "ns-a/service-a:p1" ] --- more_headers Content-type: application/json From a0692d82b5204d9279a083ff9b55ac570b0c1297 Mon Sep 17 00:00:00 2001 From: chuanFF Date: Tue, 23 Sep 2025 14:46:18 +0800 Subject: [PATCH 07/29] =?UTF-8?q?=E6=B5=8B=E8=AF=95=E7=94=A8=E4=BE=8B?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- t/kubernetes/discovery/kubernetes3.t | 1 + 1 file changed, 1 insertion(+) diff --git a/t/kubernetes/discovery/kubernetes3.t b/t/kubernetes/discovery/kubernetes3.t index eae3fe949589..8d01bf88e07f 100644 --- a/t/kubernetes/discovery/kubernetes3.t +++ b/t/kubernetes/discovery/kubernetes3.t @@ -258,6 +258,7 @@ __DATA__ POST /operators [ { + "op": "replace_endpointslices", "namespace": "ns-a", "name": "service-a-epslice1", "metadata": { From d021127b1f301d3b72df22992d62737b56aba68f Mon Sep 17 00:00:00 2001 From: chuanFF Date: Tue, 23 Sep 2025 14:52:04 +0800 Subject: [PATCH 08/29] =?UTF-8?q?=E6=B5=8B=E8=AF=95=E7=94=A8=E4=BE=8B?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- t/kubernetes/discovery/kubernetes4.t | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/t/kubernetes/discovery/kubernetes4.t b/t/kubernetes/discovery/kubernetes4.t index 80a4fa2c3712..c4f1460c1311 100644 --- a/t/kubernetes/discovery/kubernetes4.t +++ b/t/kubernetes/discovery/kubernetes4.t @@ -286,7 +286,7 @@ POST /operators "terminating": false }, "nodeName": "service-a-node2" - }, + } ], "ports": [ { @@ -369,7 +369,7 @@ POST /operators "terminating": false }, "nodeName": "service-a-node4" - }, + } ], "ports": [ { From cf46457da5dbb3321e5d60e50f577c540ca11a1d Mon Sep 17 00:00:00 2001 From: chuanFF Date: Tue, 23 Sep 2025 15:18:19 +0800 Subject: [PATCH 09/29] =?UTF-8?q?=E6=B5=8B=E8=AF=95=E7=94=A8=E4=BE=8B?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- t/kubernetes/configs/endpointslices.yaml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/t/kubernetes/configs/endpointslices.yaml b/t/kubernetes/configs/endpointslices.yaml index 6b13198f6d08..00a34bfc198c 100644 --- a/t/kubernetes/configs/endpointslices.yaml +++ b/t/kubernetes/configs/endpointslices.yaml @@ -32,6 +32,17 @@ addressType: IPv4 endpoints: [ ] --- +kind: EndpointSlice +apiVersion: discovery.k8s.io/v1 +metadata: + name: service-a-epslice2 + namespace: ns-a + labels: + "kubernetes.io/service-name": service-a +addressType: IPv4 +endpoints: [ ] +--- + kind: Namespace apiVersion: v1 metadata: From 3451d22dbc6e7aa0a36de0e9fac298459a69340c Mon Sep 17 00:00:00 2001 From: chuanFF Date: Tue, 23 Sep 2025 15:32:09 +0800 Subject: [PATCH 10/29] =?UTF-8?q?=E6=B5=8B=E8=AF=95=E7=94=A8=E4=BE=8B?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- t/kubernetes/discovery/kubernetes4.t | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/t/kubernetes/discovery/kubernetes4.t b/t/kubernetes/discovery/kubernetes4.t index c4f1460c1311..c933c9332533 100644 --- a/t/kubernetes/discovery/kubernetes4.t +++ b/t/kubernetes/discovery/kubernetes4.t @@ -427,7 +427,7 @@ POST /operators { "op": "delete_endpointslices", "namespace": "ns-a", - "name": "service-a-epslice2", + "name": "service-a-epslice2" } ] --- more_headers From eef58986f0e7d117cf6b8797f678739349dcf9af Mon Sep 17 00:00:00 2001 From: chuanFF Date: Tue, 23 Sep 2025 15:53:48 +0800 Subject: [PATCH 11/29] =?UTF-8?q?=E6=B5=8B=E8=AF=95=E7=94=A8=E4=BE=8B?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- t/kubernetes/configs/endpointslices.yaml | 11 -------- t/kubernetes/discovery/kubernetes4.t | 35 ++++++++++++++++-------- 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/t/kubernetes/configs/endpointslices.yaml b/t/kubernetes/configs/endpointslices.yaml index 00a34bfc198c..6b13198f6d08 100644 --- a/t/kubernetes/configs/endpointslices.yaml +++ b/t/kubernetes/configs/endpointslices.yaml @@ -32,17 +32,6 @@ addressType: IPv4 endpoints: [ ] --- -kind: EndpointSlice -apiVersion: discovery.k8s.io/v1 -metadata: - name: service-a-epslice2 - namespace: ns-a - labels: - "kubernetes.io/service-name": service-a -addressType: IPv4 -endpoints: [ ] ---- - kind: Namespace apiVersion: v1 metadata: diff --git a/t/kubernetes/discovery/kubernetes4.t b/t/kubernetes/discovery/kubernetes4.t index c933c9332533..d87db6319f32 100644 --- a/t/kubernetes/discovery/kubernetes4.t +++ b/t/kubernetes/discovery/kubernetes4.t @@ -250,7 +250,7 @@ run_tests(); __DATA__ -=== TEST 1: create namespace and endpoints +=== TEST 1: endpointSlice1 update --- yaml_config eval: $::yaml_config --- request POST /operators @@ -286,6 +286,17 @@ POST /operators "terminating": false }, "nodeName": "service-a-node2" + }, + { + "addresses": [ + "10.0.0.3" + ], + "conditions": { + "ready": true, + "serving": true, + "terminating": false + }, + "nodeName": "service-a-node3" } ], "ports": [ @@ -313,7 +324,7 @@ GET /queries --- more_headers Content-type: application/json --- response_body eval -qr{ 2 } +qr{ 3 } @@ -328,12 +339,12 @@ GET /queries --- more_headers Content-type: application/json --- response_body eval -qr{ 2 } +qr{ 3 } -=== TEST 4: test endpointSlice added +=== TEST 4: endpointSlice2 create --- yaml_config eval: $::yaml_config --- request POST /operators @@ -350,25 +361,25 @@ POST /operators "endpoints": [ { "addresses": [ - "10.0.0.3" + "10.0.0.4" ], "conditions": { "ready": true, "serving": true, "terminating": false }, - "nodeName": "service-a-node3" + "nodeName": "service-a-node4" }, { "addresses": [ - "10.0.0.4" + "10.0.0.5" ], "conditions": { "ready": true, "serving": true, "terminating": false }, - "nodeName": "service-a-node4" + "nodeName": "service-a-node5" } ], "ports": [ @@ -398,7 +409,7 @@ GET /queries --- more_headers Content-type: application/json --- response_body eval -qr{ 4 } +qr{ 5 } @@ -414,7 +425,7 @@ GET /queries --- more_headers Content-type: application/json --- response_body eval -qr{ 4 } +qr{ 5 } @@ -448,7 +459,7 @@ GET /queries --- more_headers Content-type: application/json --- response_body eval -qr{ 2 } +qr{ 3 } @@ -464,7 +475,7 @@ GET /queries --- more_headers Content-type: application/json --- response_body eval -qr{ 2 } +qr{ 3 } From a934fed9ec1678192c1704272d610dc986dd4148 Mon Sep 17 00:00:00 2001 From: chuanFF Date: Tue, 23 Sep 2025 16:12:20 +0800 Subject: [PATCH 12/29] =?UTF-8?q?=E6=B5=8B=E8=AF=95=E7=94=A8=E4=BE=8B?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- t/kubernetes/discovery/kubernetes4.t | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/t/kubernetes/discovery/kubernetes4.t b/t/kubernetes/discovery/kubernetes4.t index d87db6319f32..740083c943d8 100644 --- a/t/kubernetes/discovery/kubernetes4.t +++ b/t/kubernetes/discovery/kubernetes4.t @@ -163,8 +163,12 @@ _EOC_ ["Host"] = "127.0.0.1:6445" } - if op.op == "replace_endpointslices" then - method = "PATCH" + if op.op == "replace_endpointslices" or op.op == "create_endpointslices" then + if op.op == "create_endpointslices" then + method = "POST" + else + method = "PATCH" + end path = "/apis/discovery.k8s.io/v1/namespaces/" .. op.namespace .. "/endpointslices/" .. op.name if #op.endpoints == 0 then body = '[{"path":"/endpoints","op":"replace","value":[]}]' @@ -350,7 +354,7 @@ qr{ 3 } POST /operators [ { - "op": "replace_endpointslices", + "op": "create_endpointslices", "namespace": "ns-a", "name": "service-a-epslice2", "metadata": { From f0c40b3aefed185a4a9ae22ff51ee88ef7f30743 Mon Sep 17 00:00:00 2001 From: chuanFF Date: Tue, 23 Sep 2025 16:52:11 +0800 Subject: [PATCH 13/29] =?UTF-8?q?=E6=B5=8B=E8=AF=95=E7=94=A8=E4=BE=8B?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- t/kubernetes/discovery/kubernetes4.t | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/t/kubernetes/discovery/kubernetes4.t b/t/kubernetes/discovery/kubernetes4.t index 740083c943d8..3a05a577a170 100644 --- a/t/kubernetes/discovery/kubernetes4.t +++ b/t/kubernetes/discovery/kubernetes4.t @@ -165,7 +165,7 @@ _EOC_ if op.op == "replace_endpointslices" or op.op == "create_endpointslices" then if op.op == "create_endpointslices" then - method = "POST" + method = "PUT" else method = "PATCH" end From d49f6eca905270b67f1a14a7bc6616fc5bdc046f Mon Sep 17 00:00:00 2001 From: chuanFF Date: Tue, 23 Sep 2025 20:14:31 +0800 Subject: [PATCH 14/29] =?UTF-8?q?=E6=B5=8B=E8=AF=95=E7=94=A8=E4=BE=8B?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- t/kubernetes/discovery/kubernetes4.t | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/t/kubernetes/discovery/kubernetes4.t b/t/kubernetes/discovery/kubernetes4.t index 3a05a577a170..0506b48f1449 100644 --- a/t/kubernetes/discovery/kubernetes4.t +++ b/t/kubernetes/discovery/kubernetes4.t @@ -163,12 +163,8 @@ _EOC_ ["Host"] = "127.0.0.1:6445" } - if op.op == "replace_endpointslices" or op.op == "create_endpointslices" then - if op.op == "create_endpointslices" then - method = "PUT" - else - method = "PATCH" - end + if op.op == "replace_endpointslices" then + method = "PATCH" path = "/apis/discovery.k8s.io/v1/namespaces/" .. op.namespace .. "/endpointslices/" .. op.name if #op.endpoints == 0 then body = '[{"path":"/endpoints","op":"replace","value":[]}]' @@ -177,9 +173,14 @@ _EOC_ body = core.json.encode(t, true) end headers["Content-Type"] = "application/json-patch+json" - end - if op.op == "delete_endpointslices" then + elseif op.op == "create_endpointslices" then + path = "/apis/discovery.k8s.io/v1/namespaces/" .. op.namespace .. "/endpointslices" + op.op = nil + op.namespace = nil + body = core.json.encode(op, true) + + elseif op.op == "delete_endpointslices" then method = "DELETE" path = "/apis/discovery.k8s.io/v1/namespaces/" .. op.namespace .. "/endpointslices/" .. op.name end @@ -356,12 +357,15 @@ POST /operators { "op": "create_endpointslices", "namespace": "ns-a", - "name": "service-a-epslice2", + "apiVersion": "discovery.k8s.io/v1", + "kind": "EndpointSlice", "metadata": { + "name": "service-a-epslice2", "labels": { "kubernetes.io/service-name": "service-a" } }, + "addressType": "IPv4", "endpoints": [ { "addresses": [ From 474d717350d743be0d8e83d1db55bd804da4a195 Mon Sep 17 00:00:00 2001 From: chuanFF Date: Tue, 23 Sep 2025 22:29:34 +0800 Subject: [PATCH 15/29] =?UTF-8?q?=E6=B5=8B=E8=AF=95=E7=94=A8=E4=BE=8B?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- t/kubernetes/discovery/kubernetes4.t | 1 + 1 file changed, 1 insertion(+) diff --git a/t/kubernetes/discovery/kubernetes4.t b/t/kubernetes/discovery/kubernetes4.t index 0506b48f1449..f3ed6dfd7cb9 100644 --- a/t/kubernetes/discovery/kubernetes4.t +++ b/t/kubernetes/discovery/kubernetes4.t @@ -175,6 +175,7 @@ _EOC_ headers["Content-Type"] = "application/json-patch+json" elseif op.op == "create_endpointslices" then + method = "POST" path = "/apis/discovery.k8s.io/v1/namespaces/" .. op.namespace .. "/endpointslices" op.op = nil op.namespace = nil From d4b938ed89da6541feaa73a84502e4f4c2c61016 Mon Sep 17 00:00:00 2001 From: chuanFF Date: Tue, 23 Sep 2025 23:09:48 +0800 Subject: [PATCH 16/29] =?UTF-8?q?=E6=B5=8B=E8=AF=95endpointslices=20?= =?UTF-8?q?=E7=9A=84=E5=A2=9E=E5=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- t/kubernetes/discovery/kubernetes4.t | 234 ++++++++++++++++----------- 1 file changed, 137 insertions(+), 97 deletions(-) diff --git a/t/kubernetes/discovery/kubernetes4.t b/t/kubernetes/discovery/kubernetes4.t index f3ed6dfd7cb9..d9a5f8cc00bd 100644 --- a/t/kubernetes/discovery/kubernetes4.t +++ b/t/kubernetes/discovery/kubernetes4.t @@ -211,10 +211,6 @@ _EOC_ ngx.sleep(1) - local k8s = require("apisix.discovery.kubernetes") - local data = k8s.dump_data() - ngx.say(core.json.encode(data,true)) - if res.status ~= 200 and res.status ~= 201 and res.status ~= 409 then return res.status end @@ -256,6 +252,23 @@ run_tests(); __DATA__ + + +--- request eval +[ + "GET /hello", + "PUT /v1/agent/service/register\n" . "{\"ID\":\"service_a1\",\"Name\":\"service_a\",\"Tags\":[\"primary\",\"v1\"],\"Address\":\"127.0.0.1\",\"Port\":30511,\"Meta\":{\"service_a_version\":\"4.1\"},\"EnableTagOverride\":false,\"Weights\":{\"Passing\":10,\"Warning\":1}}", + "GET /sleep?sec=5", + "GET /hello", +] +--- response_body_like eval +[ + qr/missing consul services\n/, + qr//, + qr/ok\n/, + qr/server 1\n/ +] + === TEST 1: endpointSlice1 update --- yaml_config eval: $::yaml_config --- request @@ -350,143 +363,170 @@ qr{ 3 } -=== TEST 4: endpointSlice2 create +=== TEST 4: endpointSlice2 create and delete for multi-k8s mode --- yaml_config eval: $::yaml_config ---- request -POST /operators +--- request eval +[ + +"POST /operators [ { - "op": "create_endpointslices", - "namespace": "ns-a", - "apiVersion": "discovery.k8s.io/v1", - "kind": "EndpointSlice", - "metadata": { - "name": "service-a-epslice2", - "labels": { - "kubernetes.io/service-name": "service-a" + \"op\": \"create_endpointslices\", + \"namespace\": \"ns-a\", + \"apiVersion\": \"discovery.k8s.io/v1\", + \"kind\": \"EndpointSlice\", + \"metadata\": { + \"name\": \"service-a-epslice2\", + \"labels\": { + \"kubernetes.io/service-name\": \"service-a\" } }, - "addressType": "IPv4", - "endpoints": [ + \"addressType\": \"IPv4\", + \"endpoints\": [ { - "addresses": [ - "10.0.0.4" + \"addresses\": [ + \"10.0.0.4\" ], - "conditions": { - "ready": true, - "serving": true, - "terminating": false + \"conditions\": { + \"ready\": true, + \"serving\": true, + \"terminating\": false }, - "nodeName": "service-a-node4" + \"nodeName\": \"service-a-node4\" }, { - "addresses": [ - "10.0.0.5" + \"addresses\": [ + \"10.0.0.5\" ], - "conditions": { - "ready": true, - "serving": true, - "terminating": false + \"conditions\": { + \"ready\": true, + \"serving\": true, + \"terminating\": false }, - "nodeName": "service-a-node5" + \"nodeName\": \"service-a-node5\" } ], - "ports": [ + \"ports\": [ { - "name": "p1", - "port": 5001 + \"name\": \"p1\", + \"port\": 5001 } ] } -] ---- more_headers -Content-type: application/json ---- response_body_like -.*"name":"default/kubernetes".* - - +]", +"GET /queries +[ + \"first/ns-a/service-a:p1\" +]", +"POST /operators +[ + { + \"op\": \"delete_endpointslices\", + \"namespace\": \"ns-a\", + \"name\": \"service-a-epslice2\" + } +]", -=== TEST 5: test endpointSlice added for multi-k8s watching endpointSlices ---- yaml_config eval: $::yaml_config ---- request -GET /queries +"GET /queries [ - "first/ns-a/service-a:p1" + \"first/ns-a/service-a:p1\" +]", + ] --- more_headers Content-type: application/json --- response_body eval -qr{ 5 } - - - - - -=== TEST 6: test endpointSlice added for single-k8s watching endpointSlices ---- yaml_config eval: $::single_yaml_config ---- request -GET /queries [ - "ns-a/service-a:p1" + "DONE\n", + "{ 5 }\n", + "DONE\n", + "{ 3 }\n", ] ---- more_headers -Content-type: application/json ---- response_body eval -qr{ 5 } - +=== TEST 5: endpointSlice2 create and delete for single-k8s mode +--- yaml_config eval: $::single_yaml_config +--- request eval +[ -=== TEST 7: test endpointSlice deleted ---- yaml_config eval: $::yaml_config ---- request -POST /operators +"POST /operators [ { - "op": "delete_endpointslices", - "namespace": "ns-a", - "name": "service-a-epslice2" + \"op\": \"create_endpointslices\", + \"namespace\": \"ns-a\", + \"apiVersion\": \"discovery.k8s.io/v1\", + \"kind\": \"EndpointSlice\", + \"metadata\": { + \"name\": \"service-a-epslice2\", + \"labels\": { + \"kubernetes.io/service-name\": \"service-a\" + } + }, + \"addressType\": \"IPv4\", + \"endpoints\": [ + { + \"addresses\": [ + \"10.0.0.4\" + ], + \"conditions\": { + \"ready\": true, + \"serving\": true, + \"terminating\": false + }, + \"nodeName\": \"service-a-node4\" + }, + { + \"addresses\": [ + \"10.0.0.5\" + ], + \"conditions\": { + \"ready\": true, + \"serving\": true, + \"terminating\": false + }, + \"nodeName\": \"service-a-node5\" + } + ], + \"ports\": [ + { + \"name\": \"p1\", + \"port\": 5001 + } + ] } -] ---- more_headers -Content-type: application/json ---- response_body_like -.*"name":"default/kubernetes".* - +]", +"GET /queries +[ + \"ns-a/service-a:p1\" +]", +"POST /operators +[ + { + \"op\": \"delete_endpointslices\", + \"namespace\": \"ns-a\", + \"name\": \"service-a-epslice2\" + } +]", -=== TEST 8: test endpointSlice deleted for multi-k8s watching endpointSlices ---- yaml_config eval: $::yaml_config ---- request -GET /queries +"GET /queries [ - "first/ns-a/service-a:p1" + \"ns-a/service-a:p1\" +]", + ] --- more_headers Content-type: application/json --- response_body eval -qr{ 3 } - - - - - -=== TEST 9: test endpointSlice deleted for single-k8s watching endpointSlices ---- yaml_config eval: $::single_yaml_config ---- request -GET /queries [ - "ns-a/service-a:p1" + "DONE\n", + "{ 5 }\n", + "DONE\n", + "{ 3 }\n", ] ---- more_headers -Content-type: application/json ---- response_body eval -qr{ 3 } - - From 06aa3f184f19be23386a6d00facf5fcf8ce63b16 Mon Sep 17 00:00:00 2001 From: chuanFF Date: Tue, 23 Sep 2025 23:28:57 +0800 Subject: [PATCH 17/29] =?UTF-8?q?=E6=B5=8B=E8=AF=95endpointslices=20?= =?UTF-8?q?=E7=9A=84=E5=A2=9E=E5=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- t/kubernetes/discovery/kubernetes4.t | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/t/kubernetes/discovery/kubernetes4.t b/t/kubernetes/discovery/kubernetes4.t index d9a5f8cc00bd..54ec6a65c492 100644 --- a/t/kubernetes/discovery/kubernetes4.t +++ b/t/kubernetes/discovery/kubernetes4.t @@ -328,8 +328,8 @@ POST /operators ] --- more_headers Content-type: application/json ---- response_body_like -.*"name":"default/kubernetes".* +--- response_body +DONE From e6dda54521c294d6e9714475f770e28368c6b555 Mon Sep 17 00:00:00 2001 From: chuanFF Date: Wed, 24 Sep 2025 00:01:33 +0800 Subject: [PATCH 18/29] =?UTF-8?q?=E6=B5=8B=E8=AF=95endpointslices=20scale?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- t/kubernetes/discovery/kubernetes4.t | 261 +++++++++++++++++++++++++++ 1 file changed, 261 insertions(+) diff --git a/t/kubernetes/discovery/kubernetes4.t b/t/kubernetes/discovery/kubernetes4.t index 54ec6a65c492..f0ca2cebf95f 100644 --- a/t/kubernetes/discovery/kubernetes4.t +++ b/t/kubernetes/discovery/kubernetes4.t @@ -529,7 +529,268 @@ Content-type: application/json ] +=== TEST 6: endpointSlice scale for multi-k8s mode +--- yaml_config eval: $::yaml_config +--- request eval +[ + +"POST /operators +[ + { + \"op\": \"replace_endpointslices\", + \"namespace\": \"ns-a\", + \"apiVersion\": \"discovery.k8s.io/v1\", + \"kind\": \"EndpointSlice\", + \"metadata\": { + \"name\": \"service-a-epslice1\", + \"labels\": { + \"kubernetes.io/service-name\": \"service-a\" + } + }, + \"addressType\": \"IPv4\", + \"endpoints\": [ + { + \"addresses\": [ + \"10.0.0.1\" + ], + \"conditions\": { + \"ready\": true, + \"serving\": true, + \"terminating\": false + }, + \"nodeName\": \"service-a-node1\" + }, + { + \"addresses\": [ + \"10.0.0.2\" + ], + \"conditions\": { + \"ready\": true, + \"serving\": true, + \"terminating\": false + }, + \"nodeName\": \"service-a-node2\" + } + ], + \"ports\": [ + { + \"name\": \"p1\", + \"port\": 5001 + } + ] + } +]", + +"GET /queries +[ + \"first/ns-a/service-a:p1\" +]", + +"POST /operators +[ + { + \"op\": \"replace_endpointslices\", + \"namespace\": \"ns-a\", + \"apiVersion\": \"discovery.k8s.io/v1\", + \"kind\": \"EndpointSlice\", + \"metadata\": { + \"name\": \"service-a-epslice1\", + \"labels\": { + \"kubernetes.io/service-name\": \"service-a\" + } + }, + \"addressType\": \"IPv4\", + \"endpoints\": [ + { + \"addresses\": [ + \"10.0.0.1\" + ], + \"conditions\": { + \"ready\": true, + \"serving\": true, + \"terminating\": false + }, + \"nodeName\": \"service-a-node1\" + }, + { + \"addresses\": [ + \"10.0.0.2\" + ], + \"conditions\": { + \"ready\": true, + \"serving\": true, + \"terminating\": false + }, + \"nodeName\": \"service-a-node2\" + }, + { + \"addresses\": [ + \"10.0.0.3\" + ], + \"conditions\": { + \"ready\": true, + \"serving\": true, + \"terminating\": false + }, + \"nodeName\": \"service-a-node3\" + } + ], + \"ports\": [ + { + \"name\": \"p1\", + \"port\": 5001 + } + ] + } +]", + +"GET /queries +[ + \"first/ns-a/service-a:p1\" +]", + +] +--- more_headers +Content-type: application/json +--- response_body eval +[ + "DONE\n", + "{ 2 }\n", + "DONE\n", + "{ 3 }\n", +] + +=== TEST 7: endpointSlice scale for single-k8s mode +--- yaml_config eval: $::single_yaml_config +--- request eval +[ + +"POST /operators +[ + { + \"op\": \"replace_endpointslices\", + \"namespace\": \"ns-a\", + \"apiVersion\": \"discovery.k8s.io/v1\", + \"kind\": \"EndpointSlice\", + \"metadata\": { + \"name\": \"service-a-epslice1\", + \"labels\": { + \"kubernetes.io/service-name\": \"service-a\" + } + }, + \"addressType\": \"IPv4\", + \"endpoints\": [ + { + \"addresses\": [ + \"10.0.0.1\" + ], + \"conditions\": { + \"ready\": true, + \"serving\": true, + \"terminating\": false + }, + \"nodeName\": \"service-a-node1\" + }, + { + \"addresses\": [ + \"10.0.0.2\" + ], + \"conditions\": { + \"ready\": true, + \"serving\": true, + \"terminating\": false + }, + \"nodeName\": \"service-a-node2\" + } + ], + \"ports\": [ + { + \"name\": \"p1\", + \"port\": 5001 + } + ] + } +]", + +"GET /queries +[ + \"first/ns-a/service-a:p1\" +]", + +"POST /operators +[ + { + \"op\": \"replace_endpointslices\", + \"namespace\": \"ns-a\", + \"apiVersion\": \"discovery.k8s.io/v1\", + \"kind\": \"EndpointSlice\", + \"metadata\": { + \"name\": \"service-a-epslice1\", + \"labels\": { + \"kubernetes.io/service-name\": \"service-a\" + } + }, + \"addressType\": \"IPv4\", + \"endpoints\": [ + { + \"addresses\": [ + \"10.0.0.1\" + ], + \"conditions\": { + \"ready\": true, + \"serving\": true, + \"terminating\": false + }, + \"nodeName\": \"service-a-node1\" + }, + { + \"addresses\": [ + \"10.0.0.2\" + ], + \"conditions\": { + \"ready\": true, + \"serving\": true, + \"terminating\": false + }, + \"nodeName\": \"service-a-node2\" + }, + { + \"addresses\": [ + \"10.0.0.3\" + ], + \"conditions\": { + \"ready\": true, + \"serving\": true, + \"terminating\": false + }, + \"nodeName\": \"service-a-node3\" + } + ], + \"ports\": [ + { + \"name\": \"p1\", + \"port\": 5001 + } + ] + } +]", + +"GET /queries +[ + \"first/ns-a/service-a:p1\" +]", + +] +--- more_headers +Content-type: application/json +--- response_body eval +[ + "DONE\n", + "{ 2 }\n", + "DONE\n", + "{ 3 }\n", +] From 173b8ee9ac56a9d639b91c5f861c2c9846420e0a Mon Sep 17 00:00:00 2001 From: chuanFF Date: Wed, 24 Sep 2025 00:03:50 +0800 Subject: [PATCH 19/29] =?UTF-8?q?=E6=B5=8B=E8=AF=95endpointslices=20scale?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- t/kubernetes/discovery/kubernetes4.t | 22 +++------------------- 1 file changed, 3 insertions(+), 19 deletions(-) diff --git a/t/kubernetes/discovery/kubernetes4.t b/t/kubernetes/discovery/kubernetes4.t index f0ca2cebf95f..3a2fed39d7f0 100644 --- a/t/kubernetes/discovery/kubernetes4.t +++ b/t/kubernetes/discovery/kubernetes4.t @@ -252,23 +252,6 @@ run_tests(); __DATA__ - - ---- request eval -[ - "GET /hello", - "PUT /v1/agent/service/register\n" . "{\"ID\":\"service_a1\",\"Name\":\"service_a\",\"Tags\":[\"primary\",\"v1\"],\"Address\":\"127.0.0.1\",\"Port\":30511,\"Meta\":{\"service_a_version\":\"4.1\"},\"EnableTagOverride\":false,\"Weights\":{\"Passing\":10,\"Warning\":1}}", - "GET /sleep?sec=5", - "GET /hello", -] ---- response_body_like eval -[ - qr/missing consul services\n/, - qr//, - qr/ok\n/, - qr/server 1\n/ -] - === TEST 1: endpointSlice1 update --- yaml_config eval: $::yaml_config --- request @@ -347,7 +330,6 @@ qr{ 3 } - === TEST 3: test single-k8s watching endpointSlices --- yaml_config eval: $::single_yaml_config --- request @@ -362,7 +344,6 @@ qr{ 3 } - === TEST 4: endpointSlice2 create and delete for multi-k8s mode --- yaml_config eval: $::yaml_config --- request eval @@ -446,6 +427,7 @@ Content-type: application/json ] + === TEST 5: endpointSlice2 create and delete for single-k8s mode --- yaml_config eval: $::single_yaml_config --- request eval @@ -529,6 +511,7 @@ Content-type: application/json ] + === TEST 6: endpointSlice scale for multi-k8s mode --- yaml_config eval: $::yaml_config --- request eval @@ -661,6 +644,7 @@ Content-type: application/json ] + === TEST 7: endpointSlice scale for single-k8s mode --- yaml_config eval: $::single_yaml_config --- request eval From db54c3b0432438ce1047809eae4735f6f52b8833 Mon Sep 17 00:00:00 2001 From: chuanFF Date: Wed, 24 Sep 2025 00:09:32 +0800 Subject: [PATCH 20/29] =?UTF-8?q?=E6=B5=8B=E8=AF=95endpointslices=20scale?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- t/kubernetes/discovery/kubernetes4.t | 52 ---------------------------- 1 file changed, 52 deletions(-) diff --git a/t/kubernetes/discovery/kubernetes4.t b/t/kubernetes/discovery/kubernetes4.t index 3a2fed39d7f0..bc5b373faeb2 100644 --- a/t/kubernetes/discovery/kubernetes4.t +++ b/t/kubernetes/discovery/kubernetes4.t @@ -63,35 +63,6 @@ discovery: watch_endpoint_slices: true _EOC_ - our $scale_ns_c = <<_EOC_; -[ - { - "op": "replace_endpointslices", - "name": "ep", - "namespace": "ns-c", - "endpoints": [ - { - "addresses": [ - "10.0.0.1" - ], - "conditions": { - "ready": true, - "serving": true, - "terminating": false - }, - "nodeName": "kind-control-plane" - } - ] - "ports": [ - { - "name": "p1", - "port": 5001 - } - ] - } -] -_EOC_ - } use t::APISIX 'no_plan'; @@ -219,29 +190,6 @@ _EOC_ } } - location /dump { - content_by_lua_block { - local json_decode = require("toolkit.json").decode - local core = require("apisix.core") - local http = require "resty.http" - local httpc = http.new() - - ngx.sleep(1) - - local dump_uri = "http://127.0.0.1:" .. ngx.var.server_port .. "/v1/discovery/kubernetes/dump" - local res, err = httpc:request_uri(dump_uri, { method = "GET"}) - if err then - ngx.log(ngx.ERR, err) - ngx.status = res.status - return - end - - local body = json_decode(res.body) - local endpoints = body.endpoints - ngx.say(core.json.encode(endpoints,true)) - } - } - _EOC_ $block->set_value("config", $config); From 591d1e6790448aa5a3be293fc76c0be7ce406044 Mon Sep 17 00:00:00 2001 From: chuanFF Date: Wed, 24 Sep 2025 00:30:07 +0800 Subject: [PATCH 21/29] =?UTF-8?q?=E6=B5=8B=E8=AF=95=E7=94=A8=E4=BE=8B?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- t/kubernetes/discovery/kubernetes4.t | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/t/kubernetes/discovery/kubernetes4.t b/t/kubernetes/discovery/kubernetes4.t index bc5b373faeb2..044904216215 100644 --- a/t/kubernetes/discovery/kubernetes4.t +++ b/t/kubernetes/discovery/kubernetes4.t @@ -469,6 +469,7 @@ Content-type: application/json [ { \"op\": \"replace_endpointslices\", + \"name\": \"service-a-epslice1\", \"namespace\": \"ns-a\", \"apiVersion\": \"discovery.k8s.io/v1\", \"kind\": \"EndpointSlice\", @@ -521,6 +522,7 @@ Content-type: application/json [ { \"op\": \"replace_endpointslices\", + \"name\": \"service-a-epslice1\", \"namespace\": \"ns-a\", \"apiVersion\": \"discovery.k8s.io/v1\", \"kind\": \"EndpointSlice\", @@ -602,6 +604,7 @@ Content-type: application/json [ { \"op\": \"replace_endpointslices\", + \"name\": \"service-a-epslice1\", \"namespace\": \"ns-a\", \"apiVersion\": \"discovery.k8s.io/v1\", \"kind\": \"EndpointSlice\", @@ -654,6 +657,7 @@ Content-type: application/json [ { \"op\": \"replace_endpointslices\", + \"name\": \"service-a-epslice1\", \"namespace\": \"ns-a\", \"apiVersion\": \"discovery.k8s.io/v1\", \"kind\": \"EndpointSlice\", From 46d6b6b5afbbc7c8352b452570156e13ae145d4f Mon Sep 17 00:00:00 2001 From: chuanFF Date: Wed, 24 Sep 2025 00:45:46 +0800 Subject: [PATCH 22/29] =?UTF-8?q?=E6=B5=8B=E8=AF=95=E7=94=A8=E4=BE=8B?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- t/kubernetes/discovery/kubernetes4.t | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/t/kubernetes/discovery/kubernetes4.t b/t/kubernetes/discovery/kubernetes4.t index 044904216215..c077c38f3340 100644 --- a/t/kubernetes/discovery/kubernetes4.t +++ b/t/kubernetes/discovery/kubernetes4.t @@ -650,7 +650,7 @@ Content-type: application/json "GET /queries [ - \"first/ns-a/service-a:p1\" + \"ns-a/service-a:p1\" ]", "POST /operators @@ -714,7 +714,7 @@ Content-type: application/json "GET /queries [ - \"first/ns-a/service-a:p1\" + \"ns-a/service-a:p1\" ]", ] From 65fbd0b69a1d5890d930512787af2ef4d36897a0 Mon Sep 17 00:00:00 2001 From: chuanFF Date: Wed, 24 Sep 2025 11:39:52 +0800 Subject: [PATCH 23/29] =?UTF-8?q?=E6=B5=8B=E8=AF=95=E7=94=A8=E4=BE=8B?= =?UTF-8?q?=E7=B2=BE=E7=AE=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- t/kubernetes/discovery/kubernetes4.t | 513 +++++++++------------------ 1 file changed, 164 insertions(+), 349 deletions(-) diff --git a/t/kubernetes/discovery/kubernetes4.t b/t/kubernetes/discovery/kubernetes4.t index c077c38f3340..3eae26df1d25 100644 --- a/t/kubernetes/discovery/kubernetes4.t +++ b/t/kubernetes/discovery/kubernetes4.t @@ -63,6 +63,163 @@ discovery: watch_endpoint_slices: true _EOC_ + our $create_ns_a_epslice2 = <<_EOC_; +[ + { + "op": "create_endpointslices", + "namespace": "ns-a", + "apiVersion": "discovery.k8s.io/v1", + "kind": "EndpointSlice", + "metadata": { + "name": "service-a-epslice2", + "labels": { + "kubernetes.io/service-name": "service-a" + } + }, + "addressType": "IPv4", + "endpoints": [ + { + "addresses": [ + "10.0.0.4" + ], + "conditions": { + "ready": true, + "serving": true, + "terminating": false + }, + "nodeName": "service-a-node4" + }, + { + "addresses": [ + "10.0.0.5" + ], + "conditions": { + "ready": true, + "serving": true, + "terminating": false + }, + "nodeName": "service-a-node5" + } + ], + "ports": [ + { + "name": "p1", + "port": 5001 + } + ] + } +] +_EOC_ + + our $scale_in_ns_a_epslice1 = <<_EOC_; +[ + { + "op": "replace_endpointslices", + "name": "service-a-epslice1", + "namespace": "ns-a", + "apiVersion": "discovery.k8s.io/v1", + "kind": "EndpointSlice", + "metadata": { + "name": "service-a-epslice1", + "labels": { + "kubernetes.io/service-name": "service-a" + } + }, + "addressType": "IPv4", + "endpoints": [ + { + "addresses": [ + "10.0.0.1" + ], + "conditions": { + "ready": true, + "serving": true, + "terminating": false + }, + "nodeName": "service-a-node1" + }, + { + "addresses": [ + "10.0.0.2" + ], + "conditions": { + "ready": true, + "serving": true, + "terminating": false + }, + "nodeName": "service-a-node2" + } + ], + "ports": [ + { + "name": "p1", + "port": 5001 + } + ] + } +] +_EOC_ + + our $scale_up_ns_a_epslice1 = <<_EOC_; +[ + { + "op": "replace_endpointslices", + "name": "service-a-epslice1", + "namespace": "ns-a", + "apiVersion": "discovery.k8s.io/v1", + "kind": "EndpointSlice", + "metadata": { + "name": "service-a-epslice1", + "labels": { + "kubernetes.io/service-name": "service-a" + } + }, + "addressType": "IPv4", + "endpoints": [ + { + "addresses": [ + "10.0.0.1" + ], + "conditions": { + "ready": true, + "serving": true, + "terminating": false + }, + "nodeName": "service-a-node1" + }, + { + "addresses": [ + "10.0.0.2" + ], + "conditions": { + "ready": true, + "serving": true, + "terminating": false + }, + "nodeName": "service-a-node2" + }, + { + "addresses": [ + "10.0.0.3" + ], + "conditions": { + "ready": true, + "serving": true, + "terminating": false + }, + "nodeName": "service-a-node3" + } + ], + "ports": [ + { + "name": "p1", + "port": 5001 + } + ] + } +] +_EOC_ + } use t::APISIX 'no_plan'; @@ -204,59 +361,7 @@ __DATA__ --- yaml_config eval: $::yaml_config --- request POST /operators -[ - { - "op": "replace_endpointslices", - "namespace": "ns-a", - "name": "service-a-epslice1", - "metadata": { - "labels": { - "kubernetes.io/service-name": "service-a" - } - }, - "endpoints": [ - { - "addresses": [ - "10.0.0.1" - ], - "conditions": { - "ready": true, - "serving": true, - "terminating": false - }, - "nodeName": "service-a-node1" - }, - { - "addresses": [ - "10.0.0.2" - ], - "conditions": { - "ready": true, - "serving": true, - "terminating": false - }, - "nodeName": "service-a-node2" - }, - { - "addresses": [ - "10.0.0.3" - ], - "conditions": { - "ready": true, - "serving": true, - "terminating": false - }, - "nodeName": "service-a-node3" - } - ], - "ports": [ - { - "name": "p1", - "port": 5001 - } - ] - } -] +$::scale_up_ns_a_epslice1 --- more_headers Content-type: application/json --- response_body @@ -298,51 +403,7 @@ qr{ 3 } [ "POST /operators -[ - { - \"op\": \"create_endpointslices\", - \"namespace\": \"ns-a\", - \"apiVersion\": \"discovery.k8s.io/v1\", - \"kind\": \"EndpointSlice\", - \"metadata\": { - \"name\": \"service-a-epslice2\", - \"labels\": { - \"kubernetes.io/service-name\": \"service-a\" - } - }, - \"addressType\": \"IPv4\", - \"endpoints\": [ - { - \"addresses\": [ - \"10.0.0.4\" - ], - \"conditions\": { - \"ready\": true, - \"serving\": true, - \"terminating\": false - }, - \"nodeName\": \"service-a-node4\" - }, - { - \"addresses\": [ - \"10.0.0.5\" - ], - \"conditions\": { - \"ready\": true, - \"serving\": true, - \"terminating\": false - }, - \"nodeName\": \"service-a-node5\" - } - ], - \"ports\": [ - { - \"name\": \"p1\", - \"port\": 5001 - } - ] - } -]", +$::create_ns_a_epslice2", "GET /queries [ @@ -382,51 +443,7 @@ Content-type: application/json [ "POST /operators -[ - { - \"op\": \"create_endpointslices\", - \"namespace\": \"ns-a\", - \"apiVersion\": \"discovery.k8s.io/v1\", - \"kind\": \"EndpointSlice\", - \"metadata\": { - \"name\": \"service-a-epslice2\", - \"labels\": { - \"kubernetes.io/service-name\": \"service-a\" - } - }, - \"addressType\": \"IPv4\", - \"endpoints\": [ - { - \"addresses\": [ - \"10.0.0.4\" - ], - \"conditions\": { - \"ready\": true, - \"serving\": true, - \"terminating\": false - }, - \"nodeName\": \"service-a-node4\" - }, - { - \"addresses\": [ - \"10.0.0.5\" - ], - \"conditions\": { - \"ready\": true, - \"serving\": true, - \"terminating\": false - }, - \"nodeName\": \"service-a-node5\" - } - ], - \"ports\": [ - { - \"name\": \"p1\", - \"port\": 5001 - } - ] - } -]", +$::create_ns_a_epslice2", "GET /queries [ @@ -466,52 +483,7 @@ Content-type: application/json [ "POST /operators -[ - { - \"op\": \"replace_endpointslices\", - \"name\": \"service-a-epslice1\", - \"namespace\": \"ns-a\", - \"apiVersion\": \"discovery.k8s.io/v1\", - \"kind\": \"EndpointSlice\", - \"metadata\": { - \"name\": \"service-a-epslice1\", - \"labels\": { - \"kubernetes.io/service-name\": \"service-a\" - } - }, - \"addressType\": \"IPv4\", - \"endpoints\": [ - { - \"addresses\": [ - \"10.0.0.1\" - ], - \"conditions\": { - \"ready\": true, - \"serving\": true, - \"terminating\": false - }, - \"nodeName\": \"service-a-node1\" - }, - { - \"addresses\": [ - \"10.0.0.2\" - ], - \"conditions\": { - \"ready\": true, - \"serving\": true, - \"terminating\": false - }, - \"nodeName\": \"service-a-node2\" - } - ], - \"ports\": [ - { - \"name\": \"p1\", - \"port\": 5001 - } - ] - } -]", +$::scale_in_ns_a_epslice1", "GET /queries [ @@ -519,63 +491,7 @@ Content-type: application/json ]", "POST /operators -[ - { - \"op\": \"replace_endpointslices\", - \"name\": \"service-a-epslice1\", - \"namespace\": \"ns-a\", - \"apiVersion\": \"discovery.k8s.io/v1\", - \"kind\": \"EndpointSlice\", - \"metadata\": { - \"name\": \"service-a-epslice1\", - \"labels\": { - \"kubernetes.io/service-name\": \"service-a\" - } - }, - \"addressType\": \"IPv4\", - \"endpoints\": [ - { - \"addresses\": [ - \"10.0.0.1\" - ], - \"conditions\": { - \"ready\": true, - \"serving\": true, - \"terminating\": false - }, - \"nodeName\": \"service-a-node1\" - }, - { - \"addresses\": [ - \"10.0.0.2\" - ], - \"conditions\": { - \"ready\": true, - \"serving\": true, - \"terminating\": false - }, - \"nodeName\": \"service-a-node2\" - }, - { - \"addresses\": [ - \"10.0.0.3\" - ], - \"conditions\": { - \"ready\": true, - \"serving\": true, - \"terminating\": false - }, - \"nodeName\": \"service-a-node3\" - } - ], - \"ports\": [ - { - \"name\": \"p1\", - \"port\": 5001 - } - ] - } -]", +$::scale_up_ns_a_epslice1", "GET /queries [ @@ -601,52 +517,7 @@ Content-type: application/json [ "POST /operators -[ - { - \"op\": \"replace_endpointslices\", - \"name\": \"service-a-epslice1\", - \"namespace\": \"ns-a\", - \"apiVersion\": \"discovery.k8s.io/v1\", - \"kind\": \"EndpointSlice\", - \"metadata\": { - \"name\": \"service-a-epslice1\", - \"labels\": { - \"kubernetes.io/service-name\": \"service-a\" - } - }, - \"addressType\": \"IPv4\", - \"endpoints\": [ - { - \"addresses\": [ - \"10.0.0.1\" - ], - \"conditions\": { - \"ready\": true, - \"serving\": true, - \"terminating\": false - }, - \"nodeName\": \"service-a-node1\" - }, - { - \"addresses\": [ - \"10.0.0.2\" - ], - \"conditions\": { - \"ready\": true, - \"serving\": true, - \"terminating\": false - }, - \"nodeName\": \"service-a-node2\" - } - ], - \"ports\": [ - { - \"name\": \"p1\", - \"port\": 5001 - } - ] - } -]", +$::scale_in_ns_a_epslice1", "GET /queries [ @@ -654,63 +525,7 @@ Content-type: application/json ]", "POST /operators -[ - { - \"op\": \"replace_endpointslices\", - \"name\": \"service-a-epslice1\", - \"namespace\": \"ns-a\", - \"apiVersion\": \"discovery.k8s.io/v1\", - \"kind\": \"EndpointSlice\", - \"metadata\": { - \"name\": \"service-a-epslice1\", - \"labels\": { - \"kubernetes.io/service-name\": \"service-a\" - } - }, - \"addressType\": \"IPv4\", - \"endpoints\": [ - { - \"addresses\": [ - \"10.0.0.1\" - ], - \"conditions\": { - \"ready\": true, - \"serving\": true, - \"terminating\": false - }, - \"nodeName\": \"service-a-node1\" - }, - { - \"addresses\": [ - \"10.0.0.2\" - ], - \"conditions\": { - \"ready\": true, - \"serving\": true, - \"terminating\": false - }, - \"nodeName\": \"service-a-node2\" - }, - { - \"addresses\": [ - \"10.0.0.3\" - ], - \"conditions\": { - \"ready\": true, - \"serving\": true, - \"terminating\": false - }, - \"nodeName\": \"service-a-node3\" - } - ], - \"ports\": [ - { - \"name\": \"p1\", - \"port\": 5001 - } - ] - } -]", +$::scale_up_ns_a_epslice1", "GET /queries [ From 485e7ebfa7e05193de1c1025bbca02231a962490 Mon Sep 17 00:00:00 2001 From: chuanFF Date: Wed, 24 Sep 2025 14:37:59 +0800 Subject: [PATCH 24/29] =?UTF-8?q?=E6=B5=8B=E8=AF=95=E7=94=A8=E4=BE=8B?= =?UTF-8?q?=E7=B2=BE=E7=AE=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- t/kubernetes/discovery/kubernetes4.t | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/t/kubernetes/discovery/kubernetes4.t b/t/kubernetes/discovery/kubernetes4.t index 3eae26df1d25..b7f960beaa85 100644 --- a/t/kubernetes/discovery/kubernetes4.t +++ b/t/kubernetes/discovery/kubernetes4.t @@ -359,7 +359,7 @@ __DATA__ === TEST 1: endpointSlice1 update --- yaml_config eval: $::yaml_config ---- request +--- request eval POST /operators $::scale_up_ns_a_epslice1 --- more_headers From 0a6b12e3c1c5f5adf9530d389b756e6b9b2abb10 Mon Sep 17 00:00:00 2001 From: chuanFF Date: Wed, 24 Sep 2025 15:04:17 +0800 Subject: [PATCH 25/29] =?UTF-8?q?=E8=A1=8C=E9=95=BF=E5=BA=A6=E9=99=90?= =?UTF-8?q?=E5=88=B6100?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apisix/discovery/kubernetes/init.lua | 38 ++++++++++++++++++---------- 1 file changed, 25 insertions(+), 13 deletions(-) diff --git a/apisix/discovery/kubernetes/init.lua b/apisix/discovery/kubernetes/init.lua index 9eb2c5dfeacb..dddc1bc54c61 100644 --- a/apisix/discovery/kubernetes/init.lua +++ b/apisix/discovery/kubernetes/init.lua @@ -26,7 +26,7 @@ local os = os local error = error local pcall = pcall local setmetatable = setmetatable -local type = type + local is_http = ngx.config.subsystem == "http" local process = require("ngx.process") local core = require("apisix.core") @@ -93,19 +93,24 @@ end local function on_endpoint_slices_modified(handle, endpoint_slice) if not endpoint_slice.metadata then - core.log.error("endpoint_slice has no metadata, endpointSlice: ", core.json.delay_encode(endpoint_slice)) + core.log.error("endpoint_slice has no metadata, endpointSlice: ", + core.json.delay_encode(endpoint_slice)) return end if not endpoint_slice.metadata.name then - core.log.error("endpoint_slice has no metadata.name, endpointSlice: ", core.json.delay_encode(endpoint_slice)) + core.log.error("endpoint_slice has no metadata.name, endpointSlice: ", + core.json.delay_encode(endpoint_slice)) return end if not endpoint_slice.metadata.namespace then - core.log.error("endpoint_slice has no metadata.namespace, endpointSlice: ", core.json.delay_encode(endpoint_slice)) + core.log.error("endpoint_slice has no metadata.namespace, endpointSlice: ", + core.json.delay_encode(endpoint_slice)) return end - if not endpoint_slice.metadata.labels or not endpoint_slice.metadata.labels["kubernetes.io/service-name"] then - core.log.error("endpoint_slice has no service-name, endpointSlice: ", core.json.delay_encode(endpoint_slice)) + if not endpoint_slice.metadata.labels + or not endpoint_slice.metadata.labels["kubernetes.io/service-name"] then + core.log.error("endpoint_slice has no service-name, endpointSlice: ", + core.json.delay_encode(endpoint_slice)) return end @@ -156,7 +161,8 @@ local function on_endpoint_slices_modified(handle, endpoint_slice) end end - local endpoint_key = endpoint_slice.metadata.namespace .. "/" .. endpoint_slice.metadata.labels["kubernetes.io/service-name"] + local endpoint_key = endpoint_slice.metadata.namespace + .. "/" .. endpoint_slice.metadata.labels["kubernetes.io/service-name"] update_endpoint_slices_cache(handle, endpoint_key, port_to_nodes, endpoint_slice.metadata.name) local cached_endpoints = get_endpoints_from_cache(handle, endpoint_key) @@ -169,19 +175,24 @@ end local function on_endpoint_slices_deleted(handle, endpoint_slice) if not endpoint_slice.metadata then - core.log.error("endpoint_slice has no metadata, endpointSlice: ", core.json.delay_encode(endpoint_slice)) + core.log.error("endpoint_slice has no metadata, endpointSlice: ", + core.json.delay_encode(endpoint_slice)) return end if not endpoint_slice.metadata.name then - core.log.error("endpoint_slice has no metadata.name, endpointSlice: ", core.json.delay_encode(endpoint_slice)) + core.log.error("endpoint_slice has no metadata.name, endpointSlice: ", + core.json.delay_encode(endpoint_slice)) return end if not endpoint_slice.metadata.namespace then - core.log.error("endpoint_slice has no metadata.namespace, endpointSlice: ", core.json.delay_encode(endpoint_slice)) + core.log.error("endpoint_slice has no metadata.namespace, endpointSlice: ", + core.json.delay_encode(endpoint_slice)) return end - if not endpoint_slice.metadata.labels or not endpoint_slice.metadata.labels["kubernetes.io/service-name"] then - core.log.error("endpoint_slice has no service-name, endpointSlice: ", core.json.delay_encode(endpoint_slice)) + if not endpoint_slice.metadata.labels + or not endpoint_slice.metadata.labels["kubernetes.io/service-name"] then + core.log.error("endpoint_slice has no service-name, endpointSlice: ", + core.json.delay_encode(endpoint_slice)) return end @@ -192,7 +203,8 @@ local function on_endpoint_slices_deleted(handle, endpoint_slice) core.log.debug(core.json.delay_encode(endpoint_slice)) - local endpoint_key = endpoint_slice.metadata.namespace .. "/" .. endpoint_slice.metadata.labels["kubernetes.io/service-name"] + local endpoint_key = endpoint_slice.metadata.namespace + .. "/" .. endpoint_slice.metadata.labels["kubernetes.io/service-name"] update_endpoint_slices_cache(handle, endpoint_key, nil, endpoint_slice.metadata.name) local cached_endpoints = get_endpoints_from_cache(handle, endpoint_key) From 09e20a95307ec8b3a450263f7336294d7dc837c2 Mon Sep 17 00:00:00 2001 From: chuanFF Date: Wed, 24 Sep 2025 15:06:09 +0800 Subject: [PATCH 26/29] =?UTF-8?q?=E6=B5=8B=E8=AF=95=E7=94=A8=E4=BE=8B?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- t/kubernetes/discovery/kubernetes4.t | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/t/kubernetes/discovery/kubernetes4.t b/t/kubernetes/discovery/kubernetes4.t index b7f960beaa85..1edba58edda8 100644 --- a/t/kubernetes/discovery/kubernetes4.t +++ b/t/kubernetes/discovery/kubernetes4.t @@ -360,8 +360,10 @@ __DATA__ === TEST 1: endpointSlice1 update --- yaml_config eval: $::yaml_config --- request eval -POST /operators -$::scale_up_ns_a_epslice1 +[ +"POST /operators +$::scale_up_ns_a_epslice1", +] --- more_headers Content-type: application/json --- response_body From 6c26a38e388d0214d9411e3b3e19cac619d74f6d Mon Sep 17 00:00:00 2001 From: chuanFF Date: Wed, 24 Sep 2025 17:20:32 +0800 Subject: [PATCH 27/29] =?UTF-8?q?=E6=B5=8B=E8=AF=95=E7=94=A8=E4=BE=8B?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- t/kubernetes/discovery/kubernetes4.t | 6 ------ 1 file changed, 6 deletions(-) diff --git a/t/kubernetes/discovery/kubernetes4.t b/t/kubernetes/discovery/kubernetes4.t index 1edba58edda8..3214523ac0a3 100644 --- a/t/kubernetes/discovery/kubernetes4.t +++ b/t/kubernetes/discovery/kubernetes4.t @@ -544,9 +544,3 @@ Content-type: application/json "DONE\n", "{ 3 }\n", ] - - - - - - From b869ab1d12afe9ebca3ac83627b0920a64342a0d Mon Sep 17 00:00:00 2001 From: chuanFF Date: Wed, 24 Sep 2025 20:34:19 +0800 Subject: [PATCH 28/29] =?UTF-8?q?=E7=A9=BA=E8=A1=8C=E5=88=A0=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apisix/discovery/kubernetes/init.lua | 1 - 1 file changed, 1 deletion(-) diff --git a/apisix/discovery/kubernetes/init.lua b/apisix/discovery/kubernetes/init.lua index dddc1bc54c61..583f9e180163 100644 --- a/apisix/discovery/kubernetes/init.lua +++ b/apisix/discovery/kubernetes/init.lua @@ -26,7 +26,6 @@ local os = os local error = error local pcall = pcall local setmetatable = setmetatable - local is_http = ngx.config.subsystem == "http" local process = require("ngx.process") local core = require("apisix.core") From ea38bb5bacf51bf4662cf2bcf784001722a752cf Mon Sep 17 00:00:00 2001 From: chuanFF Date: Wed, 24 Sep 2025 20:50:21 +0800 Subject: [PATCH 29/29] prelist --- apisix/discovery/kubernetes/informer_factory.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apisix/discovery/kubernetes/informer_factory.lua b/apisix/discovery/kubernetes/informer_factory.lua index 3420c1aed58f..d31841b1e20d 100644 --- a/apisix/discovery/kubernetes/informer_factory.lua +++ b/apisix/discovery/kubernetes/informer_factory.lua @@ -285,7 +285,7 @@ local function list_watch(informer, apiserver) core.log.info("begin to list ", informer.kind) informer.fetch_state = "listing" - if informer.pre_List then + if informer.pre_list then informer:pre_list() end