Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions internal/controller/apisixconsumer_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ import (
apiv2 "github.com/apache/apisix-ingress-controller/api/v2"
"github.com/apache/apisix-ingress-controller/internal/controller/indexer"
"github.com/apache/apisix-ingress-controller/internal/controller/status"
"github.com/apache/apisix-ingress-controller/internal/manager/readiness"
"github.com/apache/apisix-ingress-controller/internal/provider"
"github.com/apache/apisix-ingress-controller/internal/utils"
)
Expand All @@ -51,10 +52,12 @@ type ApisixConsumerReconciler struct {

Provider provider.Provider
Updater status.Updater
Readier readiness.ReadinessManager
}

// Reconcile FIXME: implement the reconcile logic (For now, it dose nothing other than directly accepting)
func (r *ApisixConsumerReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
defer r.Readier.Done(&apiv2.ApisixConsumer{}, req.NamespacedName)
r.Log.Info("reconcile", "request", req.NamespacedName)

ac := &apiv2.ApisixConsumer{}
Expand Down
4 changes: 4 additions & 0 deletions internal/controller/apisixglobalrule_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ import (
"github.com/apache/apisix-ingress-controller/internal/controller/config"
"github.com/apache/apisix-ingress-controller/internal/controller/indexer"
"github.com/apache/apisix-ingress-controller/internal/controller/status"
"github.com/apache/apisix-ingress-controller/internal/manager/readiness"
"github.com/apache/apisix-ingress-controller/internal/provider"
"github.com/apache/apisix-ingress-controller/internal/utils"
)
Expand All @@ -49,10 +50,13 @@ type ApisixGlobalRuleReconciler struct {
Log logr.Logger
Provider provider.Provider
Updater status.Updater

Readier readiness.ReadinessManager
}

// Reconcile implements the reconciliation logic for ApisixGlobalRule
func (r *ApisixGlobalRuleReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
defer r.Readier.Done(&apiv2.ApisixGlobalRule{}, req.NamespacedName)
var globalRule apiv2.ApisixGlobalRule
if err := r.Get(ctx, req.NamespacedName, &globalRule); err != nil {
if client.IgnoreNotFound(err) == nil {
Expand Down
3 changes: 3 additions & 0 deletions internal/controller/apisixroute_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ import (
apiv2 "github.com/apache/apisix-ingress-controller/api/v2"
"github.com/apache/apisix-ingress-controller/internal/controller/indexer"
"github.com/apache/apisix-ingress-controller/internal/controller/status"
"github.com/apache/apisix-ingress-controller/internal/manager/readiness"
"github.com/apache/apisix-ingress-controller/internal/provider"
"github.com/apache/apisix-ingress-controller/internal/types"
"github.com/apache/apisix-ingress-controller/internal/utils"
Expand All @@ -57,6 +58,7 @@ type ApisixRouteReconciler struct {
Log logr.Logger
Provider provider.Provider
Updater status.Updater
Readier readiness.ReadinessManager
}

// SetupWithManager sets up the controller with the Manager.
Expand Down Expand Up @@ -97,6 +99,7 @@ func (r *ApisixRouteReconciler) SetupWithManager(mgr ctrl.Manager) error {
}

func (r *ApisixRouteReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
defer r.Readier.Done(&apiv2.ApisixRoute{}, req.NamespacedName)
var ar apiv2.ApisixRoute
if err := r.Get(ctx, req.NamespacedName, &ar); err != nil {
if client.IgnoreNotFound(err) == nil {
Expand Down
3 changes: 3 additions & 0 deletions internal/controller/apisixtls_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ import (
"github.com/apache/apisix-ingress-controller/internal/controller/config"
"github.com/apache/apisix-ingress-controller/internal/controller/indexer"
"github.com/apache/apisix-ingress-controller/internal/controller/status"
"github.com/apache/apisix-ingress-controller/internal/manager/readiness"
"github.com/apache/apisix-ingress-controller/internal/provider"
"github.com/apache/apisix-ingress-controller/internal/utils"
)
Expand All @@ -50,6 +51,7 @@ type ApisixTlsReconciler struct {
Log logr.Logger
Provider provider.Provider
Updater status.Updater
Readier readiness.ReadinessManager
}

// SetupWithManager sets up the controller with the Manager.
Expand Down Expand Up @@ -85,6 +87,7 @@ func (r *ApisixTlsReconciler) SetupWithManager(mgr ctrl.Manager) error {

// Reconcile implements the reconciliation logic for ApisixTls
func (r *ApisixTlsReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
defer r.Readier.Done(&apiv2.ApisixTls{}, req.NamespacedName)
var tls apiv2.ApisixTls
if err := r.Get(ctx, req.NamespacedName, &tls); err != nil {
if client.IgnoreNotFound(err) == nil {
Expand Down
31 changes: 4 additions & 27 deletions internal/controller/consumer_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ import (
"github.com/apache/apisix-ingress-controller/api/v1alpha1"
"github.com/apache/apisix-ingress-controller/internal/controller/indexer"
"github.com/apache/apisix-ingress-controller/internal/controller/status"
"github.com/apache/apisix-ingress-controller/internal/manager/readiness"
"github.com/apache/apisix-ingress-controller/internal/provider"
"github.com/apache/apisix-ingress-controller/internal/utils"
)
Expand All @@ -51,6 +52,7 @@ type ConsumerReconciler struct { //nolint:revive
Provider provider.Provider

Updater status.Updater
Readier readiness.ReadinessManager
}

// SetupWithManager sets up the controller with the Manager.
Expand Down Expand Up @@ -181,6 +183,7 @@ func (r *ConsumerReconciler) listConsumersForGatewayProxy(ctx context.Context, o
}

func (r *ConsumerReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
defer r.Readier.Done(&v1alpha1.Consumer{}, req.NamespacedName)
consumer := new(v1alpha1.Consumer)
if err := r.Get(ctx, req.NamespacedName, consumer); err != nil {
if client.IgnoreNotFound(err) == nil {
Expand Down Expand Up @@ -303,31 +306,5 @@ func (r *ConsumerReconciler) checkGatewayRef(object client.Object) bool {
if !ok {
return false
}
if consumer.Spec.GatewayRef.Name == "" {
return false
}
if consumer.Spec.GatewayRef.Kind != nil && *consumer.Spec.GatewayRef.Kind != KindGateway {
return false
}
if consumer.Spec.GatewayRef.Group != nil && *consumer.Spec.GatewayRef.Group != gatewayv1.GroupName {
return false
}
ns := consumer.GetNamespace()
if consumer.Spec.GatewayRef.Namespace != nil {
ns = *consumer.Spec.GatewayRef.Namespace
}
gateway := &gatewayv1.Gateway{}
if err := r.Get(context.Background(), client.ObjectKey{
Name: consumer.Spec.GatewayRef.Name,
Namespace: ns,
}, gateway); err != nil {
r.Log.Error(err, "failed to get gateway", "gateway", consumer.Spec.GatewayRef.Name)
return false
}
gatewayClass := &gatewayv1.GatewayClass{}
if err := r.Get(context.Background(), client.ObjectKey{Name: string(gateway.Spec.GatewayClassName)}, gatewayClass); err != nil {
r.Log.Error(err, "failed to get gateway class", "gateway", gateway.GetName(), "gatewayclass", gateway.Spec.GatewayClassName)
return false
}
return matchesController(string(gatewayClass.Spec.ControllerName))
return MatchConsumerGatewayRef(context.Background(), r.Client, r.Log, consumer)
}
3 changes: 3 additions & 0 deletions internal/controller/httproute_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ import (
"github.com/apache/apisix-ingress-controller/api/v1alpha1"
"github.com/apache/apisix-ingress-controller/internal/controller/indexer"
"github.com/apache/apisix-ingress-controller/internal/controller/status"
"github.com/apache/apisix-ingress-controller/internal/manager/readiness"
"github.com/apache/apisix-ingress-controller/internal/provider"
"github.com/apache/apisix-ingress-controller/internal/types"
"github.com/apache/apisix-ingress-controller/internal/utils"
Expand All @@ -65,6 +66,7 @@ type HTTPRouteReconciler struct { //nolint:revive
genericEvent chan event.GenericEvent

Updater status.Updater
Readier readiness.ReadinessManager
}

// SetupWithManager sets up the controller with the Manager.
Expand Down Expand Up @@ -130,6 +132,7 @@ func (r *HTTPRouteReconciler) SetupWithManager(mgr ctrl.Manager) error {
}

func (r *HTTPRouteReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
defer r.Readier.Done(&gatewayv1.HTTPRoute{}, req.NamespacedName)
hr := new(gatewayv1.HTTPRoute)
if err := r.Get(ctx, req.NamespacedName, hr); err != nil {
if client.IgnoreNotFound(err) == nil {
Expand Down
22 changes: 17 additions & 5 deletions internal/controller/indexer/indexer.go
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ const (
GatewayClassIndexRef = "gatewayClassRef"
ApisixUpstreamRef = "apisixUpstreamRef"
PluginConfigIndexRef = "pluginConfigRefs"
ControllerName = "controllerName"
)

func SetupIndexer(mgr ctrl.Manager) error {
Expand All @@ -59,11 +60,11 @@ func SetupIndexer(mgr ctrl.Manager) error {
setupIngressClassIndexer,
setupGatewayProxyIndexer,
setupGatewaySecretIndex,
setupGatewayClassIndexer,
setupApisixRouteIndexer,
setupApisixPluginConfigIndexer,
setupApisixTlsIndexer,
setupApisixConsumerIndexer,
setupGatewayClassIndexer,
} {
if err := setup(mgr); err != nil {
return err
Expand All @@ -81,6 +82,17 @@ func setupGatewayIndexer(mgr ctrl.Manager) error {
); err != nil {
return err
}

if err := mgr.GetFieldIndexer().IndexField(
context.Background(),
&gatewayv1.Gateway{},
GatewayClassIndexRef,
func(obj client.Object) (requests []string) {
return []string{string(obj.(*gatewayv1.Gateway).Spec.GatewayClassName)}
},
); err != nil {
return err
}
return nil
}

Expand Down Expand Up @@ -273,10 +285,10 @@ func setupGatewaySecretIndex(mgr ctrl.Manager) error {
func setupGatewayClassIndexer(mgr ctrl.Manager) error {
return mgr.GetFieldIndexer().IndexField(
context.Background(),
&gatewayv1.Gateway{},
GatewayClassIndexRef,
func(obj client.Object) (requests []string) {
return []string{string(obj.(*gatewayv1.Gateway).Spec.GatewayClassName)}
&gatewayv1.GatewayClass{},
ControllerName,
func(obj client.Object) []string {
return []string{string(obj.(*gatewayv1.GatewayClass).Spec.ControllerName)}
},
)
}
Expand Down
3 changes: 3 additions & 0 deletions internal/controller/ingress_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ import (
"github.com/apache/apisix-ingress-controller/api/v1alpha1"
"github.com/apache/apisix-ingress-controller/internal/controller/indexer"
"github.com/apache/apisix-ingress-controller/internal/controller/status"
"github.com/apache/apisix-ingress-controller/internal/manager/readiness"
"github.com/apache/apisix-ingress-controller/internal/provider"
"github.com/apache/apisix-ingress-controller/internal/utils"
)
Expand All @@ -59,6 +60,7 @@ type IngressReconciler struct { //nolint:revive
genericEvent chan event.GenericEvent

Updater status.Updater
Readier readiness.ReadinessManager
}

// SetupWithManager sets up the controller with the Manager.
Expand Down Expand Up @@ -117,6 +119,7 @@ func (r *IngressReconciler) SetupWithManager(mgr ctrl.Manager) error {

// Reconcile handles the reconciliation of Ingress resources
func (r *IngressReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
defer r.Readier.Done(&networkingv1.Ingress{}, req.NamespacedName)
ingress := new(networkingv1.Ingress)
if err := r.Get(ctx, req.NamespacedName, ingress); err != nil {
if client.IgnoreNotFound(err) == nil {
Expand Down
4 changes: 4 additions & 0 deletions internal/controller/status/updater.go
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,10 @@ func (u *UpdateHandler) Start(ctx context.Context) error {
}
}

func (u *UpdateHandler) NeedsLeaderElection() bool {
return true
}

func (u *UpdateHandler) Writer() Updater {
return &UpdateWriter{
updateChannel: u.updateChannel,
Expand Down
35 changes: 35 additions & 0 deletions internal/controller/utils.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ import (
corev1 "k8s.io/api/core/v1"
discoveryv1 "k8s.io/api/discovery/v1"
networkingv1 "k8s.io/api/networking/v1"
k8serrors "k8s.io/apimachinery/pkg/api/errors"
"k8s.io/apimachinery/pkg/api/meta"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/labels"
Expand Down Expand Up @@ -1448,3 +1449,37 @@ func TypePredicate[T client.Object]() func(obj client.Object) bool {
return ok
}
}

func MatchConsumerGatewayRef(ctx context.Context, c client.Client, log logr.Logger, consumer *v1alpha1.Consumer) bool {
if consumer.Spec.GatewayRef.Name == "" {
return false
}
if consumer.Spec.GatewayRef.Kind != nil && *consumer.Spec.GatewayRef.Kind != KindGateway {
return false
}
if consumer.Spec.GatewayRef.Group != nil && *consumer.Spec.GatewayRef.Group != gatewayv1.GroupName {
return false
}
ns := consumer.GetNamespace()
if consumer.Spec.GatewayRef.Namespace != nil {
ns = *consumer.Spec.GatewayRef.Namespace
}
gateway := &gatewayv1.Gateway{}
if err := c.Get(context.Background(), client.ObjectKey{
Name: consumer.Spec.GatewayRef.Name,
Namespace: ns,
}, gateway); err != nil {
if !k8serrors.IsNotFound(err) {
log.Error(err, "failed to get gateway", "gateway", consumer.Spec.GatewayRef.Name)
}
return false
}
gatewayClass := &gatewayv1.GatewayClass{}
if err := c.Get(context.Background(), client.ObjectKey{Name: string(gateway.Spec.GatewayClassName)}, gatewayClass); err != nil {
if !k8serrors.IsNotFound(err) {
log.Error(err, "failed to get gateway class", "gateway", gateway.GetName(), "gatewayclass", gateway.Spec.GatewayClassName)
}
return false
}
return matchesController(string(gatewayClass.Spec.ControllerName))
}
Loading
Loading