Skip to content

Commit b8d9450

Browse files
committed
feat: Enable ReferenceGrant checks and streamline validation logic
1 parent 7c9925b commit b8d9450

File tree

4 files changed

+42
-27
lines changed

4 files changed

+42
-27
lines changed

internal/controller/gateway_controller.go

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -169,12 +169,7 @@ func (r *GatewayReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ct
169169
}
170170
}
171171

172-
var referenceGrantList v1beta1.ReferenceGrantList
173-
if err := r.List(ctx, &referenceGrantList); err != nil {
174-
r.Log.Error(err, "failed to list reference grants")
175-
return ctrl.Result{}, err
176-
}
177-
listenerStatuses, err := getListenerStatus(ctx, r.Client, gateway, referenceGrantList.Items)
172+
listenerStatuses, err := getListenerStatus(ctx, r.Client, gateway)
178173
if err != nil {
179174
r.Log.Error(err, "failed to get listener status", "gateway", types.NamespacedName{Namespace: gateway.GetNamespace()})
180175
return ctrl.Result{}, err

internal/controller/httproute_controller.go

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -459,12 +459,8 @@ func (r *HTTPRouteReconciler) processHTTPRouteBackendRefs(tctx *provider.Transla
459459

460460
// if cross namespaces between HTTPRoute and referenced Service, check ReferenceGrant
461461
if hrNN.Namespace != targetNN.Namespace {
462-
var referenceGrantList v1beta1.ReferenceGrantList
463-
if err := r.List(tctx, &referenceGrantList, client.InNamespace(targetNN.Namespace)); err != nil {
464-
r.Log.Error(err, "failed to list ReferenceGrants", "namespace", targetNN.Namespace)
465-
return err
466-
}
467-
if permitted := checkReferenceGrant(
462+
if permitted := checkReferenceGrant(tctx,
463+
r.Client,
468464
v1beta1.ReferenceGrantFrom{
469465
Group: gatewayv1.GroupName,
470466
Kind: KindHTTPRoute,
@@ -476,7 +472,6 @@ func (r *HTTPRouteReconciler) processHTTPRouteBackendRefs(tctx *provider.Transla
476472
Name: gatewayv1.ObjectName(targetNN.Name),
477473
Namespace: (*gatewayv1.Namespace)(&targetNN.Namespace),
478474
},
479-
referenceGrantList.Items,
480475
); !permitted {
481476
terr = ReasonError{
482477
Reason: string(v1beta1.RouteReasonRefNotPermitted),

internal/controller/utils.go

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,18 @@ var (
6060
ErrNoMatchingListenerHostname = errors.New("no matching hostnames in listener")
6161
)
6262

63+
var (
64+
enableReferenceGrant bool
65+
)
66+
67+
func SetEnableReferenceGrant(enable bool) {
68+
enableReferenceGrant = enable
69+
}
70+
71+
func GetEnableReferenceGrant() bool {
72+
return enableReferenceGrant
73+
}
74+
6375
// IsDefaultIngressClass returns whether an IngressClass is the default IngressClass.
6476
func IsDefaultIngressClass(obj client.Object) bool {
6577
if ingressClass, ok := obj.(*networkingv1.IngressClass); ok {
@@ -651,7 +663,6 @@ func getListenerStatus(
651663
ctx context.Context,
652664
mrgc client.Client,
653665
gateway *gatewayv1.Gateway,
654-
grants []v1beta1.ReferenceGrant,
655666
) ([]gatewayv1.ListenerStatus, error) {
656667
statuses := make(map[gatewayv1.SectionName]gatewayv1.ListenerStatus, len(gateway.Spec.Listeners))
657668

@@ -739,7 +750,8 @@ func getListenerStatus(
739750
conditionProgrammed.Reason = string(gatewayv1.ListenerReasonInvalid)
740751
break
741752
}
742-
if permitted := checkReferenceGrant(
753+
if permitted := checkReferenceGrant(ctx,
754+
mrgc,
743755
v1beta1.ReferenceGrantFrom{
744756
Group: gatewayv1.GroupName,
745757
Kind: KindGateway,
@@ -751,7 +763,6 @@ func getListenerStatus(
751763
Name: ref.Name,
752764
Namespace: ref.Namespace,
753765
},
754-
grants,
755766
); !permitted {
756767
conditionResolvedRefs.Status = metav1.ConditionFalse
757768
conditionResolvedRefs.Reason = string(gatewayv1.ListenerReasonRefNotPermitted)
@@ -1107,11 +1118,21 @@ func referenceGrantPredicates(kind gatewayv1.Kind) predicate.Funcs {
11071118
return predicates
11081119
}
11091120

1110-
func checkReferenceGrant(obj v1beta1.ReferenceGrantFrom, ref gatewayv1.ObjectReference, grants []v1beta1.ReferenceGrant) bool {
1121+
func checkReferenceGrant(ctx context.Context, cli client.Client, obj v1beta1.ReferenceGrantFrom, ref gatewayv1.ObjectReference) bool {
11111122
if ref.Namespace == nil || *ref.Namespace == obj.Namespace {
11121123
return true
11131124
}
1114-
for _, grant := range grants {
1125+
1126+
if !GetEnableReferenceGrant() {
1127+
return false
1128+
}
1129+
1130+
var grantList v1beta1.ReferenceGrantList
1131+
if err := cli.List(ctx, &grantList, client.InNamespace(*ref.Namespace)); err != nil {
1132+
return false
1133+
}
1134+
1135+
for _, grant := range grantList.Items {
11151136
if grant.Namespace == string(*ref.Namespace) {
11161137
for _, from := range grant.Spec.From {
11171138
if obj == from {

internal/manager/run.go

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ import (
1919
"time"
2020

2121
"github.com/go-logr/logr"
22-
"github.com/pkg/errors"
2322
"k8s.io/apimachinery/pkg/runtime"
2423
"k8s.io/apimachinery/pkg/runtime/schema"
2524
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
@@ -34,6 +33,7 @@ import (
3433
"sigs.k8s.io/gateway-api/apis/v1beta1"
3534

3635
"github.com/apache/apisix-ingress-controller/api/v1alpha1"
36+
"github.com/apache/apisix-ingress-controller/internal/controller"
3737
"github.com/apache/apisix-ingress-controller/internal/controller/config"
3838
"github.com/apache/apisix-ingress-controller/internal/provider/adc"
3939
)
@@ -177,20 +177,24 @@ func Run(ctx context.Context, logger logr.Logger) error {
177177
}
178178
}()
179179

180+
setupLog.Info("check ReferenceGrants is enabled")
181+
_, err = mgr.GetRESTMapper().KindsFor(schema.GroupVersionResource{
182+
Group: v1beta1.GroupVersion.Group,
183+
Version: v1beta1.GroupVersion.Version,
184+
Resource: "referencegrants",
185+
})
186+
if err != nil {
187+
logger.Error(err, "CRD ReferenceGrants is not installed")
188+
}
189+
controller.SetEnableReferenceGrant(err == nil)
190+
180191
setupLog.Info("setting up controllers")
181192
controllers, err := setupControllers(ctx, mgr, provider)
182193
if err != nil {
183194
setupLog.Error(err, "unable to set up controllers")
184195
return err
185196
}
186-
if _, err = mgr.GetRESTMapper().KindsFor(schema.GroupVersionResource{
187-
Group: v1beta1.GroupVersion.Group,
188-
Version: v1beta1.GroupVersion.Version,
189-
Resource: "referencegrants",
190-
}); err != nil {
191-
logger.Error(err, "CRD ReferenceGrants is not installed")
192-
return errors.Wrap(err, "CRD ReferenceGrants is not installed")
193-
}
197+
194198
for _, c := range controllers {
195199
if err := c.SetupWithManager(mgr); err != nil {
196200
return err

0 commit comments

Comments
 (0)