Skip to content

Commit 0b3879d

Browse files
committed
support ingressclass
2 parents 64582c5 + e61d276 commit 0b3879d

19 files changed

+747
-193
lines changed

.github/workflows/apisix-conformance-test.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ jobs:
8686
ARCH: amd64
8787
ENABLE_PROXY: "false"
8888
BASE_IMAGE_TAG: "debug"
89-
ADC_VERSION: "dev"
89+
# ADC_VERSION: "dev"
9090
run: |
9191
echo "building images..."
9292
make build-image

.github/workflows/apisix-e2e-test.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ jobs:
8686
ARCH: amd64
8787
ENABLE_PROXY: "false"
8888
BASE_IMAGE_TAG: "debug"
89-
ADC_VERSION: "dev"
89+
# ADC_VERSION: "dev"
9090
run: |
9191
echo "building images..."
9292
make build-image

internal/controller/apisixconsumer_controller.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import (
2727
k8serrors "k8s.io/apimachinery/pkg/api/errors"
2828
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2929
"k8s.io/apimachinery/pkg/runtime"
30+
"k8s.io/apimachinery/pkg/runtime/schema"
3031
"k8s.io/apimachinery/pkg/types"
3132
ctrl "sigs.k8s.io/controller-runtime"
3233
"sigs.k8s.io/controller-runtime/pkg/builder"
@@ -53,6 +54,8 @@ type ApisixConsumerReconciler struct {
5354
Provider provider.Provider
5455
Updater status.Updater
5556
Readier readiness.ReadinessManager
57+
58+
ICGVK schema.GroupVersionKind
5659
}
5760

5861
// Reconcile FIXME: implement the reconcile logic (For now, it dose nothing other than directly accepting)
@@ -87,7 +90,7 @@ func (r *ApisixConsumerReconciler) Reconcile(ctx context.Context, req ctrl.Reque
8790
r.updateStatus(ac, err)
8891
}()
8992

90-
ingressClass, err = GetIngressClass(tctx, r.Client, r.Log, ac.Spec.IngressClassName)
93+
ingressClass, err = GetIngressClass(tctx, r.Client, r.Log, ac.Spec.IngressClassName, r.ICGVK.Version)
9194
if err != nil {
9295
r.Log.Error(err, "failed to get IngressClass")
9396
return ctrl.Result{}, err
@@ -146,18 +149,15 @@ func (r *ApisixConsumerReconciler) checkIngressClass(obj client.Object) bool {
146149
return false
147150
}
148151

149-
return matchesIngressClass(r.Client, r.Log, ac.Spec.IngressClassName)
152+
return matchesIngressClass(context.Background(), r.Client, r.Log, ac.Spec.IngressClassName, r.ICGVK.Version)
150153
}
151154

152155
func (r *ApisixConsumerReconciler) listApisixConsumerForGatewayProxy(ctx context.Context, obj client.Object) []reconcile.Request {
153156
return listIngressClassRequestsForGatewayProxy(ctx, r.Client, obj, r.Log, r.listApisixConsumerForIngressClass)
154157
}
155158

156159
func (r *ApisixConsumerReconciler) listApisixConsumerForIngressClass(ctx context.Context, obj client.Object) []reconcile.Request {
157-
ingressClass, ok := obj.(*networkingv1.IngressClass)
158-
if !ok {
159-
return nil
160-
}
160+
ingressClass := convertIngressClass(obj)
161161

162162
return ListMatchingRequests(
163163
ctx,

internal/controller/apisixglobalrule_controller.go

Lines changed: 5 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import (
2525
networkingv1 "k8s.io/api/networking/v1"
2626
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2727
"k8s.io/apimachinery/pkg/runtime"
28+
"k8s.io/apimachinery/pkg/runtime/schema"
2829
ctrl "sigs.k8s.io/controller-runtime"
2930
"sigs.k8s.io/controller-runtime/pkg/builder"
3031
"sigs.k8s.io/controller-runtime/pkg/client"
@@ -35,8 +36,6 @@ import (
3536

3637
"github.com/apache/apisix-ingress-controller/api/v1alpha1"
3738
apiv2 "github.com/apache/apisix-ingress-controller/api/v2"
38-
"github.com/apache/apisix-ingress-controller/internal/controller/config"
39-
"github.com/apache/apisix-ingress-controller/internal/controller/indexer"
4039
"github.com/apache/apisix-ingress-controller/internal/controller/status"
4140
"github.com/apache/apisix-ingress-controller/internal/manager/readiness"
4241
"github.com/apache/apisix-ingress-controller/internal/provider"
@@ -52,6 +51,8 @@ type ApisixGlobalRuleReconciler struct {
5251
Updater status.Updater
5352

5453
Readier readiness.ReadinessManager
54+
55+
ICGVK schema.GroupVersionKind
5556
}
5657

5758
// Reconcile implements the reconciliation logic for ApisixGlobalRule
@@ -84,7 +85,7 @@ func (r *ApisixGlobalRuleReconciler) Reconcile(ctx context.Context, req ctrl.Req
8485
tctx := provider.NewDefaultTranslateContext(ctx)
8586

8687
// get the ingress class
87-
ingressClass, err := GetIngressClass(tctx, r.Client, r.Log, globalRule.Spec.IngressClassName)
88+
ingressClass, err := GetIngressClass(tctx, r.Client, r.Log, globalRule.Spec.IngressClassName, r.ICGVK.Version)
8889
if err != nil {
8990
r.Log.Error(err, "failed to get IngressClass")
9091
return ctrl.Result{}, err
@@ -159,38 +160,7 @@ func (r *ApisixGlobalRuleReconciler) checkIngressClass(obj client.Object) bool {
159160
return false
160161
}
161162

162-
return r.matchesIngressClass(globalRule.Spec.IngressClassName)
163-
}
164-
165-
// matchesIngressClass checks if the given ingress class name matches our controlled classes
166-
func (r *ApisixGlobalRuleReconciler) matchesIngressClass(ingressClassName string) bool {
167-
if ingressClassName == "" {
168-
// Check for default ingress class
169-
ingressClassList := &networkingv1.IngressClassList{}
170-
if err := r.List(context.Background(), ingressClassList, client.MatchingFields{
171-
indexer.IngressClass: config.GetControllerName(),
172-
}); err != nil {
173-
r.Log.Error(err, "failed to list ingress classes")
174-
return false
175-
}
176-
177-
// Find the ingress class that is marked as default
178-
for _, ic := range ingressClassList.Items {
179-
if IsDefaultIngressClass(&ic) && matchesController(ic.Spec.Controller) {
180-
return true
181-
}
182-
}
183-
return false
184-
}
185-
186-
// Check if the specified ingress class is controlled by us
187-
var ingressClass networkingv1.IngressClass
188-
if err := r.Get(context.Background(), client.ObjectKey{Name: ingressClassName}, &ingressClass); err != nil {
189-
r.Log.Error(err, "failed to get ingress class", "ingressClass", ingressClassName)
190-
return false
191-
}
192-
193-
return matchesController(ingressClass.Spec.Controller)
163+
return matchesIngressClass(context.Background(), r.Client, r.Log, globalRule.Spec.IngressClassName, r.ICGVK.Version)
194164
}
195165

196166
// listGlobalRulesForIngressClass list all global rules that use a specific ingress class

internal/controller/apisixpluginconfig_controller.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import (
2323

2424
"github.com/go-logr/logr"
2525
"k8s.io/apimachinery/pkg/runtime"
26+
"k8s.io/apimachinery/pkg/runtime/schema"
2627
ctrl "sigs.k8s.io/controller-runtime"
2728
"sigs.k8s.io/controller-runtime/pkg/client"
2829
"sigs.k8s.io/controller-runtime/pkg/predicate"
@@ -38,6 +39,8 @@ type ApisixPluginConfigReconciler struct {
3839
Scheme *runtime.Scheme
3940
Log logr.Logger
4041
Updater status.Updater
42+
43+
ICGVK schema.GroupVersionKind
4144
}
4245

4346
// SetupWithManager sets up the controller with the Manager.

internal/controller/apisixroute_controller.go

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,9 @@ import (
3131
discoveryv1 "k8s.io/api/discovery/v1"
3232
networkingv1 "k8s.io/api/networking/v1"
3333
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
34+
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
3435
"k8s.io/apimachinery/pkg/runtime"
36+
"k8s.io/apimachinery/pkg/runtime/schema"
3537
k8stypes "k8s.io/apimachinery/pkg/types"
3638
ctrl "sigs.k8s.io/controller-runtime"
3739
"sigs.k8s.io/controller-runtime/pkg/builder"
@@ -59,6 +61,8 @@ type ApisixRouteReconciler struct {
5961
Provider provider.Provider
6062
Updater status.Updater
6163
Readier readiness.ReadinessManager
64+
65+
ICGVK schema.GroupVersionKind
6266
}
6367

6468
// SetupWithManager sets up the controller with the Manager.
@@ -128,7 +132,7 @@ func (r *ApisixRouteReconciler) Reconcile(ctx context.Context, req ctrl.Request)
128132
r.updateStatus(&ar, err)
129133
}()
130134

131-
if ic, err = GetIngressClass(tctx, r.Client, r.Log, ar.Spec.IngressClassName); err != nil {
135+
if ic, err = GetIngressClass(tctx, r.Client, r.Log, ar.Spec.IngressClassName, r.ICGVK.Version); err != nil {
132136
return ctrl.Result{}, err
133137
}
134138
if err = ProcessIngressClassParameters(tctx, r.Client, r.Log, &ar, ic); err != nil {
@@ -232,14 +236,16 @@ func (r *ApisixRouteReconciler) validatePluginConfig(ctx context.Context, tc *pr
232236

233237
// Check if ApisixPluginConfig has IngressClassName and if it matches
234238
if in.Spec.IngressClassName != pc.Spec.IngressClassName && pc.Spec.IngressClassName != "" {
235-
var pcIC networkingv1.IngressClass
236-
if err := r.Get(ctx, client.ObjectKey{Name: pc.Spec.IngressClassName}, &pcIC); err != nil {
239+
ic := &unstructured.Unstructured{}
240+
ic.SetGroupVersionKind(r.ICGVK)
241+
if err := r.Get(ctx, client.ObjectKey{Name: pc.Spec.IngressClassName}, ic); err != nil {
237242
return types.ReasonError{
238243
Reason: string(apiv2.ConditionReasonInvalidSpec),
239244
Message: fmt.Sprintf("failed to get IngressClass %s for ApisixPluginConfig %s: %v", pc.Spec.IngressClassName, pcNN, err),
240245
}
241246
}
242-
if !matchesController(pcIC.Spec.Controller) {
247+
controllerName, _, _ := unstructured.NestedString(ic.Object, "spec", "controller")
248+
if !matchesController(controllerName) {
243249
return types.ReasonError{
244250
Reason: string(apiv2.ConditionReasonInvalidSpec),
245251
Message: fmt.Sprintf("ApisixPluginConfig %s references IngressClass %s with non-matching controller", pcNN, pc.Spec.IngressClassName),

internal/controller/apisixtls_controller.go

Lines changed: 5 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import (
2626
networkingv1 "k8s.io/api/networking/v1"
2727
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2828
"k8s.io/apimachinery/pkg/runtime"
29+
"k8s.io/apimachinery/pkg/runtime/schema"
2930
"k8s.io/apimachinery/pkg/types"
3031
ctrl "sigs.k8s.io/controller-runtime"
3132
"sigs.k8s.io/controller-runtime/pkg/builder"
@@ -36,7 +37,6 @@ import (
3637

3738
"github.com/apache/apisix-ingress-controller/api/v1alpha1"
3839
apiv2 "github.com/apache/apisix-ingress-controller/api/v2"
39-
"github.com/apache/apisix-ingress-controller/internal/controller/config"
4040
"github.com/apache/apisix-ingress-controller/internal/controller/indexer"
4141
"github.com/apache/apisix-ingress-controller/internal/controller/status"
4242
"github.com/apache/apisix-ingress-controller/internal/manager/readiness"
@@ -52,6 +52,8 @@ type ApisixTlsReconciler struct {
5252
Provider provider.Provider
5353
Updater status.Updater
5454
Readier readiness.ReadinessManager
55+
56+
ICGVK schema.GroupVersionKind
5557
}
5658

5759
// SetupWithManager sets up the controller with the Manager.
@@ -115,7 +117,7 @@ func (r *ApisixTlsReconciler) Reconcile(ctx context.Context, req ctrl.Request) (
115117
tctx := provider.NewDefaultTranslateContext(ctx)
116118

117119
// get the ingress class
118-
ingressClass, err := GetIngressClass(tctx, r.Client, r.Log, tls.Spec.IngressClassName)
120+
ingressClass, err := GetIngressClass(tctx, r.Client, r.Log, tls.Spec.IngressClassName, r.ICGVK.Version)
119121
if err != nil {
120122
r.Log.Error(err, "failed to get IngressClass")
121123
r.updateStatus(&tls, metav1.Condition{
@@ -240,38 +242,7 @@ func (r *ApisixTlsReconciler) checkIngressClass(obj client.Object) bool {
240242
return false
241243
}
242244

243-
return r.matchesIngressClass(tls.Spec.IngressClassName)
244-
}
245-
246-
// matchesIngressClass checks if the given ingress class name matches our controlled classes
247-
func (r *ApisixTlsReconciler) matchesIngressClass(ingressClassName string) bool {
248-
if ingressClassName == "" {
249-
// Check for default ingress class
250-
ingressClassList := &networkingv1.IngressClassList{}
251-
if err := r.List(context.Background(), ingressClassList, client.MatchingFields{
252-
indexer.IngressClass: config.GetControllerName(),
253-
}); err != nil {
254-
r.Log.Error(err, "failed to list ingress classes")
255-
return false
256-
}
257-
258-
// Find the ingress class that is marked as default
259-
for _, ic := range ingressClassList.Items {
260-
if IsDefaultIngressClass(&ic) && matchesController(ic.Spec.Controller) {
261-
return true
262-
}
263-
}
264-
return false
265-
}
266-
267-
// Check if the specified ingress class is controlled by us
268-
var ingressClass networkingv1.IngressClass
269-
if err := r.Get(context.Background(), client.ObjectKey{Name: ingressClassName}, &ingressClass); err != nil {
270-
r.Log.Error(err, "failed to get ingress class", "ingressClass", ingressClassName)
271-
return false
272-
}
273-
274-
return matchesController(ingressClass.Spec.Controller)
245+
return matchesIngressClass(context.Background(), r.Client, r.Log, tls.Spec.IngressClassName, r.ICGVK.Version)
275246
}
276247

277248
func (r *ApisixTlsReconciler) listApisixTlsForSecret(ctx context.Context, obj client.Object) []reconcile.Request {

internal/controller/apisixupstream_controller.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import (
2222

2323
"github.com/go-logr/logr"
2424
"k8s.io/apimachinery/pkg/runtime"
25+
"k8s.io/apimachinery/pkg/runtime/schema"
2526
ctrl "sigs.k8s.io/controller-runtime"
2627
"sigs.k8s.io/controller-runtime/pkg/client"
2728
"sigs.k8s.io/controller-runtime/pkg/predicate"
@@ -37,6 +38,8 @@ type ApisixUpstreamReconciler struct {
3738
Scheme *runtime.Scheme
3839
Log logr.Logger
3940
Updater status.Updater
41+
42+
ICGVK schema.GroupVersionKind
4043
}
4144

4245
// SetupWithManager sets up the controller with the Manager.

internal/controller/gatewayproxy_controller.go

Lines changed: 33 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,10 @@ import (
2525
corev1 "k8s.io/api/core/v1"
2626
discoveryv1 "k8s.io/api/discovery/v1"
2727
networkingv1 "k8s.io/api/networking/v1"
28+
networkingv1beta1 "k8s.io/api/networking/v1beta1"
2829
"k8s.io/apimachinery/pkg/runtime"
29-
"k8s.io/apimachinery/pkg/types"
30+
"k8s.io/apimachinery/pkg/runtime/schema"
31+
k8stypes "k8s.io/apimachinery/pkg/types"
3032
ctrl "sigs.k8s.io/controller-runtime"
3133
"sigs.k8s.io/controller-runtime/pkg/client"
3234
"sigs.k8s.io/controller-runtime/pkg/handler"
@@ -47,6 +49,8 @@ type GatewayProxyController struct {
4749
Scheme *runtime.Scheme
4850
Log logr.Logger
4951
Provider provider.Provider
52+
53+
ICGVK schema.GroupVersionKind
5054
}
5155

5256
func (r *GatewayProxyController) SetupWithManager(mrg ctrl.Manager) error {
@@ -93,7 +97,7 @@ func (r *GatewayProxyController) Reconcile(ctx context.Context, req ctrl.Request
9397
if providerService == nil {
9498
tctx.EndpointSlices[req.NamespacedName] = nil
9599
} else {
96-
if err := addProviderEndpointsToTranslateContext(tctx, r.Client, types.NamespacedName{
100+
if err := addProviderEndpointsToTranslateContext(tctx, r.Client, k8stypes.NamespacedName{
97101
Namespace: gp.Namespace,
98102
Name: providerService.Name,
99103
}); err != nil {
@@ -106,7 +110,7 @@ func (r *GatewayProxyController) Reconcile(ctx context.Context, req ctrl.Request
106110
if auth.AdminKey != nil && auth.AdminKey.ValueFrom != nil && auth.AdminKey.ValueFrom.SecretKeyRef != nil {
107111
var (
108112
secret corev1.Secret
109-
secretNN = types.NamespacedName{
113+
secretNN = k8stypes.NamespacedName{
110114
Namespace: gp.GetNamespace(),
111115
Name: auth.AdminKey.ValueFrom.SecretKeyRef.Name,
112116
}
@@ -120,27 +124,42 @@ func (r *GatewayProxyController) Reconcile(ctx context.Context, req ctrl.Request
120124

121125
// list Gateways that reference the GatewayProxy
122126
var (
123-
gatewayList gatewayv1.GatewayList
124-
ingressClassList networkingv1.IngressClassList
125-
indexKey = indexer.GenIndexKey(gp.GetNamespace(), gp.GetName())
127+
gatewayList gatewayv1.GatewayList
128+
indexKey = indexer.GenIndexKey(gp.GetNamespace(), gp.GetName())
126129
)
127130
if err := r.List(ctx, &gatewayList, client.MatchingFields{indexer.ParametersRef: indexKey}); err != nil {
128131
r.Log.Error(err, "failed to list GatewayList")
129132
return ctrl.Result{}, nil
130133
}
131134

132-
// list IngressClasses that reference the GatewayProxy
133-
if err := r.List(ctx, &ingressClassList, client.MatchingFields{indexer.IngressClassParametersRef: indexKey}); err != nil {
134-
r.Log.Error(err, "failed to list IngressClassList")
135-
return reconcile.Result{}, err
136-
}
137-
138135
// append referrers to translate context
139136
for _, item := range gatewayList.Items {
140137
tctx.GatewayProxyReferrers[req.NamespacedName] = append(tctx.GatewayProxyReferrers[req.NamespacedName], utils.NamespacedNameKind(&item))
141138
}
142-
for _, item := range ingressClassList.Items {
143-
tctx.GatewayProxyReferrers[req.NamespacedName] = append(tctx.GatewayProxyReferrers[req.NamespacedName], utils.NamespacedNameKind(&item))
139+
140+
switch r.ICGVK.Version {
141+
case networkingv1.SchemeGroupVersion.Version, "":
142+
var ingressClassList networkingv1.IngressClassList
143+
// list IngressClasses that reference the GatewayProxy
144+
if err := r.List(ctx, &ingressClassList, client.MatchingFields{indexer.IngressClassParametersRef: indexKey}); err != nil {
145+
r.Log.Error(err, "failed to list IngressClassList")
146+
return reconcile.Result{}, err
147+
}
148+
149+
for _, item := range ingressClassList.Items {
150+
tctx.GatewayProxyReferrers[req.NamespacedName] = append(tctx.GatewayProxyReferrers[req.NamespacedName], utils.NamespacedNameKind(&item))
151+
}
152+
case networkingv1beta1.SchemeGroupVersion.Version:
153+
var ingressClassList networkingv1beta1.IngressClassList
154+
// list IngressClasses that reference the GatewayProxy
155+
if err := r.List(ctx, &ingressClassList, client.MatchingFields{indexer.IngressClassParametersRef: indexKey}); err != nil {
156+
r.Log.Error(err, "failed to list IngressClassList")
157+
return reconcile.Result{}, err
158+
}
159+
160+
for _, item := range ingressClassList.Items {
161+
tctx.GatewayProxyReferrers[req.NamespacedName] = append(tctx.GatewayProxyReferrers[req.NamespacedName], utils.NamespacedNameKind(&item))
162+
}
144163
}
145164

146165
if err := r.Provider.Update(ctx, tctx, &gp); err != nil {

0 commit comments

Comments
 (0)