Skip to content

Commit b4bbffb

Browse files
committed
Update AllowedRoutes compatibility with .Kinds support.
1 parent 3541a1a commit b4bbffb

File tree

3 files changed

+94
-29
lines changed

3 files changed

+94
-29
lines changed

pkg/cache.go

Lines changed: 30 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,13 @@ func (c *SIGCache) UnsetNamespace(keyname string) {
5151
delete(c.Namespace, keyname)
5252
}
5353

54+
func (c *SIGCache) GetNamespace(keyname string) *v1.Namespace {
55+
c.mutex.Lock()
56+
defer c.mutex.Unlock()
57+
58+
return c.Namespace[keyname]
59+
}
60+
5461
func (c *SIGCache) SetGatewayClass(obj *gatewayv1beta1.GatewayClass) {
5562
c.mutex.Lock()
5663
defer c.mutex.Unlock()
@@ -208,7 +215,17 @@ func (c *SIGCache) _gatewayRefsOf(hr *gatewayv1beta1.HTTPRoute) []*gatewayv1beta
208215
}
209216
name := utils.Keyname(utils.Keyname(ns, string(pr.Name)))
210217
if gw, ok := c.Gateway[name]; ok {
211-
gws = append(gws, gw)
218+
for _, listener := range gw.Spec.Listeners {
219+
if listener.Name != *pr.SectionName {
220+
continue
221+
}
222+
routetype := reflect.TypeOf(*hr).Name()
223+
if routeMatches(gw.Namespace, &listener, ActiveSIGs.Namespace[hr.Namespace], routetype) {
224+
gws = append(gws, gw)
225+
break
226+
}
227+
}
228+
212229
}
213230
}
214231
return gws
@@ -228,13 +245,13 @@ func (c *SIGCache) _attachedHTTPRoutes(gw *gatewayv1beta1.Gateway) []*gatewayv1b
228245
return []*gatewayv1beta1.HTTPRoute{}
229246
}
230247

231-
allowedRoutes := map[string]*gatewayv1beta1.AllowedRoutes{}
232-
for _, listener := range gw.Spec.Listeners {
233-
vsname := gwListenerName(gw, &listener)
234-
235-
if listener.AllowedRoutes != nil {
236-
allowedRoutes[vsname] = listener.AllowedRoutes
237-
}
248+
listeners := map[string]*gatewayv1beta1.Listener{}
249+
// &listener, the local variable, will point to the latest listener
250+
// it can be used but cannot be taken way.
251+
// for _, listener := range gw.Spec.Listeners { wrong!
252+
for i := range gw.Spec.Listeners {
253+
vsname := gwListenerName(gw, &gw.Spec.Listeners[i])
254+
listeners[vsname] = &gw.Spec.Listeners[i]
238255
}
239256

240257
hrs := []*gatewayv1beta1.HTTPRoute{}
@@ -246,13 +263,11 @@ func (c *SIGCache) _attachedHTTPRoutes(gw *gatewayv1beta1.Gateway) []*gatewayv1b
246263
}
247264
if utils.Keyname(ns, string(pr.Name)) == utils.Keyname(gw.Namespace, gw.Name) {
248265
vsname := hrParentName(hr, &pr)
249-
if allowed, ok := allowedRoutes[vsname]; ok {
250-
if routeNs, ok := ActiveSIGs.Namespace[hr.Namespace]; ok {
251-
matched := namespaceMatches(gw.Namespace, allowed.Namespaces, routeNs)
252-
if matched {
253-
hrs = append(hrs, hr)
254-
}
255-
}
266+
routeNamespace := ActiveSIGs.Namespace[hr.Namespace]
267+
routetype := reflect.TypeOf(*hr).Name()
268+
if routeMatches(gw.Namespace, listeners[vsname], routeNamespace, routetype) {
269+
hrs = append(hrs, hr)
270+
break
256271
}
257272
}
258273
}

pkg/parser.go

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package pkg
22

33
import (
44
"fmt"
5+
"reflect"
56
"strings"
67

78
"gitee.com/zongzw/bigip-kubernetes-gateway/k8s"
@@ -103,9 +104,6 @@ func parseHTTPRoute(className string, hr *gatewayv1beta1.HTTPRoute) (map[string]
103104
}
104105

105106
rlt := map[string]interface{}{}
106-
// if err := parsePoolsFrom(hr, rlt); err != nil {
107-
// return map[string]interface{}{}, err
108-
// }
109107

110108
if err := parseiRulesFrom(className, hr, rlt); err != nil {
111109
return map[string]interface{}{}, err
@@ -123,10 +121,12 @@ func parseGateway(gw *gatewayv1beta1.Gateway) (map[string]interface{}, error) {
123121

124122
rlt := map[string]interface{}{}
125123
irules := map[string][]string{}
124+
listeners := map[string]*gatewayv1beta1.Listener{}
126125

127-
for _, listener := range gw.Spec.Listeners {
126+
for i, listener := range gw.Spec.Listeners {
127+
vsname := gwListenerName(gw, &listener)
128+
listeners[vsname] = &gw.Spec.Listeners[i]
128129
if listener.Hostname != nil {
129-
vsname := gwListenerName(gw, &listener)
130130
if _, ok := irules[vsname]; !ok {
131131
irules[vsname] = []string{}
132132
}
@@ -148,15 +148,21 @@ func parseGateway(gw *gatewayv1beta1.Gateway) (map[string]interface{}, error) {
148148
hrs := ActiveSIGs.AttachedHTTPRoutes(gw)
149149
for _, hr := range hrs {
150150
for _, pr := range hr.Spec.ParentRefs {
151-
151+
ns := hr.Namespace
152+
if pr.Namespace != nil {
153+
ns = string(*pr.Namespace)
154+
}
152155
if pr.SectionName == nil {
153156
return map[string]interface{}{}, fmt.Errorf("sectionName of paraentRefs is nil, not supported")
154157
}
155158
vsname := hrParentName(hr, &pr)
156159
if _, ok := irules[vsname]; !ok {
157160
irules[vsname] = []string{}
158161
}
159-
irules[vsname] = append(irules[vsname], hrName(hr))
162+
routetype := reflect.TypeOf(*hr).Name()
163+
if routeMatches(ns, listeners[vsname], ActiveSIGs.GetNamespace(hr.Namespace), routetype) {
164+
irules[vsname] = append(irules[vsname], hrName(hr))
165+
}
160166
}
161167
}
162168
for _, addr := range gw.Spec.Addresses {

pkg/utils.go

Lines changed: 51 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package pkg
22

33
import (
4+
"reflect"
45
"strings"
56

67
v1 "k8s.io/api/core/v1"
@@ -18,30 +19,73 @@ func hrParentName(hr *gatewayv1beta1.HTTPRoute, pr *gatewayv1beta1.ParentReferen
1819
if pr.Namespace != nil {
1920
ns = string(*pr.Namespace)
2021
}
21-
return strings.Join([]string{"gw", ns, string(pr.Name), string(*pr.SectionName)}, ".")
22+
sn := ""
23+
if pr.SectionName != nil {
24+
sn = string(*pr.SectionName)
25+
}
26+
return strings.Join([]string{"gw", ns, string(pr.Name), sn}, ".")
2227
}
2328

2429
func gwListenerName(gw *gatewayv1beta1.Gateway, ls *gatewayv1beta1.Listener) string {
2530
return strings.Join([]string{"gw", gw.Namespace, gw.Name, string(ls.Name)}, ".")
2631
}
2732

28-
func namespaceMatches(gwNamespace string, namespaces *gatewayv1beta1.RouteNamespaces, routeNs *v1.Namespace) bool {
33+
func routeMatches(gwNamespace string, listener *gatewayv1beta1.Listener, routeNamespace *v1.Namespace, routeType string) bool {
34+
// actually, "listener" may be nil, but ".AllowedRoutes.Namespaces.From" will never be nil
35+
if listener == nil || listener.AllowedRoutes == nil {
36+
return false
37+
}
38+
namespaces := listener.AllowedRoutes.Namespaces
2939
if namespaces == nil || namespaces.From == nil {
30-
return true
40+
return false
3141
}
3242

43+
matchedFrom, matchedKind := false, false
44+
45+
// From
3346
switch *namespaces.From {
3447
case gatewayv1beta1.NamespacesFromAll:
35-
return true
48+
matchedFrom = true
3649
case gatewayv1beta1.NamespacesFromSame:
37-
return gwNamespace == routeNs.Name
50+
matchedFrom = gwNamespace == routeNamespace.Name
3851
case gatewayv1beta1.NamespacesFromSelector:
3952
if selector, err := metav1.LabelSelectorAsSelector(namespaces.Selector); err != nil {
4053
return false
4154
} else {
42-
return selector.Matches(labels.Set(routeNs.Labels))
55+
matchedFrom = selector.Matches(labels.Set(routeNamespace.Labels))
56+
}
57+
}
58+
if !matchedFrom {
59+
return false
60+
}
61+
62+
// Kind
63+
allowedKinds := listener.AllowedRoutes.Kinds
64+
if len(allowedKinds) == 0 {
65+
switch listener.Protocol {
66+
case gatewayv1beta1.HTTPProtocolType:
67+
matchedKind = routeType == reflect.TypeOf(gatewayv1beta1.HTTPRoute{}).Name()
68+
case gatewayv1beta1.HTTPSProtocolType:
69+
return false
70+
case gatewayv1beta1.TLSProtocolType:
71+
return false
72+
case gatewayv1beta1.TCPProtocolType:
73+
return false
74+
case gatewayv1beta1.UDPProtocolType:
75+
return false
76+
}
77+
} else {
78+
for _, k := range allowedKinds {
79+
if k.Group != nil && *k.Group != gatewayv1beta1.GroupName {
80+
return false
81+
} else {
82+
if k.Kind == gatewayv1beta1.Kind(routeType) {
83+
matchedKind = true
84+
break
85+
}
86+
}
4387
}
4488
}
4589

46-
return true
90+
return matchedFrom && matchedKind
4791
}

0 commit comments

Comments
 (0)