diff --git a/apisix/control/v1.lua b/apisix/control/v1.lua index 213ed0ac46b8..4d35018b89de 100644 --- a/apisix/control/v1.lua +++ b/apisix/control/v1.lua @@ -269,6 +269,11 @@ local function iter_add_get_routes_info(values, route_id) if new_route.value.upstream and new_route.value.upstream.parent then new_route.value.upstream.parent = nil end + -- remove healthcheck info + new_route.checker = nil + new_route.checker_idx = nil + new_route.checker_upstream = nil + new_route.clean_handlers = nil core.table.insert(infos, new_route) -- check the route id if route_id and route.value.id == route_id then @@ -352,6 +357,11 @@ local function iter_add_get_services_info(values, svc_id) if new_svc.value.upstream and new_svc.value.upstream.parent then new_svc.value.upstream.parent = nil end + -- remove healthcheck info + new_svc.checker = nil + new_svc.checker_idx = nil + new_svc.checker_upstream = nil + new_svc.clean_handlers = nil core.table.insert(infos, new_svc) -- check the service id if svc_id and svc.value.id == svc_id then diff --git a/t/control/control-healthcheck-bug-fix.t b/t/control/control-healthcheck-bug-fix.t new file mode 100644 index 000000000000..ee2e516dbea5 --- /dev/null +++ b/t/control/control-healthcheck-bug-fix.t @@ -0,0 +1,134 @@ +# +# 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. +# +use t::APISIX 'no_plan'; + +repeat_each(1); +log_level('info'); +worker_connections(256); +no_root_location(); +no_shuffle(); + +run_tests(); + +__DATA__ + +=== TEST 1: setup route +--- config + location /t { + content_by_lua_block { + local t = require("lib.test_admin").test + local code, body = t('/apisix/admin/routes/1', + ngx.HTTP_PUT, + [[{ + "methods": ["GET"], + "upstream": { + "nodes": { + "httpbin.org:80": 1, + "mockbin.org:80": 1 + }, + "type": "roundrobin" + }, + "uri": "/*" + }]] + ) + + if code >= 300 then + ngx.status = code + end + ngx.say(body) + } + } +--- request +GET /t +--- response_body +passed + + + +=== TEST 2: hit the route +--- request +GET /status/403 +--- error_code: 403 + + + +=== TEST 3: hit control api +--- config + location /t { + content_by_lua_block { + local json = require("toolkit.json") + local t = require("lib.test_admin") + + local passed = true + + for i = 1, 40 do + local code, body, res = t.test('/v1/routes/1', ngx.HTTP_GET) + if code ~= ngx.HTTP_OK then + passed = code + break + end + end + + if passed then + ngx.say("passed") + else + ngx.say("failed. got status code: ", passed) + end + } + } +--- request +GET /t +--- response_body +passed + + + +=== TEST 4: hit the route again +--- request +GET /status/403 +--- error_code: 403 + + + +=== TEST 5: hit control api +--- config + location /t { + content_by_lua_block { + local json = require("toolkit.json") + local t = require("lib.test_admin") + + local passed = true + + for i = 1, 40 do + local code, body, res = t.test('/v1/routes/1', ngx.HTTP_GET) + if code ~= ngx.HTTP_OK then + passed = code + break + end + end + + if passed then + ngx.say("passed") + else + ngx.say("failed. got status code: ", passed) + end + } + } +--- request +GET /t +--- response_body +passed