@@ -20,6 +20,7 @@ import (
20
20
"reflect"
21
21
"slices"
22
22
"sort"
23
+ "strings"
23
24
24
25
"emperror.dev/errors"
25
26
apiv1 "k8s.io/api/core/v1"
@@ -71,6 +72,7 @@ func (r *RouteReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl
71
72
72
73
if err := handleOwnedResources (ctx , baseManager .GetTenantResourceManager (), tenant ); err != nil {
73
74
tenant .Status .State = state .StateFailed
75
+ tenant .Status .ProblemsCount = len (tenant .Status .Problems )
74
76
baseManager .Error (errors .WithStack (err ), "failed to handle resources owned by tenant" , "tenant" , tenant .Name )
75
77
if updateErr := r .updateStatus (ctx , tenant ); updateErr != nil {
76
78
baseManager .Error (errors .WithStack (updateErr ), "failed updating tenant status" , "tenant" , tenant .Name )
@@ -80,6 +82,7 @@ func (r *RouteReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl
80
82
81
83
if err := handleBridgeResources (ctx , baseManager .GetBridgeManager (), tenant ); err != nil {
82
84
tenant .Status .State = state .StateFailed
85
+ tenant .Status .ProblemsCount = len (tenant .Status .Problems )
83
86
baseManager .Error (errors .WithStack (err ), "failed to handle bridge resources" , "tenant" , tenant .Name )
84
87
if updateErr := r .updateStatus (ctx , tenant ); updateErr != nil {
85
88
baseManager .Error (errors .WithStack (updateErr ), "failed updating tenant status" , "tenant" , tenant .Name )
@@ -98,7 +101,6 @@ func (r *RouteReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl
98
101
return ctrl.Result {}, nil
99
102
}
100
103
101
- baseManager .Info ("tenant reconciliation complete" , "tenant" , tenant .Name )
102
104
return ctrl.Result {}, nil
103
105
}
104
106
@@ -234,26 +236,18 @@ func handleOwnedResources(ctx context.Context, tenantResManager *manager.TenantR
234
236
logsourceNamespacesForTenant , err := tenantResManager .GetLogsourceNamespaceNamesForTenant (ctx , tenant )
235
237
if err != nil {
236
238
tenant .Status .State = state .StateFailed
237
- tenantResManager .Error (errors .WithStack (err ), "failed to get logsource namespaces for tenant" , "tenant" , tenant .Name )
238
- if updateErr := tenantResManager .Status ().Update (ctx , tenant ); updateErr != nil {
239
- tenantResManager .Error (errors .WithStack (updateErr ), "failed updating tenant status" , "tenant" , tenant .Name )
240
- return errors .Append (err , updateErr )
241
- }
242
-
239
+ tenant .Status .Problems = append (tenant .Status .Problems ,
240
+ fmt .Sprintf ("failed to get logsource namespaces for tenant %s: %v" , tenant .Name , err ))
243
241
return err
244
242
}
245
243
slices .Sort (logsourceNamespacesForTenant )
246
244
tenant .Status .LogSourceNamespaces = logsourceNamespacesForTenant
247
245
248
246
subscriptionsForTenant , subscriptionUpdateList , err := tenantResManager .GetResourceOwnedByTenant (ctx , & v1alpha1.Subscription {}, tenant )
249
247
if err != nil {
250
- tenantResManager .Error (errors .WithStack (err ), "failed to get subscriptions for tenant" , "tenant" , tenant .Name )
251
-
252
248
tenant .Status .State = state .StateFailed
253
- if updateErr := tenantResManager .Status ().Update (ctx , tenant ); updateErr != nil {
254
- tenantResManager .Error (errors .WithStack (updateErr ), "failed updating tenant status" , "tenant" , tenant .Name )
255
- return errors .Append (err , updateErr )
256
- }
249
+ tenant .Status .Problems = append (tenant .Status .Problems ,
250
+ fmt .Sprintf ("failed to get subscriptions for tenant %s: %v" , tenant .Name , err ))
257
251
258
252
return err
259
253
}
@@ -262,7 +256,8 @@ func handleOwnedResources(ctx context.Context, tenantResManager *manager.TenantR
262
256
subscriptionsForTenant = append (subscriptionsForTenant , tenantResManager .UpdateResourcesForTenant (ctx , tenant .Name , subscriptionUpdateList )... )
263
257
subscriptionsToDisown , err := tenantResManager .GetResourcesReferencingTenantButNotSelected (ctx , tenant , & v1alpha1.Subscription {}, subscriptionsForTenant )
264
258
if err != nil {
265
- tenantResManager .Error (errors .WithStack (err ), "failed to get subscriptions to disown" , "tenant" , tenant .Name )
259
+ tenant .Status .Problems = append (tenant .Status .Problems ,
260
+ fmt .Sprintf ("failed to get subscriptions to disown for tenant %s: %v" , tenant .Name , err ))
266
261
}
267
262
tenantResManager .DisownResources (ctx , subscriptionsToDisown )
268
263
@@ -273,13 +268,9 @@ func handleOwnedResources(ctx context.Context, tenantResManager *manager.TenantR
273
268
// Check outputs for tenant
274
269
outputsForTenant , outputUpdateList , err := tenantResManager .GetResourceOwnedByTenant (ctx , & v1alpha1.Output {}, tenant )
275
270
if err != nil {
276
- tenantResManager .Error (errors .WithStack (err ), "failed to get outputs for tenant" , "tenant" , tenant .Name )
277
-
278
271
tenant .Status .State = state .StateFailed
279
- if updateErr := tenantResManager .Status ().Update (ctx , tenant ); updateErr != nil {
280
- tenantResManager .Error (errors .WithStack (updateErr ), "failed updating tenant status" , "tenant" , tenant .Name )
281
- return errors .Append (err , updateErr )
282
- }
272
+ tenant .Status .Problems = append (tenant .Status .Problems ,
273
+ fmt .Sprintf ("failed to get outputs for tenant %s: %v" , tenant .Name , err ))
283
274
284
275
return err
285
276
}
@@ -288,7 +279,8 @@ func handleOwnedResources(ctx context.Context, tenantResManager *manager.TenantR
288
279
outputsForTenant = append (outputsForTenant , tenantResManager .UpdateResourcesForTenant (ctx , tenant .Name , outputUpdateList )... )
289
280
outputsToDisown , err := tenantResManager .GetResourcesReferencingTenantButNotSelected (ctx , tenant , & v1alpha1.Output {}, outputsForTenant )
290
281
if err != nil {
291
- tenantResManager .Error (errors .WithStack (err ), "failed to get outputs to disown" , "tenant" , tenant .Name )
282
+ tenant .Status .Problems = append (tenant .Status .Problems ,
283
+ fmt .Sprintf ("failed to get outputs to disown for tenant %s: %v" , tenant .Name , err ))
292
284
}
293
285
tenantResManager .DisownResources (ctx , outputsToDisown )
294
286
@@ -316,11 +308,8 @@ func handleBridgeResources(ctx context.Context, bridgeManager *manager.BridgeMan
316
308
bridgesForTenant , err := bridgeManager .GetBridgesForTenant (ctx , tenant .Name )
317
309
if err != nil {
318
310
tenant .Status .State = state .StateFailed
319
- bridgeManager .Error (errors .WithStack (err ), "failed to get bridges for tenant" , "tenant" , tenant .Name )
320
- if updateErr := bridgeManager .Status ().Update (ctx , tenant ); updateErr != nil {
321
- bridgeManager .Error (errors .WithStack (updateErr ), "failed updating tenant status" , "tenant" , tenant .Name )
322
- return errors .Append (err , updateErr )
323
- }
311
+ tenant .Status .Problems = append (tenant .Status .Problems ,
312
+ fmt .Sprintf ("failed to get bridges for tenant %s: %v" , tenant .Name , err ))
324
313
325
314
return err
326
315
}
@@ -330,15 +319,28 @@ func handleBridgeResources(ctx context.Context, bridgeManager *manager.BridgeMan
330
319
tenant .Status .ConnectedBridges = bridgesForTenantNames
331
320
332
321
for _ , bridge := range bridgesForTenant {
333
- if err := bridgeManager .CheckBridgeConnection (ctx , tenant .Name , & bridge ); err != nil {
322
+ originalBridgeStatus := bridge .Status .DeepCopy ()
323
+ bridge .Status .State = state .StateReady
324
+
325
+ err := bridgeManager .ValidateBridgeConnection (ctx , tenant .Name , & bridge )
326
+ if err != nil {
327
+ errorMsg := fmt .Sprintf ("validation failed for bridge %s: %v" , bridge .Name , err )
334
328
tenant .Status .State = state .StateFailed
335
- bridgeManager .Error (errors .WithStack (err ), "failed to check bridge connection" , "bridge" , bridge .Name )
336
- if updateErr := bridgeManager .Status ().Update (ctx , tenant ); updateErr != nil {
337
- bridgeManager .Error (errors .WithStack (updateErr ), "failed updating tenant status" , "tenant" , tenant .Name )
338
- return errors .Append (err , updateErr )
329
+ tenant .Status .Problems = append (tenant .Status .Problems , errorMsg )
330
+ bridge .Status .State = state .StateFailed
331
+ bridge .Status .Problems = append (bridge .Status .Problems , errorMsg )
332
+ bridge .Status .ProblemsCount = len (bridge .Status .Problems )
333
+ }
334
+
335
+ if ! reflect .DeepEqual (originalBridgeStatus , bridge .Status ) {
336
+ if updateErr := bridgeManager .Status ().Update (ctx , & bridge ); updateErr != nil {
337
+ bridgeManager .Error (errors .WithStack (updateErr ), "failed updating bridge status" , "bridge" , bridge .Name )
338
+ return updateErr
339
339
}
340
+ }
340
341
341
- return err
342
+ if bridge .Status .ProblemsCount > 0 {
343
+ return fmt .Errorf ("bridge %s has problems: %v" , bridge .Name , strings .Join (bridge .Status .Problems , ", " ))
342
344
}
343
345
}
344
346
0 commit comments