diff --git a/apisix/cli/file.lua b/apisix/cli/file.lua index 5d066e0dadcd..66600b54b41b 100644 --- a/apisix/cli/file.lua +++ b/apisix/cli/file.lua @@ -112,6 +112,9 @@ local function resolve_conf_var(conf) end +_M.resolve_conf_var = resolve_conf_var + + local function tinyyaml_type(t) local mt = getmetatable(t) if mt then @@ -234,6 +237,20 @@ function _M.read_yaml_conf(apisix_home) end end + if default_conf.apisix.config_center == "yaml" then + local apisix_conf_path = profile:yaml_path("apisix") + local apisix_conf_yaml, _ = util.read_file(apisix_conf_path) + if apisix_conf_yaml then + local apisix_conf = yaml.parse(apisix_conf_yaml) + if apisix_conf then + local ok, err = resolve_conf_var(apisix_conf) + if not ok then + return nil, err + end + end + end + end + return default_conf end diff --git a/apisix/core/config_yaml.lua b/apisix/core/config_yaml.lua index 0a57828d61b8..89753f0f1e0e 100644 --- a/apisix/core/config_yaml.lua +++ b/apisix/core/config_yaml.lua @@ -27,6 +27,7 @@ local new_tab = require("table.new") local check_schema = require("apisix.core.schema").check local profile = require("apisix.core.profile") local lfs = require("lfs") +local file = require("apisix.cli.file") local exiting = ngx.worker.exiting local insert_tab = table.insert local type = type @@ -105,6 +106,12 @@ local function read_apisix_yaml(premature, pre_mtime) return end + local ok, err = file.resolve_conf_var(apisix_yaml_new) + if not ok then + log.error("failed: failed to resolve variables:" .. err) + return + end + apisix_yaml = apisix_yaml_new apisix_yaml_ctime = last_change_time end diff --git a/t/cli/test_standalone.sh b/t/cli/test_standalone.sh new file mode 100755 index 000000000000..b4e6f3955420 --- /dev/null +++ b/t/cli/test_standalone.sh @@ -0,0 +1,67 @@ +#!/usr/bin/env bash + +# +# 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. +# + +. ./t/cli/common.sh + +standalone() { + clean_up + git checkout conf/apisix.yaml +} + +trap standalone EXIT + +# support environment variables +echo ' +apisix: + enable_admin: false + config_center: yaml +' > conf/config.yaml + +echo ' +routes: + - + uri: ${{var_test_path}} + plugins: + proxy-rewrite: + uri: ${{var_test_proxy_rewrite_uri:=/apisix/nginx_status}} + upstream: + nodes: + "127.0.0.1:9091": 1 + type: roundrobin +#END +' > conf/apisix.yaml + +# check for resolve variables +var_test_path=/test make init + +if ! grep "env var_test_path=/test;" conf/nginx.conf > /dev/null; then + echo "failed: failed to resolve variables" + exit 1 +fi + +# variable is valid +var_test_path=/test make run +sleep 0.1 +code=$(curl -o /dev/null -s -m 5 -w %{http_code} http://127.0.0.1:9080/test) +if [ ! $code -eq 200 ]; then + echo "failed: resolve variables in apisix.yaml conf failed" + exit 1 +fi + +echo "passed: resolve variables in apisix.yaml conf success"