@@ -39,7 +39,12 @@ use stackable_operator::{
3939 apimachinery:: pkg:: apis:: meta:: v1:: LabelSelector ,
4040 DeepMerge ,
4141 } ,
42- kube:: { api:: DynamicObject , runtime:: controller, Resource } ,
42+ kube:: {
43+ api:: DynamicObject ,
44+ core:: { error_boundary, DeserializeGuard } ,
45+ runtime:: controller,
46+ Resource ,
47+ } ,
4348 kvp:: { Label , LabelError , Labels } ,
4449 logging:: controller:: ReconcilerError ,
4550 product_config_utils:: { transform_all_roles_to_config, validate_all_roles_and_groups_config} ,
@@ -92,6 +97,11 @@ type Result<T, E = Error> = std::result::Result<T, E>;
9297#[ strum_discriminants( derive( IntoStaticStr ) ) ]
9398#[ allow( clippy:: enum_variant_names) ]
9499pub enum Error {
100+ #[ snafu( display( "ZookeeperCluster object is invalid" ) ) ]
101+ InvalidZookeeperCluster {
102+ source : error_boundary:: InvalidObject ,
103+ } ,
104+
95105 #[ snafu( display( "crd validation failure" ) ) ]
96106 CrdValidationFailure {
97107 source : stackable_zookeeper_crd:: Error ,
@@ -272,6 +282,7 @@ impl ReconcilerError for Error {
272282 }
273283 fn secondary_object ( & self ) -> Option < ObjectRef < DynamicObject > > {
274284 match self {
285+ Error :: InvalidZookeeperCluster { source : _ } => None ,
275286 Error :: CrdValidationFailure { .. } => None ,
276287 Error :: NoServerRole => None ,
277288 Error :: RoleParseFailure { .. } => None ,
@@ -312,8 +323,15 @@ impl ReconcilerError for Error {
312323 }
313324}
314325
315- pub async fn reconcile_zk ( zk : Arc < ZookeeperCluster > , ctx : Arc < Ctx > ) -> Result < controller:: Action > {
326+ pub async fn reconcile_zk (
327+ zk : Arc < DeserializeGuard < ZookeeperCluster > > ,
328+ ctx : Arc < Ctx > ,
329+ ) -> Result < controller:: Action > {
316330 tracing:: info!( "Starting reconcile" ) ;
331+ let zk =
332+ zk. 0 . as_ref ( )
333+ . map_err ( error_boundary:: InvalidObject :: clone)
334+ . context ( InvalidZookeeperClusterSnafu ) ?;
317335 let client = & ctx. client ;
318336
319337 let resolved_product_image = zk
@@ -333,7 +351,7 @@ pub async fn reconcile_zk(zk: Arc<ZookeeperCluster>, ctx: Arc<Ctx>) -> Result<co
333351 let validated_config = validate_all_roles_and_groups_config (
334352 & resolved_product_image. app_version_label ,
335353 & transform_all_roles_to_config (
336- zk. as_ref ( ) ,
354+ zk,
337355 [ (
338356 ZookeeperRole :: Server . to_string ( ) ,
339357 (
@@ -359,16 +377,16 @@ pub async fn reconcile_zk(zk: Arc<ZookeeperCluster>, ctx: Arc<Ctx>) -> Result<co
359377 . map ( Cow :: Borrowed )
360378 . unwrap_or_default ( ) ;
361379
362- let vector_aggregator_address = resolve_vector_aggregator_address ( & zk, client)
380+ let vector_aggregator_address = resolve_vector_aggregator_address ( zk, client)
363381 . await
364382 . context ( ResolveVectorAggregatorAddressSnafu ) ?;
365383
366- let zookeeper_security = ZookeeperSecurity :: new_from_zookeeper_cluster ( client, & zk)
384+ let zookeeper_security = ZookeeperSecurity :: new_from_zookeeper_cluster ( client, zk)
367385 . await
368386 . context ( FailedToInitializeSecurityContextSnafu ) ?;
369387
370388 let ( rbac_sa, rbac_rolebinding) = build_rbac_resources (
371- zk. as_ref ( ) ,
389+ zk,
372390 APP_NAME ,
373391 cluster_resources
374392 . get_required_labels ( )
@@ -389,7 +407,7 @@ pub async fn reconcile_zk(zk: Arc<ZookeeperCluster>, ctx: Arc<Ctx>) -> Result<co
389407 let server_role_service = cluster_resources
390408 . add (
391409 client,
392- build_server_role_service ( & zk, & resolved_product_image, & zookeeper_security) ?,
410+ build_server_role_service ( zk, & resolved_product_image, & zookeeper_security) ?,
393411 )
394412 . await
395413 . context ( ApplyRoleServiceSnafu ) ?;
@@ -404,21 +422,21 @@ pub async fn reconcile_zk(zk: Arc<ZookeeperCluster>, ctx: Arc<Ctx>) -> Result<co
404422 . context ( FailedToResolveConfigSnafu ) ?;
405423
406424 let rg_service = build_server_rolegroup_service (
407- & zk,
425+ zk,
408426 & rolegroup,
409427 & resolved_product_image,
410428 & zookeeper_security,
411429 ) ?;
412430 let rg_configmap = build_server_rolegroup_config_map (
413- & zk,
431+ zk,
414432 & rolegroup,
415433 rolegroup_config,
416434 & resolved_product_image,
417435 vector_aggregator_address. as_deref ( ) ,
418436 & zookeeper_security,
419437 ) ?;
420438 let rg_statefulset = build_server_rolegroup_statefulset (
421- & zk,
439+ zk,
422440 & zk_role,
423441 & rolegroup,
424442 rolegroup_config,
@@ -454,7 +472,7 @@ pub async fn reconcile_zk(zk: Arc<ZookeeperCluster>, ctx: Arc<Ctx>) -> Result<co
454472 pod_disruption_budget : pdb,
455473 } ) = role_config
456474 {
457- add_pdbs ( pdb, & zk, & zk_role, client, & mut cluster_resources)
475+ add_pdbs ( pdb, zk, & zk_role, client, & mut cluster_resources)
458476 . await
459477 . context ( FailedToCreatePdbSnafu ) ?;
460478 }
@@ -463,8 +481,8 @@ pub async fn reconcile_zk(zk: Arc<ZookeeperCluster>, ctx: Arc<Ctx>) -> Result<co
463481 // We don't /need/ stability, but it's still nice to avoid spurious changes where possible.
464482 let mut discovery_hash = FnvHasher :: with_key ( 0 ) ;
465483 for discovery_cm in build_discovery_configmaps (
466- & zk,
467- & * zk,
484+ zk,
485+ zk,
468486 client,
469487 ZK_CONTROLLER_NAME ,
470488 & server_role_service,
@@ -491,18 +509,15 @@ pub async fn reconcile_zk(zk: Arc<ZookeeperCluster>, ctx: Arc<Ctx>) -> Result<co
491509 // Serialize as a string to discourage users from trying to parse the value,
492510 // and to keep things flexible if we end up changing the hasher at some point.
493511 discovery_hash : Some ( discovery_hash. finish ( ) . to_string ( ) ) ,
494- conditions : compute_conditions (
495- zk. as_ref ( ) ,
496- & [ & ss_cond_builder, & cluster_operation_cond_builder] ,
497- ) ,
512+ conditions : compute_conditions ( zk, & [ & ss_cond_builder, & cluster_operation_cond_builder] ) ,
498513 } ;
499514
500515 cluster_resources
501516 . delete_orphaned_resources ( client)
502517 . await
503518 . context ( DeleteOrphansSnafu ) ?;
504519 client
505- . apply_patch_status ( OPERATOR_NAME , & * zk, & status)
520+ . apply_patch_status ( OPERATOR_NAME , zk, & status)
506521 . await
507522 . context ( ApplyStatusSnafu ) ?;
508523
@@ -1046,11 +1061,16 @@ fn build_server_rolegroup_statefulset(
10461061}
10471062
10481063pub fn error_policy (
1049- _obj : Arc < ZookeeperCluster > ,
1050- _error : & Error ,
1064+ _obj : Arc < DeserializeGuard < ZookeeperCluster > > ,
1065+ error : & Error ,
10511066 _ctx : Arc < Ctx > ,
10521067) -> controller:: Action {
1053- controller:: Action :: requeue ( * Duration :: from_secs ( 5 ) )
1068+ match error {
1069+ // root object is invalid, will be requeued when modified anyway
1070+ Error :: InvalidZookeeperCluster { .. } => controller:: Action :: await_change ( ) ,
1071+
1072+ _ => controller:: Action :: requeue ( * Duration :: from_secs ( 5 ) ) ,
1073+ }
10541074}
10551075
10561076#[ cfg( test) ]
0 commit comments