@@ -47,9 +47,9 @@ type DeploymentTargetReconciler struct {
47
47
48
48
const (
49
49
FinalizerDT = "dt.appstudio.redhat.com/finalizer"
50
- DeploymentTargetConditionTypeErrorOccurred = "ValidDeploymentTargetClaim "
50
+ DeploymentTargetConditionTypeErrorOccurred = "ErrorOccurred "
51
51
DeploymentTargetReasonErrorOccurred = "ErrorOccurred"
52
- DeploymentTargetReasonBound = "Bound "
52
+ DeploymentTargetReasonSuccess = "Success "
53
53
)
54
54
55
55
//+kubebuilder:rbac:groups=appstudio.redhat.com,resources=deploymenttargetclaims,verbs=get;list;watch;update;patch
@@ -78,6 +78,62 @@ func (r *DeploymentTargetReconciler) Reconcile(ctx context.Context, req ctrl.Req
78
78
logutil .Log_K8s_Request_Name , req .Name ,
79
79
logutil .Log_Component , logutil .Log_Component_Appstudio_Controller )
80
80
81
+ res , condition , err := r .reconcileInternal (ctx , req , log )
82
+
83
+ if condition != nil {
84
+
85
+ // User error occurred
86
+ if err := updateStatusConditionOfDeploymentTarget (ctx , * condition , & applicationv1alpha1.DeploymentTarget {
87
+ ObjectMeta : metav1.ObjectMeta {
88
+ Name : req .Name ,
89
+ Namespace : req .Namespace ,
90
+ },
91
+ }, r .Client , log ); err != nil {
92
+ log .Error (err , "unable to update status of DeploymentTarget" )
93
+ return ctrl.Result {}, err
94
+ }
95
+
96
+ return ctrl.Result {}, err
97
+
98
+ } else if err != nil {
99
+
100
+ // Generic error occurred
101
+
102
+ condition := createCondition (DeploymentTargetConditionTypeErrorOccurred , metav1 .ConditionTrue , DeploymentTargetReasonErrorOccurred , "unexpected internal error occurred in DT controller" )
103
+
104
+ if err := updateStatusConditionOfDeploymentTarget (ctx , * condition , & applicationv1alpha1.DeploymentTarget {
105
+ ObjectMeta : metav1.ObjectMeta {
106
+ Name : req .Name ,
107
+ Namespace : req .Namespace ,
108
+ },
109
+ }, r .Client , log ); err != nil {
110
+ log .Error (err , "unable to update status of DeploymentTarget" )
111
+ return ctrl.Result {}, err
112
+ }
113
+
114
+ return ctrl.Result {}, err
115
+
116
+ }
117
+
118
+ // No error occurred, so set the condition to false
119
+
120
+ condition = createCondition (DeploymentTargetConditionTypeErrorOccurred , metav1 .ConditionFalse , DeploymentTargetReasonSuccess , "" )
121
+
122
+ if err := updateStatusConditionOfDeploymentTarget (ctx , * condition , & applicationv1alpha1.DeploymentTarget {
123
+ ObjectMeta : metav1.ObjectMeta {
124
+ Name : req .Name ,
125
+ Namespace : req .Namespace ,
126
+ },
127
+ }, r .Client , log ); err != nil {
128
+ log .Error (err , "unable to update status of DeploymentTarget" )
129
+ return ctrl.Result {}, err
130
+ }
131
+
132
+ return res , err
133
+ }
134
+
135
+ func (r * DeploymentTargetReconciler ) reconcileInternal (ctx context.Context , req ctrl.Request , log logr.Logger ) (ctrl.Result , * metav1.Condition , error ) {
136
+
81
137
dt := applicationv1alpha1.DeploymentTarget {
82
138
ObjectMeta : metav1.ObjectMeta {
83
139
Name : req .Name ,
@@ -86,45 +142,36 @@ func (r *DeploymentTargetReconciler) Reconcile(ctx context.Context, req ctrl.Req
86
142
}
87
143
if err := r .Client .Get (ctx , client .ObjectKeyFromObject (& dt ), & dt ); err != nil {
88
144
if apierr .IsNotFound (err ) {
89
- return ctrl.Result {}, nil
145
+ return ctrl.Result {}, nil , nil
90
146
}
91
- return ctrl.Result {}, err
147
+ return ctrl.Result {}, nil , err
92
148
}
93
149
94
150
// Add the deletion finalizer if it is absent.
95
151
if addFinalizer (& dt , FinalizerDT ) {
96
152
if err := r .Client .Update (ctx , & dt ); err != nil {
97
- return ctrl.Result {}, fmt .Errorf ("failed to add finalizer %s to DeploymentTarget %s in namespace %s: %v" , FinalizerDT , dt .Name , dt .Namespace , err )
153
+ return ctrl.Result {}, nil , fmt .Errorf ("failed to add finalizer %s to DeploymentTarget %s in namespace %s: %v" , FinalizerDT , dt .Name , dt .Namespace , err )
98
154
}
99
155
log .Info ("Added finalizer to DeploymentTarget" , "finalizer" , FinalizerDT )
100
156
}
101
157
102
158
// Retrieve and sanity check the DeploymentTargetClass of the DT
103
159
dtClass , err := findMatchingDTClassForDT (ctx , dt , r .Client )
104
- // Update Status.Conditions field of DeploymentTarget.
105
- if err := updateStatusConditionOfDeploymentTarget (ctx , r .Client , "failed to retrieve DeploymentTargetClass of DeploymentTarget" ,
106
- & dt , DeploymentTargetConditionTypeErrorOccurred , metav1 .ConditionFalse , DeploymentTargetReasonErrorOccurred , log ); err != nil {
107
- return ctrl.Result {}, fmt .Errorf ("unable to update deployment target status condition. %v" , err )
108
- }
109
-
110
160
if err != nil {
111
161
if apierr .IsNotFound (err ) {
112
- return ctrl.Result {}, nil
162
+ return ctrl.Result {}, nil , nil
113
163
}
114
- return ctrl.Result {}, err
164
+
165
+ return ctrl.Result {}, createCondition (DeploymentTargetConditionTypeErrorOccurred , metav1 .ConditionTrue , DeploymentTargetReasonErrorOccurred , "failed to retrieve DeploymentTargetClass of DeploymentTarget" ), nil
115
166
}
167
+
116
168
if dtClass .Spec .ReclaimPolicy != applicationv1alpha1 .ReclaimPolicy_Delete &&
117
169
dtClass .Spec .ReclaimPolicy != applicationv1alpha1 .ReclaimPolicy_Retain {
118
170
119
171
log .Error (nil , "unexpected reclaim policy value on DTClass" , "reclaimPolicy" , dtClass .Spec .ReclaimPolicy )
120
172
121
- // Update Status.Conditions field of DeploymentTarget.
122
- if err := updateStatusConditionOfDeploymentTarget (ctx , r .Client , "unexpected reclaim policy value on DeploymentTargetClass" ,
123
- & dt , DeploymentTargetConditionTypeErrorOccurred , metav1 .ConditionFalse , DeploymentTargetReasonErrorOccurred , log ); err != nil {
124
- return ctrl.Result {}, fmt .Errorf ("unable to update deployment target status condition. %v" , err )
125
- }
173
+ return ctrl.Result {}, createCondition (DeploymentTargetConditionTypeErrorOccurred , metav1 .ConditionTrue , DeploymentTargetReasonErrorOccurred , "unexpected reclaim policy value on DeploymentTargetClass" ), nil
126
174
127
- return ctrl.Result {}, nil
128
175
}
129
176
130
177
// If the DeploymentTarget is not deleted, verify if it has a corresponding DTC
@@ -138,14 +185,14 @@ func (r *DeploymentTargetReconciler) Reconcile(ctx context.Context, req ctrl.Req
138
185
139
186
if err := r .Client .Get (ctx , client .ObjectKeyFromObject (dtc ), dtc ); err != nil {
140
187
if ! apierr .IsNotFound (err ) {
141
- return ctrl.Result {}, err
188
+ return ctrl.Result {}, nil , err
142
189
}
143
190
144
191
// If the DTC is already deleted and the reclaim policy is Retain, unset the claimRef field of the DeploymentTarget.
145
192
if dtClass .Spec .ReclaimPolicy == applicationv1alpha1 .ReclaimPolicy_Retain {
146
193
dt .Spec .ClaimRef = ""
147
194
if err := r .Client .Update (ctx , & dt ); err != nil {
148
- return ctrl.Result {}, err
195
+ return ctrl.Result {}, nil , err
149
196
}
150
197
151
198
log .Info ("ClaimRef of DeploymentTarget is unset since its corresponding DeploymentTargetClaim is already deleted" , "DeploymentTarget" , dt .Name )
@@ -158,12 +205,8 @@ func (r *DeploymentTargetReconciler) Reconcile(ctx context.Context, req ctrl.Req
158
205
if dt .DeletionTimestamp == nil {
159
206
// The DeploymentTarget is not currently being deleted, so no more work to do.
160
207
// Update Status.Conditions field of DeploymentTarget.
161
- if err := updateStatusConditionOfDeploymentTarget (ctx , r .Client , "" ,
162
- & dt , DeploymentTargetConditionTypeErrorOccurred , metav1 .ConditionTrue , DeploymentTargetReasonBound , log ); err != nil {
163
- return ctrl.Result {}, fmt .Errorf ("unable to update deployment target status condition. %v" , err )
164
- }
165
208
166
- return ctrl.Result {}, nil
209
+ return ctrl.Result {}, nil , nil
167
210
}
168
211
169
212
// From this point on in this function, the DeletionTimestamp is necessarily set
@@ -172,38 +215,33 @@ func (r *DeploymentTargetReconciler) Reconcile(ctx context.Context, req ctrl.Req
172
215
var sr * codereadytoolchainv1alpha1.SpaceRequest
173
216
if sr , err = findMatchingSpaceRequestForDT (ctx , r .Client , dt ); err != nil {
174
217
if ! apierr .IsNotFound (err ) {
175
- return ctrl.Result {}, err
218
+ return ctrl.Result {}, nil , err
176
219
}
177
220
}
178
221
179
222
// If the SpaceRequest no longer exists, OR if the class has a Retain policy, then there is no more work to do.
180
223
if sr == nil || dtClass .Spec .ReclaimPolicy == applicationv1alpha1 .ReclaimPolicy_Retain {
181
224
if removeFinalizer (& dt , FinalizerDT ) {
182
225
if err := r .Client .Update (ctx , & dt ); err != nil {
183
- return ctrl.Result {}, fmt .Errorf ("failed to remove finalizer %s from DeploymentTarget %s in namespace %s: %v" , FinalizerDT , dt .Name , dt .Namespace , err )
226
+ return ctrl.Result {}, nil , fmt .Errorf ("failed to remove finalizer %s from DeploymentTarget %s in namespace %s: %v" , FinalizerDT , dt .Name , dt .Namespace , err )
184
227
}
185
228
log .Info ("Removed finalizer from DeploymentTarget" , "finalizer" , FinalizerDT )
186
229
}
187
- return ctrl.Result {}, nil
230
+ return ctrl.Result {}, nil , nil
188
231
}
189
232
190
233
if dtClass .Spec .ReclaimPolicy != applicationv1alpha1 .ReclaimPolicy_Delete {
191
234
log .Error (nil , "Unexpected reclaimPolicy: neither Retain nor Delete." )
192
235
193
- // Update Status.Conditions field of DeploymentTarget.
194
- if err := updateStatusConditionOfDeploymentTarget (ctx , r .Client , "unexpected reclaimPolicy: neither Retain nor Delete." ,
195
- & dt , DeploymentTargetConditionTypeErrorOccurred , metav1 .ConditionFalse , DeploymentTargetReasonErrorOccurred , log ); err != nil {
196
- return ctrl.Result {}, fmt .Errorf ("unable to update deployment target status condition. %v" , err )
197
- }
236
+ return ctrl.Result {}, createCondition (DeploymentTargetConditionTypeErrorOccurred , metav1 .ConditionTrue , DeploymentTargetReasonErrorOccurred , "unexpected reclaimPolicy: neither Retain nor Delete." ), nil
198
237
199
- return ctrl.Result {}, nil
200
238
}
201
239
202
240
// The ReclaimPolicy is necessarily equal to 'Delete', from this point on in the function
203
241
204
242
if addFinalizer (sr , codereadytoolchainv1alpha1 .FinalizerName ) {
205
243
if err := r .Client .Update (ctx , sr ); err != nil {
206
- return ctrl.Result {}, fmt .Errorf ("failed to add finalizer %s for SpaceRequest %s in namespace %s: %v" , codereadytoolchainv1alpha1 .FinalizerName , sr .Name , sr .Namespace , err )
244
+ return ctrl.Result {}, nil , fmt .Errorf ("failed to add finalizer %s for SpaceRequest %s in namespace %s: %v" , codereadytoolchainv1alpha1 .FinalizerName , sr .Name , sr .Namespace , err )
207
245
}
208
246
log .Info ("Added finalizer for SpaceRequest" , "finalizer" , codereadytoolchainv1alpha1 .FinalizerName )
209
247
}
@@ -212,13 +250,7 @@ func (r *DeploymentTargetReconciler) Reconcile(ctx context.Context, req ctrl.Req
212
250
var found bool
213
251
if readyCond , found = condition .FindConditionByType (sr .Status .Conditions , codereadytoolchainv1alpha1 .ConditionReady ); ! found {
214
252
215
- // Update Status.Conditions field of DeploymentTarget.
216
- if err := updateStatusConditionOfDeploymentTarget (ctx , r .Client , fmt .Sprint ("failed to find ConditionReady for SpaceRequest: " , sr .Name ),
217
- & dt , DeploymentTargetConditionTypeErrorOccurred , metav1 .ConditionFalse , DeploymentTargetReasonErrorOccurred , log ); err != nil {
218
- return ctrl.Result {}, fmt .Errorf ("unable to update deployment target status condition. %v" , err )
219
- }
220
-
221
- return ctrl.Result {}, fmt .Errorf ("failed to find ConditionReady for SpaceRequest %s from %s" , sr .Name , sr .Namespace )
253
+ return ctrl.Result {}, createCondition (DeploymentTargetConditionTypeErrorOccurred , metav1 .ConditionTrue , DeploymentTargetReasonErrorOccurred , "failed to find ConditionReady for SpaceRequest: " + sr .Name ), nil
222
254
}
223
255
224
256
// Delete the SpaceRequest if it has not been deleted
@@ -227,22 +259,18 @@ func (r *DeploymentTargetReconciler) Reconcile(ctx context.Context, req ctrl.Req
227
259
log .Info ("Deleting SpaceRequest" , "spaceRequest" , sr )
228
260
if err := r .Client .Delete (ctx , sr ); err != nil {
229
261
230
- // Update Status.Conditions field of DeploymentTarget.
231
- if err := updateStatusConditionOfDeploymentTarget (ctx , r .Client , fmt .Sprint ("failed to delete SpaceRequest: " , sr .Name ),
232
- & dt , DeploymentTargetConditionTypeErrorOccurred , metav1 .ConditionFalse , DeploymentTargetReasonErrorOccurred , log ); err != nil {
233
- return ctrl.Result {}, fmt .Errorf ("unable to update deployment target status condition. %v" , err )
234
- }
262
+ log .Error (err , "Failed to delete SpaceRequest" )
235
263
236
- return ctrl.Result {}, err
264
+ return ctrl.Result {}, nil , err
237
265
}
238
266
logutil .LogAPIResourceChangeEvent (sr .Namespace , sr .Name , sr , logutil .ResourceDeleted , log )
239
267
240
- return ctrl.Result {Requeue : true }, nil
268
+ return ctrl.Result {Requeue : true }, nil , nil
241
269
}
242
270
243
271
if dt .Status .Phase == applicationv1alpha1 .DeploymentTargetPhase_Failed {
244
272
// No more work: the DT is already reported as failed
245
- return ctrl.Result {}, nil
273
+ return ctrl.Result {}, nil , nil
246
274
}
247
275
248
276
// Initialize the clock if it isn't already to avoid panic.
@@ -256,16 +284,16 @@ func (r *DeploymentTargetReconciler) Reconcile(ctx context.Context, req ctrl.Req
256
284
257
285
dt .Status .Phase = applicationv1alpha1 .DeploymentTargetPhase_Failed
258
286
if err := r .Client .Status ().Update (ctx , & dt ); err != nil {
259
- return ctrl.Result {}, err
287
+ return ctrl.Result {}, nil , err
260
288
}
261
289
log .Info ("The status of DT is updated to Failed" , "dtName" , dt .Name , "dtNamespace" , dt .Namespace )
262
- return ctrl.Result {}, nil
290
+ return ctrl.Result {}, nil , nil
263
291
}
264
292
265
293
log .Info ("Requeuing DeploymentTarget, since SpaceRequest is still terminating" , "spaceRequestStatusPhase" , dt .Status .Phase , "deletionTimestamp" , sr .GetDeletionTimestamp ())
266
294
267
295
// OTOH, if the SpaceRequest has not timed out yet, then requeue
268
- return ctrl.Result {RequeueAfter : 30 * time .Second }, nil
296
+ return ctrl.Result {RequeueAfter : 30 * time .Second }, nil , nil
269
297
270
298
}
271
299
@@ -378,22 +406,21 @@ func (r *DeploymentTargetReconciler) findDeploymentTargetsForSpaceRequests(sr cl
378
406
379
407
}
380
408
381
- // updateStatusConditionOfDeploymentTarget calls SetCondition() with DeploymentTarget conditions
382
- func updateStatusConditionOfDeploymentTarget (ctx context.Context , k8sClient client.Client ,
383
- message string , deploymentTarget * applicationv1alpha1.DeploymentTarget , conditionType string ,
384
- status metav1.ConditionStatus , reason string , log logr.Logger ) error {
409
+ func createCondition (conditionType string , status metav1.ConditionStatus , reason string , message string ) * metav1.Condition {
385
410
386
- newCondition := metav1.Condition {
411
+ return & metav1.Condition {
387
412
Type : conditionType ,
413
+ Reason : reason ,
388
414
Message : message ,
389
415
Status : status ,
390
- Reason : reason ,
391
416
}
417
+ }
392
418
393
- dt := deploymentTarget
419
+ // updateStatusConditionOfDeploymentTarget calls SetCondition() with DeploymentTarget conditions
420
+ func updateStatusConditionOfDeploymentTarget (ctx context.Context , newCondition metav1.Condition , dt * applicationv1alpha1.DeploymentTarget , k8sClient client.Client , log logr.Logger ) error {
394
421
395
422
if err := k8sClient .Get (ctx , client .ObjectKeyFromObject (dt ), dt ); err != nil {
396
- log .Error (err , "unable to fetch deploymentTargetClaim. " )
423
+ log .Error (err , "unable to fetch deploymentTarget " )
397
424
return nil
398
425
}
399
426
0 commit comments