@@ -253,16 +253,18 @@ func (c *SIGCache) _attachedGateways(gwc *gatewayv1beta1.GatewayClass) []*gatewa
253253 return gws
254254}
255255
256- func (c * SIGCache ) GatewayRefsOf (hr * gatewayv1beta1.HTTPRoute ) []* gatewayv1beta1.Gateway {
256+ func (c * SIGCache ) GatewayRefsOfHR (hr * gatewayv1beta1.HTTPRoute ) []* gatewayv1beta1.Gateway {
257257 defer utils .TimeItToPrometheus ()()
258258
259259 c .mutex .RLock ()
260260 defer c .mutex .RUnlock ()
261261
262- return c ._gatewayRefsOf (hr )
262+ return c ._gatewayRefsOfHR (hr )
263263}
264264
265- func (c * SIGCache ) _gatewayRefsOf (hr * gatewayv1beta1.HTTPRoute ) []* gatewayv1beta1.Gateway {
265+ func (c * SIGCache ) _gatewayRefsOfHR (hr * gatewayv1beta1.HTTPRoute ) []* gatewayv1beta1.Gateway {
266+ defer utils .TimeItToPrometheus ()()
267+
266268 if hr == nil {
267269 return []* gatewayv1beta1.Gateway {}
268270 }
@@ -290,6 +292,87 @@ func (c *SIGCache) _gatewayRefsOf(hr *gatewayv1beta1.HTTPRoute) []*gatewayv1beta
290292 return gws
291293}
292294
295+ func (c * SIGCache ) GatewayRefsOfSecret (scrt * v1.Secret ) []* gatewayv1beta1.Gateway {
296+ defer utils .TimeItToPrometheus ()()
297+
298+ c .mutex .RLock ()
299+ defer c .mutex .RUnlock ()
300+
301+ if scrt == nil {
302+ return []* gatewayv1beta1.Gateway {}
303+ }
304+ gws := []* gatewayv1beta1.Gateway {}
305+
306+ for _ , gw := range c .Gateway {
307+ for _ , listener := range gw .Spec .Listeners {
308+ found := false
309+ if listener .Protocol == gatewayv1beta1 .HTTPSProtocolType && listener .TLS != nil &&
310+ (listener .TLS .Mode == nil || * listener .TLS .Mode == gatewayv1beta1 .TLSModeTerminate ) {
311+ for _ , ref := range listener .TLS .CertificateRefs {
312+ ns := gw .Namespace
313+ if ref .Namespace != nil {
314+ ns = string (* ref .Namespace )
315+ }
316+ if ! c ._canRefer (gw , scrt ) {
317+ continue
318+ }
319+ if err := validateSecretType (ref .Group , ref .Kind ); err == nil {
320+ if ns == scrt .Namespace && ref .Name == gatewayv1beta1 .ObjectName (scrt .Name ) {
321+ gws = append (gws , gw )
322+ found = true
323+ break
324+ }
325+ }
326+ }
327+ }
328+ if found {
329+ break
330+ }
331+ }
332+ }
333+
334+ return gws
335+ }
336+
337+ func (c * SIGCache ) AttachedSecrets (gw * gatewayv1beta1.Gateway ) (map [string ][]* v1.Secret , error ) {
338+ defer utils .TimeItToPrometheus ()()
339+
340+ c .mutex .RLock ()
341+ defer c .mutex .RUnlock ()
342+
343+ rlt := map [string ][]* v1.Secret {}
344+ if gw == nil {
345+ return rlt , nil
346+ }
347+
348+ for _ , listener := range gw .Spec .Listeners {
349+ lsname := gwListenerName (gw , & listener )
350+ if _ , ok := rlt [lsname ]; ! ok {
351+ rlt [lsname ] = []* v1.Secret {}
352+ }
353+ if listener .Protocol == gatewayv1beta1 .HTTPSProtocolType && listener .TLS != nil &&
354+ (listener .TLS .Mode == nil || * listener .TLS .Mode == gatewayv1beta1 .TLSModeTerminate ) {
355+ for _ , ref := range listener .TLS .CertificateRefs {
356+ ns := gw .Namespace
357+ if ref .Namespace != nil {
358+ ns = string (* ref .Namespace )
359+ }
360+ n := utils .Keyname (ns , string (ref .Name ))
361+ scrt := c .Secret [n ]
362+ if scrt != nil && c ._canRefer (gw , scrt ) {
363+ if err := validateSecretType (ref .Group , ref .Kind ); err != nil {
364+ return rlt , err
365+ }
366+ rlt [lsname ] = append (rlt [lsname ], scrt )
367+ } else {
368+ return rlt , fmt .Errorf ("secret %s not exist or cannnot refer to" , n )
369+ }
370+ }
371+ }
372+ }
373+ return rlt , nil
374+ }
375+
293376func (c * SIGCache ) AttachedHTTPRoutes (gw * gatewayv1beta1.Gateway ) []* gatewayv1beta1.HTTPRoute {
294377 defer utils .TimeItToPrometheus ()()
295378
@@ -481,7 +564,7 @@ func (c *SIGCache) GetNeighborGateways(gw *gatewayv1beta1.Gateway) []*gatewayv1b
481564 gwmap := map [string ]* gatewayv1beta1.Gateway {}
482565 hrs := c ._attachedHTTPRoutes (gw )
483566 for _ , hr := range hrs {
484- gws := c ._gatewayRefsOf (hr )
567+ gws := c ._gatewayRefsOfHR (hr )
485568 for _ , ng := range gws {
486569 kn := utils .Keyname (ng .Namespace , ng .Name )
487570 if _ , f := gwmap [kn ]; ! f {
@@ -510,7 +593,7 @@ func (c *SIGCache) GetRootGateways(svcs []*v1.Service) []*gatewayv1beta1.Gateway
510593 for _ , svc := range svcs {
511594 hrs := c ._HTTPRoutesRefsOf (svc )
512595 for _ , hr := range hrs {
513- gws := c ._gatewayRefsOf (hr )
596+ gws := c ._gatewayRefsOfHR (hr )
514597 for _ , gw := range gws {
515598 gwmap [utils .Keyname (gw .Namespace , gw .Name )] = gw
516599 }
@@ -532,7 +615,7 @@ func (c *SIGCache) RGImpactedGatewayClasses(rg *gatewayv1beta1.ReferenceGrant) [
532615 hrs := c ._rgImpactedHTTPRoutes (rg )
533616 gws := c ._rgImpactedGateways (rg )
534617 for _ , hr := range hrs {
535- gws = append (gws , c ._gatewayRefsOf (hr )... )
618+ gws = append (gws , c ._gatewayRefsOfHR (hr )... )
536619 }
537620 gws = UnifiedGateways (gws )
538621 return ClassNamesOfGateways (gws )
0 commit comments