@@ -18,6 +18,7 @@ package controller
1818
1919import (
2020 "context"
21+ "fmt"
2122 operatorv1alpha1 "github.com/tiny-systems/module/api/v1alpha1"
2223 "github.com/tiny-systems/module/internal/scheduler"
2324 "github.com/tiny-systems/module/module"
@@ -64,7 +65,6 @@ type TinyNodeReconciler struct {
6465func (r * TinyNodeReconciler ) Reconcile (ctx context.Context , req ctrl.Request ) (ctrl.Result , error ) {
6566 l := log .FromContext (ctx )
6667
67- //l.Info("reconcile", "tinynode", req.Name)
6868 m , _ , err := module .ParseFullName (req .Name )
6969 if err != nil {
7070 l .Error (err , "node has invalid name" , "name" , req .Name )
@@ -76,22 +76,49 @@ func (r *TinyNodeReconciler) Reconcile(ctx context.Context, req ctrl.Request) (c
7676 return reconcile.Result {}, nil
7777 }
7878
79+ l .Info ("reconcile" , "tinynode" , req .Name )
80+
7981 node := & operatorv1alpha1.TinyNode {}
8082
8183 if err = r .Get (context .Background (), req .NamespacedName , node ); err != nil {
8284 l .Error (err , "get tinynode error" )
8385 if errors .IsNotFound (err ) {
8486 // Object not found, return. Created objects are automatically garbage collected.
8587 // For additional cleanup logic use finalizers.
88+ // delete signals
89+
90+ _ = r .DeleteAllOf (context .Background (), & operatorv1alpha1.TinySignal {}, client .InNamespace (req .Namespace ), client.MatchingLabels {
91+ operatorv1alpha1 .NodeNameLabel : req .Name ,
92+ })
93+
8694 if err = r .Scheduler .Destroy (req .Name ); err != nil {
87- l .Error (err , "destroy error" )
8895 return reconcile.Result {}, err
8996 }
9097 return reconcile.Result {}, nil
9198 }
9299 // Error reading the object - requeue the request.
93100 return reconcile.Result {}, err
94101 }
102+ originNode := node .DeepCopy ()
103+
104+ // select all signals for this node
105+
106+ signalList := & operatorv1alpha1.TinySignalList {}
107+
108+ selector , err := v1 .LabelSelectorAsSelector (& v1.LabelSelector {
109+ MatchLabels : map [string ]string {
110+ operatorv1alpha1 .NodeNameLabel : node .Name ,
111+ },
112+ })
113+ if err != nil {
114+ return reconcile.Result {}, fmt .Errorf ("build signal selector error: %s" , err )
115+ }
116+
117+ if err = r .List (ctx , signalList , client.MatchingLabelsSelector {
118+ Selector : selector ,
119+ }, client .InNamespace (node .Namespace )); err != nil {
120+ return reconcile.Result {}, fmt .Errorf ("signal list error: %v" , err )
121+ }
95122
96123 status := & node .Status
97124
@@ -109,7 +136,7 @@ func (r *TinyNodeReconciler) Reconcile(ctx context.Context, req ctrl.Request) (c
109136 status .LastUpdateTime = & t
110137 // upsert in scheduler
111138 // todo add app level context
112- err = r .Scheduler .Update (context .Background (), node )
139+ err = r .Scheduler .Update (context .Background (), node , signalList )
113140 if err != nil {
114141 l .Error (err , "scheduler upsert error" )
115142 status .Error = true
@@ -118,7 +145,8 @@ func (r *TinyNodeReconciler) Reconcile(ctx context.Context, req ctrl.Request) (c
118145
119146 node .Status = * status
120147
121- err = r .Status ().Update (context .Background (), node )
148+ err = r .Status ().Patch (context .Background (), node , client .MergeFrom (originNode ))
149+ //err = r.Status().Update(context.Background(), node)
122150 if err != nil {
123151 l .Error (err , "status update error" )
124152 return reconcile.Result {}, err
@@ -135,15 +163,43 @@ func (r *TinyNodeReconciler) SetupWithManager(mgr ctrl.Manager) error {
135163 return ctrl .NewControllerManagedBy (mgr ).
136164 For (& operatorv1alpha1.TinyNode {}, builder .WithPredicates (predicate.GenerationChangedPredicate {})).
137165 Watches (& operatorv1alpha1.TinySignal {}, handler.TypedFuncs [client.Object , reconcile.Request ]{
138- DeleteFunc : func (ctx context.Context , e event.TypedDeleteEvent [client.Object ], q workqueue.TypedRateLimitingInterface [reconcile.Request ]) {
166+
167+ CreateFunc : func (ctx context.Context , e event.TypedCreateEvent [client.Object ], q workqueue.TypedRateLimitingInterface [reconcile.Request ]) {
139168 signal , ok := e .Object .(* operatorv1alpha1.TinySignal )
140169 if ! ok {
141170 return
142171 }
143- if signal .Spec .Port != module .ReconcilePort {
144- // do not reconcile if signal was used as a way to send data
172+ if signal .Spec .Port == module .ReconcilePort {
173+ // reconcile by signal only applies after deletion of the signal
174+ return
175+ }
176+ q .Add (reconcile.Request {
177+ NamespacedName : types.NamespacedName {
178+ Name : signal .Spec .Node ,
179+ Namespace : signal .Namespace ,
180+ },
181+ })
182+ },
183+ UpdateFunc : func (ctx context.Context , e event.TypedUpdateEvent [client.Object ], q workqueue.TypedRateLimitingInterface [reconcile.Request ]) {
184+ signal , ok := e .ObjectNew .(* operatorv1alpha1.TinySignal )
185+ if ! ok {
186+ return
187+ }
188+ // we do not update reconcile signals, only data ports
189+ q .Add (reconcile.Request {
190+ NamespacedName : types.NamespacedName {
191+ Name : signal .Spec .Node ,
192+ Namespace : signal .Namespace ,
193+ },
194+ })
195+ },
196+ // when tinySignal deleted signal with reconcile port - reconcile
197+ DeleteFunc : func (ctx context.Context , e event.TypedDeleteEvent [client.Object ], q workqueue.TypedRateLimitingInterface [reconcile.Request ]) {
198+ signal , ok := e .Object .(* operatorv1alpha1.TinySignal )
199+ if ! ok {
145200 return
146201 }
202+ // we reconcile if any relates signal deleted
147203 q .Add (reconcile.Request {
148204 NamespacedName : types.NamespacedName {
149205 Name : signal .Spec .Node ,
0 commit comments