@@ -52,7 +52,7 @@ const (
52
52
)
53
53
54
54
type eventRecorder interface {
55
- Event (object runtime.Object , eventtype , reason , message string )
55
+ Event (object runtime.Object , eventType , reason , message string )
56
56
}
57
57
58
58
// GitOpsSetReconciler reconciles a GitOpsSet object
@@ -76,12 +76,12 @@ func (r *GitOpsSetReconciler) event(obj *templatesv1.GitOpsSet, severity, msg st
76
76
reason = severity
77
77
}
78
78
79
- eventtype := "Normal"
79
+ eventType := "Normal"
80
80
if severity == eventv1 .EventSeverityError {
81
- eventtype = "Error"
81
+ eventType = "Error"
82
82
}
83
83
84
- r .EventRecorder .Event (obj , eventtype , reason , msg )
84
+ r .EventRecorder .Event (obj , eventType , reason , msg )
85
85
}
86
86
87
87
//+kubebuilder:rbac:groups=templates.weave.works,resources=gitopssets,verbs=get;list;watch;create;update;patch;delete
@@ -167,15 +167,16 @@ func (r *GitOpsSetReconciler) Reconcile(ctx context.Context, req ctrl.Request) (
167
167
if err != nil {
168
168
// We can return here because when the resource artifact is updated, this
169
169
// will trigger a reconciliation.
170
+
170
171
if errors .As (err , & generators.NoArtifactError {}) {
171
- templatesv1 .SetGitOpsSetReadiness (& gitOpsSet , metav1 .ConditionFalse , templatesv1 .ReconciliationFailedReason , "waiting for artifact" )
172
+ templatesv1 .SetGitOpsSetReadiness (& gitOpsSet , inventory , metav1 .ConditionFalse , templatesv1 .ReconciliationFailedReason , "waiting for artifact" )
172
173
if err := r .patchStatus (ctx , req , gitOpsSet .Status ); err != nil {
173
174
logger .Error (err , "failed to reconcile" )
174
175
}
175
176
return ctrl.Result {}, nil
176
177
}
177
178
178
- templatesv1 .SetGitOpsSetReadiness (& gitOpsSet , metav1 .ConditionFalse , templatesv1 .ReconciliationFailedReason , err .Error ())
179
+ templatesv1 .SetGitOpsSetReadiness (& gitOpsSet , inventory , metav1 .ConditionFalse , templatesv1 .ReconciliationFailedReason , err .Error ())
179
180
if err := r .patchStatus (ctx , req , gitOpsSet .Status ); err != nil {
180
181
logger .Error (err , "failed to reconcile" )
181
182
}
@@ -186,14 +187,15 @@ func (r *GitOpsSetReconciler) Reconcile(ctx context.Context, req ctrl.Request) (
186
187
}
187
188
188
189
if inventory != nil {
189
- templatesv1 .SetReadyWithInventory (& gitOpsSet , inventory , templatesv1 .ReconciliationSucceededReason ,
190
+ templatesv1 .SetGitOpsSetReadiness (& gitOpsSet , inventory , metav1 . ConditionTrue , templatesv1 .ReconciliationSucceededReason ,
190
191
fmt .Sprintf ("%d resources created" , len (inventory .Entries )))
191
192
192
193
if err := r .patchStatus (ctx , req , gitOpsSet .Status ); err != nil {
193
- templatesv1 .SetGitOpsSetReadiness (& gitOpsSet , metav1 .ConditionFalse , templatesv1 .ReconciliationFailedReason , err .Error ())
194
194
logger .Error (err , "failed to reconcile" )
195
+ templatesv1 .SetGitOpsSetReadiness (& gitOpsSet , inventory , metav1 .ConditionFalse , templatesv1 .ReconciliationFailedReason , err .Error ())
195
196
msg := "Status and inventory update failed after reconciliation"
196
197
r .event (& gitOpsSet , eventv1 .EventSeverityError , msg )
198
+
197
199
return ctrl.Result {}, fmt .Errorf ("failed to update status and inventory: %w" , err )
198
200
}
199
201
}
@@ -210,12 +212,12 @@ func (r *GitOpsSetReconciler) reconcileResources(ctx context.Context, k8sClient
210
212
211
213
inventory , err := r .renderAndReconcile (ctx , logger , k8sClient , gitOpsSet , instantiatedGenerators )
212
214
if err != nil {
213
- return nil , generators .NoRequeueInterval , err
215
+ return inventory , generators .NoRequeueInterval , err
214
216
}
215
217
216
218
requeueAfter , err := calculateInterval (gitOpsSet , instantiatedGenerators )
217
219
if err != nil {
218
- return nil , generators .NoRequeueInterval , fmt .Errorf ("failed to calculate requeue interval: %w" , err )
220
+ return inventory , generators .NoRequeueInterval , fmt .Errorf ("failed to calculate requeue interval: %w" , err )
219
221
}
220
222
221
223
return inventory , requeueAfter , nil
@@ -228,6 +230,8 @@ func (r *GitOpsSetReconciler) renderAndReconcile(ctx context.Context, logger log
228
230
}
229
231
logger .Info ("rendered templates" , "resourceCount" , len (resources ))
230
232
233
+ var inventoryErr error
234
+
231
235
existingEntries := sets .New [templatesv1.ResourceRef ]()
232
236
if gitOpsSet .Status .Inventory != nil {
233
237
existingEntries .Insert (gitOpsSet .Status .Inventory .Entries ... )
@@ -237,52 +241,65 @@ func (r *GitOpsSetReconciler) renderAndReconcile(ctx context.Context, logger log
237
241
for _ , newResource := range resources {
238
242
ref , err := templatesv1 .ResourceRefFromObject (newResource )
239
243
if err != nil {
240
- return nil , fmt .Errorf ("failed to update inventory: %w" , err )
244
+ inventoryErr = errors .Join (inventoryErr , fmt .Errorf ("failed to update inventory: %w" , err ))
245
+ continue
241
246
}
242
- entries .Insert (ref )
243
247
244
248
if existingEntries .Has (ref ) {
245
249
existing , err := unstructuredFromResourceRef (ref )
246
250
if err != nil {
247
- return nil , fmt .Errorf ("failed to convert resource for update: %w" , err )
251
+ inventoryErr = errors .Join (inventoryErr , fmt .Errorf ("failed to convert resource for update: %w" , err ))
252
+ continue
248
253
}
254
+ // We can add the entry because we know it exists
255
+ entries .Insert (ref )
249
256
err = k8sClient .Get (ctx , client .ObjectKeyFromObject (newResource ), existing )
250
257
if err == nil {
251
258
newResource = copyUnstructuredContent (existing , newResource )
252
259
if err := k8sClient .Patch (ctx , newResource , client .MergeFrom (existing )); err != nil {
253
- return nil , fmt .Errorf ("failed to update Resource: %w" , err )
260
+ inventoryErr = errors . Join ( inventoryErr , fmt .Errorf ("failed to update Resource: %w" , err ) )
254
261
}
255
262
continue
256
263
}
257
264
258
265
if ! apierrors .IsNotFound (err ) {
259
- return nil , fmt .Errorf ("failed to load existing Resource: %w" , err )
266
+ inventoryErr = errors .Join (inventoryErr , fmt .Errorf ("failed to load existing Resource: %w" , err ))
267
+ continue
260
268
}
261
269
}
262
270
263
271
if err := logResourceMessage (logger , "creating new resource" , newResource ); err != nil {
264
- return nil , err
272
+ inventoryErr = errors .Join (inventoryErr , err )
273
+ continue
265
274
}
266
275
267
276
if err := k8sClient .Create (ctx , newResource ); err != nil {
268
- return nil , fmt .Errorf ("failed to create Resource: %w" , err )
277
+ inventoryErr = errors .Join (inventoryErr , fmt .Errorf ("failed to create Resource: %w" , err ))
278
+ if apierrors .IsAlreadyExists (err ) {
279
+ if err := logResourceMessage (logger , "resource already exists" , newResource ); err != nil {
280
+ inventoryErr = errors .Join (inventoryErr , err )
281
+ }
282
+ }
283
+ continue
269
284
}
285
+
286
+ entries .Insert (ref )
270
287
}
271
288
272
289
if gitOpsSet .Status .Inventory == nil {
273
290
return & templatesv1.ResourceInventory {Entries : entries .SortedList (func (x , y templatesv1.ResourceRef ) bool {
274
291
return x .ID < y .ID
275
- })}, nil
292
+ })}, inventoryErr
276
293
277
294
}
278
295
objectsToRemove := existingEntries .Difference (entries )
279
296
if err := r .removeResourceRefs (ctx , k8sClient , objectsToRemove .List ()); err != nil {
280
- return nil , err
297
+ inventoryErr = errors . Join ( inventoryErr , err )
281
298
}
282
299
283
300
return & templatesv1.ResourceInventory {Entries : entries .SortedList (func (x , y templatesv1.ResourceRef ) bool {
284
301
return x .ID < y .ID
285
- })}, nil
302
+ })}, inventoryErr
286
303
}
287
304
288
305
func (r * GitOpsSetReconciler ) patchStatus (ctx context.Context , req ctrl.Request , newStatus templatesv1.GitOpsSetStatus ) error {
0 commit comments