@@ -38,7 +38,12 @@ use stackable_operator::{
38
38
apimachinery:: pkg:: apis:: meta:: v1:: LabelSelector ,
39
39
DeepMerge ,
40
40
} ,
41
- kube:: { api:: DynamicObject , runtime:: controller, Resource } ,
41
+ kube:: {
42
+ api:: DynamicObject ,
43
+ core:: { error_boundary, DeserializeGuard } ,
44
+ runtime:: controller,
45
+ Resource ,
46
+ } ,
42
47
kvp:: { Label , LabelError , Labels } ,
43
48
logging:: controller:: ReconcilerError ,
44
49
product_config_utils:: { transform_all_roles_to_config, validate_all_roles_and_groups_config} ,
@@ -89,6 +94,11 @@ type Result<T, E = Error> = std::result::Result<T, E>;
89
94
#[ strum_discriminants( derive( IntoStaticStr ) ) ]
90
95
#[ allow( clippy:: enum_variant_names) ]
91
96
pub enum Error {
97
+ #[ snafu( display( "ZookeeperCluster object is invalid" ) ) ]
98
+ InvalidZookeeperCluster {
99
+ source : error_boundary:: InvalidObject ,
100
+ } ,
101
+
92
102
#[ snafu( display( "crd validation failure" ) ) ]
93
103
CrdValidationFailure {
94
104
source : stackable_zookeeper_crd:: Error ,
@@ -253,6 +263,7 @@ impl ReconcilerError for Error {
253
263
}
254
264
fn secondary_object ( & self ) -> Option < ObjectRef < DynamicObject > > {
255
265
match self {
266
+ Error :: InvalidZookeeperCluster { source : _ } => None ,
256
267
Error :: CrdValidationFailure { .. } => None ,
257
268
Error :: NoServerRole => None ,
258
269
Error :: RoleParseFailure { .. } => None ,
@@ -289,8 +300,15 @@ impl ReconcilerError for Error {
289
300
}
290
301
}
291
302
292
- pub async fn reconcile_zk ( zk : Arc < ZookeeperCluster > , ctx : Arc < Ctx > ) -> Result < controller:: Action > {
303
+ pub async fn reconcile_zk (
304
+ zk : Arc < DeserializeGuard < ZookeeperCluster > > ,
305
+ ctx : Arc < Ctx > ,
306
+ ) -> Result < controller:: Action > {
293
307
tracing:: info!( "Starting reconcile" ) ;
308
+ let zk =
309
+ zk. 0 . as_ref ( )
310
+ . map_err ( error_boundary:: InvalidObject :: clone)
311
+ . context ( InvalidZookeeperClusterSnafu ) ?;
294
312
let client = & ctx. client ;
295
313
296
314
let resolved_product_image = zk
@@ -310,7 +328,7 @@ pub async fn reconcile_zk(zk: Arc<ZookeeperCluster>, ctx: Arc<Ctx>) -> Result<co
310
328
let validated_config = validate_all_roles_and_groups_config (
311
329
& resolved_product_image. app_version_label ,
312
330
& transform_all_roles_to_config (
313
- zk. as_ref ( ) ,
331
+ zk,
314
332
[ (
315
333
ZookeeperRole :: Server . to_string ( ) ,
316
334
(
@@ -336,16 +354,16 @@ pub async fn reconcile_zk(zk: Arc<ZookeeperCluster>, ctx: Arc<Ctx>) -> Result<co
336
354
. map ( Cow :: Borrowed )
337
355
. unwrap_or_default ( ) ;
338
356
339
- let vector_aggregator_address = resolve_vector_aggregator_address ( & zk, client)
357
+ let vector_aggregator_address = resolve_vector_aggregator_address ( zk, client)
340
358
. await
341
359
. context ( ResolveVectorAggregatorAddressSnafu ) ?;
342
360
343
- let zookeeper_security = ZookeeperSecurity :: new_from_zookeeper_cluster ( client, & zk)
361
+ let zookeeper_security = ZookeeperSecurity :: new_from_zookeeper_cluster ( client, zk)
344
362
. await
345
363
. context ( FailedToInitializeSecurityContextSnafu ) ?;
346
364
347
365
let ( rbac_sa, rbac_rolebinding) = build_rbac_resources (
348
- zk. as_ref ( ) ,
366
+ zk,
349
367
APP_NAME ,
350
368
cluster_resources
351
369
. get_required_labels ( )
@@ -366,7 +384,7 @@ pub async fn reconcile_zk(zk: Arc<ZookeeperCluster>, ctx: Arc<Ctx>) -> Result<co
366
384
let server_role_service = cluster_resources
367
385
. add (
368
386
client,
369
- build_server_role_service ( & zk, & resolved_product_image, & zookeeper_security) ?,
387
+ build_server_role_service ( zk, & resolved_product_image, & zookeeper_security) ?,
370
388
)
371
389
. await
372
390
. context ( ApplyRoleServiceSnafu ) ?;
@@ -381,21 +399,21 @@ pub async fn reconcile_zk(zk: Arc<ZookeeperCluster>, ctx: Arc<Ctx>) -> Result<co
381
399
. context ( FailedToResolveConfigSnafu ) ?;
382
400
383
401
let rg_service = build_server_rolegroup_service (
384
- & zk,
402
+ zk,
385
403
& rolegroup,
386
404
& resolved_product_image,
387
405
& zookeeper_security,
388
406
) ?;
389
407
let rg_configmap = build_server_rolegroup_config_map (
390
- & zk,
408
+ zk,
391
409
& rolegroup,
392
410
rolegroup_config,
393
411
& resolved_product_image,
394
412
vector_aggregator_address. as_deref ( ) ,
395
413
& zookeeper_security,
396
414
) ?;
397
415
let rg_statefulset = build_server_rolegroup_statefulset (
398
- & zk,
416
+ zk,
399
417
& zk_role,
400
418
& rolegroup,
401
419
rolegroup_config,
@@ -431,7 +449,7 @@ pub async fn reconcile_zk(zk: Arc<ZookeeperCluster>, ctx: Arc<Ctx>) -> Result<co
431
449
pod_disruption_budget : pdb,
432
450
} ) = role_config
433
451
{
434
- add_pdbs ( pdb, & zk, & zk_role, client, & mut cluster_resources)
452
+ add_pdbs ( pdb, zk, & zk_role, client, & mut cluster_resources)
435
453
. await
436
454
. context ( FailedToCreatePdbSnafu ) ?;
437
455
}
@@ -440,8 +458,8 @@ pub async fn reconcile_zk(zk: Arc<ZookeeperCluster>, ctx: Arc<Ctx>) -> Result<co
440
458
// We don't /need/ stability, but it's still nice to avoid spurious changes where possible.
441
459
let mut discovery_hash = FnvHasher :: with_key ( 0 ) ;
442
460
for discovery_cm in build_discovery_configmaps (
443
- & zk,
444
- & * zk,
461
+ zk,
462
+ zk,
445
463
client,
446
464
ZK_CONTROLLER_NAME ,
447
465
& server_role_service,
@@ -468,18 +486,15 @@ pub async fn reconcile_zk(zk: Arc<ZookeeperCluster>, ctx: Arc<Ctx>) -> Result<co
468
486
// Serialize as a string to discourage users from trying to parse the value,
469
487
// and to keep things flexible if we end up changing the hasher at some point.
470
488
discovery_hash : Some ( discovery_hash. finish ( ) . to_string ( ) ) ,
471
- conditions : compute_conditions (
472
- zk. as_ref ( ) ,
473
- & [ & ss_cond_builder, & cluster_operation_cond_builder] ,
474
- ) ,
489
+ conditions : compute_conditions ( zk, & [ & ss_cond_builder, & cluster_operation_cond_builder] ) ,
475
490
} ;
476
491
477
492
cluster_resources
478
493
. delete_orphaned_resources ( client)
479
494
. await
480
495
. context ( DeleteOrphansSnafu ) ?;
481
496
client
482
- . apply_patch_status ( OPERATOR_NAME , & * zk, & status)
497
+ . apply_patch_status ( OPERATOR_NAME , zk, & status)
483
498
. await
484
499
. context ( ApplyStatusSnafu ) ?;
485
500
@@ -1004,11 +1019,16 @@ fn build_server_rolegroup_statefulset(
1004
1019
}
1005
1020
1006
1021
pub fn error_policy (
1007
- _obj : Arc < ZookeeperCluster > ,
1008
- _error : & Error ,
1022
+ _obj : Arc < DeserializeGuard < ZookeeperCluster > > ,
1023
+ error : & Error ,
1009
1024
_ctx : Arc < Ctx > ,
1010
1025
) -> controller:: Action {
1011
- controller:: Action :: requeue ( * Duration :: from_secs ( 5 ) )
1026
+ match error {
1027
+ // root object is invalid, will be requeued when modified anyway
1028
+ Error :: InvalidZookeeperCluster { .. } => controller:: Action :: await_change ( ) ,
1029
+
1030
+ _ => controller:: Action :: requeue ( * Duration :: from_secs ( 5 ) ) ,
1031
+ }
1012
1032
}
1013
1033
1014
1034
#[ cfg( test) ]
0 commit comments