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

monkeydluffy 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 99debadec refactor: move global_rules to separate file (#9784)
99debadec is described below

commit 99debadecc4b20ff1631c7d3da1d285320cbc5eb
Author: Fucheng Jiang <[email protected]>
AuthorDate: Thu Jul 13 11:48:46 2023 +0800

    refactor: move global_rules to separate file (#9784)
---
 apisix/admin/upstreams.lua             | 21 +++----------
 apisix/global_rules.lua                | 56 ++++++++++++++++++++++++++++++++++
 apisix/init.lua                        |  9 ++++--
 apisix/plugin.lua                      |  5 ++-
 apisix/plugins/ai.lua                  |  5 +--
 apisix/plugins/prometheus/exporter.lua | 11 ++++---
 apisix/router.lua                      | 13 --------
 t/admin/upstream5.t                    |  2 +-
 8 files changed, 81 insertions(+), 41 deletions(-)

diff --git a/apisix/admin/upstreams.lua b/apisix/admin/upstreams.lua
index 687e09cd4..6c04d9379 100644
--- a/apisix/admin/upstreams.lua
+++ b/apisix/admin/upstreams.lua
@@ -16,12 +16,12 @@
 --
 local core = require("apisix.core")
 local config_util = require("apisix.core.config_util")
-local router = require("apisix.router")
 local get_routes = require("apisix.router").http_routes
 local get_services = require("apisix.http.service").services
 local get_plugin_configs = require("apisix.plugin_config").plugin_configs
 local get_consumers = require("apisix.consumer").consumers
 local get_consumer_groups = require("apisix.consumer_group").consumer_groups
+local get_global_rules = require("apisix.global_rules").global_rules
 local apisix_upstream = require("apisix.upstream")
 local resource = require("apisix.admin.resource")
 local tostring = tostring
@@ -115,21 +115,10 @@ local function delete_checker(id)
         return 400, err_msg
     end
 
-    -- TODO: Refactor router.global_rules and then refactor the following code
-    local global_rules = router.global_rules
-    if global_rules and global_rules.values
-        and #global_rules.values > 0 then
-
-        for _, global_rule in config_util.iterate_values(global_rules.values) 
do
-            if global_rule and global_rule.value
-                and global_rule.value.plugins
-                and up_id_in_plugins(global_rule.value.plugins, id) then
-                 return 400, {error_msg = "can not delete this upstream,"
-                                          .. " plugin in global_rule ["
-                                          .. global_rule.value.id
-                                          .. "] is still using it now"}
-            end
-        end
+    local global_rules = get_global_rules()
+    err_msg = check_resources_reference(global_rules, id, true, "global_rules")
+    if err_msg then
+        return 400, err_msg
     end
 
     return nil, nil
diff --git a/apisix/global_rules.lua b/apisix/global_rules.lua
new file mode 100644
index 000000000..93fa2890d
--- /dev/null
+++ b/apisix/global_rules.lua
@@ -0,0 +1,56 @@
+--
+-- 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.
+--
+
+local core    = require("apisix.core")
+local plugin_checker = require("apisix.plugin").plugin_checker
+local error = error
+
+
+local _M = {}
+
+local global_rules
+
+function _M.init_worker()
+    local err
+    global_rules, err = core.config.new("/global_rules", {
+        automatic = true,
+        item_schema = core.schema.global_rule,
+        checker = plugin_checker,
+    })
+    if not global_rules then
+        error("failed to create etcd instance for fetching /global_rules : "
+            .. err)
+    end
+end
+
+
+function _M.global_rules()
+    if not global_rules then
+        return nil, nil
+    end
+    return global_rules.values, global_rules.conf_version
+end
+
+
+function _M.get_pre_index()
+    if not global_rules then
+        return nil
+    end
+    return global_rules.prev_index
+end
+
+return _M
diff --git a/apisix/init.lua b/apisix/init.lua
index bff68dd5b..555293490 100644
--- a/apisix/init.lua
+++ b/apisix/init.lua
@@ -40,6 +40,7 @@ local apisix_upstream = require("apisix.upstream")
 local apisix_secret   = require("apisix.secret")
 local set_upstream    = apisix_upstream.set_by_route
 local apisix_ssl      = require("apisix.ssl")
+local apisix_global_rules    = require("apisix.global_rules")
 local upstream_util   = require("apisix.utils.upstream")
 local xrpc            = require("apisix.stream.xrpc")
 local ctxdump         = require("resty.ctxdump")
@@ -155,6 +156,8 @@ function _M.http_init_worker()
     consumer_group.init_worker()
     apisix_secret.init_worker()
 
+    apisix_global_rules.init_worker()
+
     apisix_upstream.init_worker()
     require("apisix.plugins.ext-plugin.init").init_worker()
 
@@ -597,7 +600,8 @@ function _M.http_access_phase()
     local route = api_ctx.matched_route
     if not route then
         -- run global rule when there is no matching route
-        plugin.run_global_rules(api_ctx, router.global_rules, nil)
+        local global_rules = apisix_global_rules.global_rules()
+        plugin.run_global_rules(api_ctx, global_rules, nil)
 
         core.log.info("not find any matched route")
         return core.response.exit(404,
@@ -649,7 +653,8 @@ function _M.http_access_phase()
     api_ctx.route_name = route.value.name
 
     -- run global rule
-    plugin.run_global_rules(api_ctx, router.global_rules, nil)
+    local global_rules = apisix_global_rules.global_rules()
+    plugin.run_global_rules(api_ctx, global_rules, nil)
 
     if route.value.script then
         script.load(route, api_ctx)
diff --git a/apisix/plugin.lua b/apisix/plugin.lua
index e5e04dc39..6468d8df7 100644
--- a/apisix/plugin.lua
+++ b/apisix/plugin.lua
@@ -1141,8 +1141,7 @@ end
 
 
 function _M.run_global_rules(api_ctx, global_rules, phase_name)
-    if global_rules and global_rules.values
-       and #global_rules.values > 0 then
+    if global_rules and #global_rules > 0 then
         local orig_conf_type = api_ctx.conf_type
         local orig_conf_version = api_ctx.conf_version
         local orig_conf_id = api_ctx.conf_id
@@ -1152,7 +1151,7 @@ function _M.run_global_rules(api_ctx, global_rules, 
phase_name)
         end
 
         local plugins = core.tablepool.fetch("plugins", 32, 0)
-        local values = global_rules.values
+        local values = global_rules
         local route = api_ctx.matched_route
         for _, global_rule in config_util.iterate_values(values) do
             api_ctx.conf_type = "global_rule"
diff --git a/apisix/plugins/ai.lua b/apisix/plugins/ai.lua
index b46249a9a..39430c7ad 100644
--- a/apisix/plugins/ai.lua
+++ b/apisix/plugins/ai.lua
@@ -18,6 +18,7 @@ local require         = require
 local apisix          = require("apisix")
 local core            = require("apisix.core")
 local router          = require("apisix.router")
+local get_global_rules = require("apisix.global_rules").global_rules
 local event           = require("apisix.core.event")
 local balancer        = require("ngx.balancer")
 local ngx             = ngx
@@ -229,8 +230,8 @@ local function routes_analyze(routes)
         end
     end
 
-    local global_rules_flag = router.global_rules and 
router.global_rules.values
-                              and #router.global_rules.values ~= 0
+    local global_rules, _ = get_global_rules()
+    local global_rules_flag = global_rules and #global_rules ~= 0
 
     if route_flags["vars"] or route_flags["filter_func"]
          or route_flags["remote_addr"]
diff --git a/apisix/plugins/prometheus/exporter.lua 
b/apisix/plugins/prometheus/exporter.lua
index 8e9032640..623a9eddf 100644
--- a/apisix/plugins/prometheus/exporter.lua
+++ b/apisix/plugins/prometheus/exporter.lua
@@ -34,6 +34,8 @@ local get_ssls   = router.ssls
 local get_services = require("apisix.http.service").services
 local get_consumers = require("apisix.consumer").consumers
 local get_upstreams = require("apisix.upstream").upstreams
+local get_global_rules = require("apisix.global_rules").global_rules
+local get_global_rules_prev_index = 
require("apisix.global_rules").get_pre_index
 local clear_tab = core.table.clear
 local get_stream_routes = router.stream_routes
 local get_protos = require("apisix.plugins.grpc-transcode.proto").protos
@@ -377,14 +379,15 @@ local function etcd_modify_index()
     global_max_idx = set_modify_index("consumers", consumers, consumers_ver, 
global_max_idx)
 
     -- global_rules
-    local global_rules = router.global_rules
+    local global_rules, global_rules_ver = get_global_rules()
     if global_rules then
-        global_max_idx = set_modify_index("global_rules", global_rules.values,
-            global_rules.conf_version, global_max_idx)
+        global_max_idx = set_modify_index("global_rules", global_rules,
+            global_rules_ver, global_max_idx)
 
         -- prev_index
         key_values[1] = "prev_index"
-        metrics.etcd_modify_indexes:set(global_rules.prev_index, key_values)
+        local prev_index = get_global_rules_prev_index()
+        metrics.etcd_modify_indexes:set(prev_index, key_values)
 
     else
         global_max_idx = set_modify_index("global_rules", nil, nil, 
global_max_idx)
diff --git a/apisix/router.lua b/apisix/router.lua
index 2fd14917c..7e7d50d4a 100644
--- a/apisix/router.lua
+++ b/apisix/router.lua
@@ -18,9 +18,7 @@ local require = require
 local http_route = require("apisix.http.route")
 local apisix_upstream = require("apisix.upstream")
 local core    = require("apisix.core")
-local plugin_checker = require("apisix.plugin").plugin_checker
 local str_lower = string.lower
-local error   = error
 local ipairs  = ipairs
 
 
@@ -91,17 +89,6 @@ function _M.http_init_worker()
     _M.router_ssl = router_ssl
 
     _M.api = require("apisix.api_router")
-
-    local global_rules, err = core.config.new("/global_rules", {
-            automatic = true,
-            item_schema = core.schema.global_rule,
-            checker = plugin_checker,
-        })
-    if not global_rules then
-        error("failed to create etcd instance for fetching /global_rules : "
-              .. err)
-    end
-    _M.global_rules = global_rules
 end
 
 
diff --git a/t/admin/upstream5.t b/t/admin/upstream5.t
index f589a415d..572d29257 100644
--- a/t/admin/upstream5.t
+++ b/t/admin/upstream5.t
@@ -339,7 +339,7 @@ passed
     }
 --- error_code: 400
 --- response_body
-{"error_msg":"can not delete this upstream, plugin in global_rule [1] is still 
using it now"}
+{"error_msg":"can not delete this upstream, plugin in global_rules [1] is 
still using it now"}
 
 
 

Reply via email to