pkg/controllers/eventhandlers/gateway.go (72 lines of code) (raw):
package eventhandlers
import (
"context"
"time"
"github.com/aws/aws-application-networking-k8s/pkg/k8s"
"github.com/aws/aws-application-networking-k8s/pkg/model/core"
"github.com/aws/aws-application-networking-k8s/pkg/utils/gwlog"
"k8s.io/apimachinery/pkg/api/equality"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/types"
"k8s.io/client-go/util/workqueue"
"sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/event"
"sigs.k8s.io/controller-runtime/pkg/handler"
"sigs.k8s.io/controller-runtime/pkg/reconcile"
gwv1 "sigs.k8s.io/gateway-api/apis/v1"
)
type enqueueRequestsForGatewayEvent struct {
log gwlog.Logger
client client.Client
}
func NewEnqueueRequestGatewayEvent(log gwlog.Logger, client client.Client) handler.EventHandler {
return &enqueueRequestsForGatewayEvent{
log: log,
client: client,
}
}
var ZeroTransitionTime = metav1.NewTime(time.Time{})
func (h *enqueueRequestsForGatewayEvent) Create(ctx context.Context, e event.CreateEvent, queue workqueue.TypedRateLimitingInterface[reconcile.Request]) {
gwNew := e.Object.(*gwv1.Gateway)
h.log.Infof(ctx, "Received Create event for Gateway %s-%s", gwNew.Name, gwNew.Namespace)
// initialize transition time
gwNew.Status.Conditions[0].LastTransitionTime = ZeroTransitionTime
h.enqueueImpactedRoutes(ctx, queue)
}
func (h *enqueueRequestsForGatewayEvent) Update(ctx context.Context, e event.UpdateEvent, queue workqueue.TypedRateLimitingInterface[reconcile.Request]) {
gwOld := e.ObjectOld.(*gwv1.Gateway)
gwNew := e.ObjectNew.(*gwv1.Gateway)
h.log.Infof(ctx, "Received Update event for Gateway %s-%s", gwNew.GetName(), gwNew.GetNamespace())
if !equality.Semantic.DeepEqual(gwOld.Spec, gwNew.Spec) {
// initialize transition time
gwNew.Status.Conditions[0].LastTransitionTime = ZeroTransitionTime
h.enqueueImpactedRoutes(ctx, queue)
}
}
func (h *enqueueRequestsForGatewayEvent) Delete(ctx context.Context, e event.DeleteEvent, queue workqueue.TypedRateLimitingInterface[reconcile.Request]) {
// TODO: delete gateway
}
func (h *enqueueRequestsForGatewayEvent) Generic(ctx context.Context, e event.GenericEvent, queue workqueue.TypedRateLimitingInterface[reconcile.Request]) {
}
func (h *enqueueRequestsForGatewayEvent) enqueueImpactedRoutes(ctx context.Context, queue workqueue.TypedRateLimitingInterface[reconcile.Request]) {
routes, err := core.ListAllRoutes(ctx, h.client)
if err != nil {
h.log.Errorf(ctx, "Failed to list all routes, %s", err)
return
}
for _, route := range routes {
parents, err := k8s.FindControlledParents(ctx, h.client, route)
// If there is one or more parents, even if an error occurs,
// it is not an error related to the parent controlled by the Lattice Controller, so enqueue the route
if len(parents) > 0 {
// parents are controlled by lattice gateway controller, so enqueue the route
h.log.Debugf(ctx, "Adding Route %s-%s to queue due to Gateway event", route.Name(), route.Namespace())
queue.Add(reconcile.Request{
NamespacedName: types.NamespacedName{
Namespace: route.Namespace(),
Name: route.Name(),
},
})
continue
}
if err != nil {
h.log.Debugf(ctx, "Ignoring Route with unknown parentRef %s-%s", route.Name(), route.Namespace())
continue
}
h.log.Debugf(ctx, "Ignoring Route %s-%s with no controlled parent", route.Name(), route.Namespace())
}
}