88 "fmt"
99
1010 "go.uber.org/zap"
11+ corev1 "k8s.io/api/core/v1"
1112 apierrs "k8s.io/apimachinery/pkg/api/errors"
13+ "knative.dev/pkg/controller"
1214 "knative.dev/pkg/logging"
1315 pkgreconciler "knative.dev/pkg/reconciler"
1416 "knative.dev/pkg/resolver"
@@ -24,42 +26,90 @@ type Reconciler struct {
2426}
2527
2628func (r * Reconciler ) ReconcileKind (ctx context.Context , t * eventingv1alpha1.Trigger ) pkgreconciler.Event {
29+ err := r .resolveBroker (ctx , t )
30+ if err != nil {
31+ return err
32+ }
33+
34+ err = r .resolveTarget (ctx , t )
35+ if err != nil {
36+ return err
37+ }
38+
39+ return r .resolveDLS (ctx , t )
40+ }
41+
42+ func (r * Reconciler ) resolveBroker (ctx context.Context , t * eventingv1alpha1.Trigger ) pkgreconciler.Event {
2743 // TODO, use any broker, not RedisBrokers
2844 rb , err := r .rbLister .RedisBrokers (t .Namespace ).Get (t .Spec .Broker .Name )
2945 if err != nil {
3046 if apierrs .IsNotFound (err ) {
3147 logging .FromContext (ctx ).Errorw (fmt .Sprintf ("Trigger %s/%s references non existing broker %q" , t .Namespace , t .Name , t .Spec .Broker .Name ))
3248 t .Status .MarkBrokerFailed (reconciler .ReasonBrokerDoesNotExist , "Broker %q does not exist" , t .Spec .Broker .Name )
33- return nil
49+ // No need to requeue, we will be notified when if broker is created.
50+ return controller .NewPermanentError (err )
3451 }
3552
3653 t .Status .MarkBrokerFailed (reconciler .ReasonFailedBrokerGet , "Failed to get broker %q : %s" , t .Spec .Broker , err )
37- return err
54+ return pkgreconciler .NewEvent (corev1 .EventTypeWarning , reconciler .ReasonFailedBrokerGet ,
55+ "Failed to get broker for trigger %s/%s: %w" , t .Namespace , t .Name , err )
3856 }
3957
4058 t .Status .PropagateBrokerCondition (rb .Status .GetTopLevelCondition ())
41- // If Broker is not ready, we're done, but once it becomes ready, we'll get requeued.
59+
60+ // No need to requeue, we'll get requeued when broker changes status.
4261 if ! rb .IsReady () {
43- logging .FromContext (ctx ).Errorw ("Broker is not ready" , zap .Any ("Broker" , * rb ))
44- return nil
62+ logging .FromContext (ctx ).Errorw (fmt .Sprintf ("Trigger %s/%s references non ready broker %q" , t .Namespace , t .Name , t .Spec .Broker .Name ))
4563 }
4664
65+ return nil
66+ }
67+
68+ func (r * Reconciler ) resolveTarget (ctx context.Context , t * eventingv1alpha1.Trigger ) pkgreconciler.Event {
4769 if t .Spec .Target .Ref != nil && t .Spec .Target .Ref .Namespace == "" {
4870 // To call URIFromDestinationV1(ctx context.Context, dest v1.Destination, parent interface{}), dest.Ref must have a Namespace
4971 // If Target.Ref.Namespace is nil, We will use the Namespace of Trigger as the Namespace of dest.Ref
50- t .Spec .Target .Ref .Namespace = t .GetNamespace ()
72+ t .Spec .Target .Ref .Namespace = t .Namespace
5173 }
5274
53- targetURI , err := r .uriResolver .URIFromDestinationV1 (ctx , t .Spec .Target , rb )
75+ targetURI , err := r .uriResolver .URIFromDestinationV1 (ctx , t .Spec .Target , t )
5476 if err != nil {
5577 logging .FromContext (ctx ).Errorw ("Unable to get the target's URI" , zap .Error (err ))
5678 t .Status .MarkTargetResolvedFailed ("Unable to get the target's URI" , "%v" , err )
5779 t .Status .TargetURI = nil
58- return err
80+ return pkgreconciler .NewEvent (corev1 .EventTypeWarning , reconciler .ReasonFailedResolveReference ,
81+ "Failed to get target's URI: %w" , err )
5982 }
6083
6184 t .Status .TargetURI = targetURI
6285 t .Status .MarkTargetResolvedSucceeded ()
6386
6487 return nil
6588}
89+
90+ func (r * Reconciler ) resolveDLS (ctx context.Context , t * eventingv1alpha1.Trigger ) pkgreconciler.Event {
91+ if t .Spec .Delivery == nil || t .Spec .Delivery .DeadLetterSink == nil {
92+ t .Status .DeadLetterSinkURI = nil
93+ t .Status .MarkDeadLetterSinkNotConfigured ()
94+ }
95+
96+ if t .Spec .Delivery .DeadLetterSink .Ref != nil && t .Spec .Delivery .DeadLetterSink .Ref .Namespace == "" {
97+ // To call URIFromDestinationV1(ctx context.Context, dest v1.Destination, parent interface{}), dest.Ref must have a Namespace
98+ // If Target.Ref.Namespace is nil, We will use the Namespace of Trigger as the Namespace of dest.Ref
99+ t .Spec .Delivery .DeadLetterSink .Ref .Namespace = t .Namespace
100+ }
101+
102+ dlsURI , err := r .uriResolver .URIFromDestinationV1 (ctx , * t .Spec .Delivery .DeadLetterSink , t )
103+ if err != nil {
104+ logging .FromContext (ctx ).Errorw ("Unable to get the dead letter sink's URI" , zap .Error (err ))
105+ t .Status .MarkTargetResolvedFailed ("Unable to get the dead letter sink's URI" , "%v" , err )
106+ t .Status .TargetURI = nil
107+ return pkgreconciler .NewEvent (corev1 .EventTypeWarning , reconciler .ReasonFailedResolveReference ,
108+ "Failed to get dead letter sink's URI: %w" , err )
109+ }
110+
111+ t .Status .DeadLetterSinkURI = dlsURI
112+ t .Status .MarkDeadLetterSinkNotConfigured ()
113+
114+ return nil
115+ }
0 commit comments