This is an automated email from the ASF dual-hosted git repository.

baoyuan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/apisix.git


The following commit(s) were added to refs/heads/master by this push:
     new 9e5163c60 fix: kubernetes service discovery signle mode data dump 
(#12284)
9e5163c60 is described below

commit 9e5163c60b74589672b10201355b855098166f4a
Author: Baoyuan <[email protected]>
AuthorDate: Fri Jun 20 14:11:55 2025 +0800

    fix: kubernetes service discovery signle mode data dump (#12284)
---
 apisix/discovery/kubernetes/init.lua | 71 ++++++++++++++++++++++--------------
 t/kubernetes/discovery/kubernetes3.t | 26 +++++++++++++
 2 files changed, 70 insertions(+), 27 deletions(-)

diff --git a/apisix/discovery/kubernetes/init.lua 
b/apisix/discovery/kubernetes/init.lua
index 941f828ba..d4f718de5 100644
--- a/apisix/discovery/kubernetes/init.lua
+++ b/apisix/discovery/kubernetes/init.lua
@@ -633,44 +633,61 @@ function _M.init_worker()
 end
 
 
-function _M.dump_data()
+local function dump_endpoints_from_dict(endpoint_dict)
+    local keys, err = endpoint_dict:get_keys()
+    if err then
+        core.log.error("get keys from discovery dict failed: ", err)
+        return
+    end
 
-    local eps = {}
-    for _, conf in ipairs(local_conf.discovery.kubernetes) do
+    if not keys or #keys == 0 then
+        return
+    end
 
-        local id = conf.id
-        local endpoint_dict = get_endpoint_dict(id)
-        local keys, err = endpoint_dict:get_keys()
-        if err then
-            error(err)
-            break
+    local endpoints = {}
+    for i = 1, #keys do
+        local key = keys[i]
+        -- skip key with suffix #version
+        if key:sub(-#"#version") ~= "#version" then
+            local value = endpoint_dict:get(key)
+            core.table.insert(endpoints, {
+                name = key,
+                value = value
+            })
         end
+    end
 
-        if keys then
-            local k8s = {}
-            for i = 1, #keys do
-
-                local key = keys[i]
-                --skip key with suffix #version
-                if key:sub(-#"#version") ~= "#version" then
-                    local value = endpoint_dict:get(key)
+    return endpoints
+end
 
-                    core.table.insert(k8s, {
-                        name = key,
-                        value = value
-                    })
-                end
-            end
+function _M.dump_data()
+    local discovery_conf = local_conf.discovery.kubernetes
+    local eps = {}
 
+    if #discovery_conf == 0 then
+        -- Single mode: discovery_conf is a single configuration object
+        local endpoint_dict = get_endpoint_dict()
+        local endpoints = dump_endpoints_from_dict(endpoint_dict)
+        if endpoints then
             core.table.insert(eps, {
-                id = conf.id,
-                endpoints = k8s
+                endpoints = endpoints
             })
-
+        end
+    else
+        -- Multiple mode: discovery_conf is an array of configuration objects
+        for _, conf in ipairs(discovery_conf) do
+            local endpoint_dict = get_endpoint_dict(conf.id)
+            local endpoints = dump_endpoints_from_dict(endpoint_dict)
+            if endpoints then
+                core.table.insert(eps, {
+                    id = conf.id,
+                    endpoints = endpoints
+                })
+            end
         end
     end
 
-    return {config = local_conf.discovery.kubernetes, endpoints = eps}
+    return {config = discovery_conf, endpoints = eps}
 end
 
 
diff --git a/t/kubernetes/discovery/kubernetes3.t 
b/t/kubernetes/discovery/kubernetes3.t
index e2242e9a8..37a06b00f 100644
--- a/t/kubernetes/discovery/kubernetes3.t
+++ b/t/kubernetes/discovery/kubernetes3.t
@@ -44,6 +44,23 @@ discovery:
         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_;
@@ -427,3 +444,12 @@ qr{ 0 0 2 2 0 0 0 0 2 2 0 0 }
 GET /dump
 --- response_body_like
 .*"name":"default/kubernetes".*
+
+
+
+=== TEST 5: test single mode dump
+--- yaml_config eval: $::single_yaml_config
+--- request
+GET /dump
+--- response_body_like
+.*"name":"default/kubernetes".*

Reply via email to