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"}