@@ -51,7 +51,7 @@ local function check_secret(conf)
5151end
5252
5353
54- local function secret_kv (manager , confid )
54+ local function secret_kv (manager , confid )
5555 local secret_values
5656 secret_values = core .config .fetch_created_obj (" /secrets" )
5757 if not secret_values or not secret_values .values then
@@ -136,7 +136,7 @@ local function parse_secret_uri(secret_uri)
136136end
137137
138138
139- local function fetch_by_uri (secret_uri )
139+ local function fetch_by_uri_secret (secret_uri )
140140 core .log .info (" fetching data from secret uri: " , secret_uri )
141141 local opts , err = parse_secret_uri (secret_uri )
142142 if not opts then
@@ -162,81 +162,93 @@ local function fetch_by_uri(secret_uri)
162162end
163163
164164-- for test
165- _M .fetch_by_uri = fetch_by_uri
166-
167-
168- local function fetch (uri )
169- -- do a quick filter to improve retrieval speed
170- if byte (uri , 1 , 1 ) ~= byte (' $' ) then
171- return nil
172- end
173-
174- local val , err
175- if string .has_prefix (upper (uri ), core .env .PREFIX ) then
176- val , err = core .env .fetch_by_uri (uri )
177- elseif string .has_prefix (uri , PREFIX ) then
178- val , err = fetch_by_uri (uri )
179- end
180-
181- if err then
182- core .log .error (" failed to fetch secret value: " , err )
183- return
184- end
185-
186- return val
187- end
165+ _M .fetch_by_uri = fetch_by_uri_secret
188166
189167
190168local function new_lrucache ()
191169 local ttl = core .table .try_read_attr (local_conf , " apisix" , " lru" , " secret" , " ttl" )
192170 if not ttl then
193171 ttl = 300
194172 end
173+
195174 local count = core .table .try_read_attr (local_conf , " apisix" , " lru" , " secret" , " count" )
196175 if not count then
197176 count = 512
198177 end
199- core .log .info (" secret lrucache ttl: " , ttl , " , count: " , count )
178+
179+ local neg_ttl = core .table .try_read_attr (local_conf , " apisix" , " lru" , " secret" , " neg_ttl" )
180+ if not neg_ttl then
181+ neg_ttl = 60 -- 1 minute default for failures
182+ end
183+
184+ local neg_count = core .table .try_read_attr (local_conf , " apisix" , " lru" , " secret" , " neg_count" )
185+ if not neg_count then
186+ neg_count = 512
187+ end
188+
189+ core .log .info (" secret lrucache ttl: " , ttl , " , count: " , count ,
190+ " , neg_ttl: " , neg_ttl , " , neg_count: " , neg_count )
191+
200192 return core .lrucache .new ({
201- ttl = ttl , count = count , invalid_stale = true , refresh_stale = true
193+ ttl = ttl ,
194+ count = count ,
195+ neg_ttl = neg_ttl ,
196+ neg_count = neg_count ,
197+ invalid_stale = true ,
198+ refresh_stale = true
202199 })
203200end
204- local secrets_lrucache = new_lrucache ()
205-
206-
207- local fetch_secrets
208- do
209- local retrieve_refs
210- function retrieve_refs (refs )
211- for k , v in pairs (refs ) do
212- local typ = type (v )
213- if typ == " string" then
214- refs [k ] = fetch (v ) or v
215- elseif typ == " table" then
216- retrieve_refs (v )
217- end
218- end
219- return refs
220- end
221201
222- local function retrieve (refs )
223- core .log .info (" retrieve secrets refs" )
202+ local secrets_cache = new_lrucache ()
224203
225- local new_refs = core .table .deepcopy (refs )
226- return retrieve_refs (new_refs )
204+
205+
206+ local function fetch (uri , use_cache )
207+ -- do a quick filter to improve retrieval speed
208+ if byte (uri , 1 , 1 ) ~= byte (' $' ) then
209+ return nil
227210 end
228211
229- function fetch_secrets (refs , cache , key , version )
230- if not refs or type (refs ) ~= " table" then
212+ local fetch_by_uri
213+ if string .has_prefix (upper (uri ), core .env .PREFIX ) then
214+ fetch_by_uri = core .env .fetch_by_uri
215+ elseif string .has_prefix (uri , PREFIX ) then
216+ fetch_by_uri = fetch_by_uri_secret
217+ else
218+ return nil
219+ end
220+
221+ if not use_cache then
222+ local val , err = fetch_by_uri (uri )
223+ if err then
224+ core .log .error (" failed to fetch secret value: " , err )
231225 return nil
232226 end
233- if not cache then
234- return retrieve (refs )
227+ return val
228+ end
229+
230+ return secrets_cache (uri , " " , fetch_by_uri , uri )
231+ end
232+
233+ local function retrieve_refs (refs , use_cache )
234+ for k , v in pairs (refs ) do
235+ local typ = type (v )
236+ if typ == " string" then
237+ refs [k ] = fetch (v , use_cache ) or v
238+ elseif typ == " table" then
239+ retrieve_refs (v , use_cache )
235240 end
236- return secrets_lrucache (key , version , retrieve , refs )
237241 end
242+ return refs
238243end
239244
240- _M .fetch_secrets = fetch_secrets
245+ function _M .fetch_secrets (refs , use_cache )
246+ if not refs or type (refs ) ~= " table" then
247+ return nil
248+ end
249+
250+ local new_refs = core .table .deepcopy (refs )
251+ return retrieve_refs (new_refs , use_cache )
252+ end
241253
242254return _M
0 commit comments