internal/eventhandlers/namespace.go (67 lines of code) (raw):
package eventhandlers
import (
"context"
"github.com/aws/amazon-network-policy-controller-k8s/pkg/k8s"
"github.com/aws/amazon-network-policy-controller-k8s/pkg/resolvers"
"github.com/go-logr/logr"
corev1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/equality"
"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"
)
// NewEnqueueRequestForNamespaceEvent construct enqueueRequestsForNamespaceEvent
func NewEnqueueRequestForNamespaceEvent(policyEventChan chan<- event.GenericEvent, k8sClient client.Client,
policyResolver resolvers.PolicyReferenceResolver, logger logr.Logger) handler.EventHandler {
return &enqueueRequestForNamespaceEvent{
k8sClient: k8sClient,
policyEventChan: policyEventChan,
policyResolver: policyResolver,
logger: logger,
}
}
var _ handler.EventHandler = (*enqueueRequestForNamespaceEvent)(nil)
type enqueueRequestForNamespaceEvent struct {
k8sClient client.Client
policyEventChan chan<- event.GenericEvent
logger logr.Logger
policyResolver resolvers.PolicyReferenceResolver
}
func (h *enqueueRequestForNamespaceEvent) Create(ctx context.Context, event event.CreateEvent, q workqueue.TypedRateLimitingInterface[reconcile.Request]) {
ns := event.Object.(*corev1.Namespace)
h.logger.V(1).Info("Handling create event", "namespace", k8s.NamespacedName(ns))
h.enqueueReferredPolicies(ctx, q, ns, nil)
}
func (h *enqueueRequestForNamespaceEvent) Update(ctx context.Context, event event.UpdateEvent, q workqueue.TypedRateLimitingInterface[reconcile.Request]) {
nsNew := event.ObjectNew.(*corev1.Namespace)
nsOld := event.ObjectOld.(*corev1.Namespace)
h.logger.V(1).Info("Handling update event", "namespace", k8s.NamespacedName(nsNew))
if equality.Semantic.DeepEqual(nsOld.Labels, nsNew.Labels) &&
equality.Semantic.DeepEqual(nsOld.DeletionTimestamp.IsZero(), nsNew.DeletionTimestamp.IsZero()) {
return
}
h.enqueueReferredPolicies(ctx, q, nsNew, nsOld)
}
func (h *enqueueRequestForNamespaceEvent) Delete(ctx context.Context, event event.DeleteEvent, q workqueue.TypedRateLimitingInterface[reconcile.Request]) {
ns := event.Object.(*corev1.Namespace)
h.logger.V(1).Info("Handling delete event", "namespace", k8s.NamespacedName(ns))
h.enqueueReferredPolicies(ctx, q, ns, nil)
}
func (h *enqueueRequestForNamespaceEvent) Generic(_ context.Context, _ event.GenericEvent, _ workqueue.TypedRateLimitingInterface[reconcile.Request]) {
return
}
func (h *enqueueRequestForNamespaceEvent) enqueueReferredPolicies(ctx context.Context, _ workqueue.TypedRateLimitingInterface[reconcile.Request], ns, nsOld *corev1.Namespace) {
referredPolicies, err := h.policyResolver.GetReferredPoliciesForNamespace(ctx, ns, nsOld)
if err != nil {
h.logger.Error(err, "Unable to get referred policies", "namespace", k8s.NamespacedName(ns))
return
}
for i := range referredPolicies {
policy := &referredPolicies[i]
h.logger.V(1).Info("Enqueue from namespace reference", "policy", k8s.NamespacedName(policy), "namespace", k8s.NamespacedName(ns))
h.policyEventChan <- event.GenericEvent{
Object: policy,
}
}
}