@@ -38,7 +38,12 @@ use stackable_operator::{
3838 apimachinery:: pkg:: apis:: meta:: v1:: LabelSelector ,
3939 DeepMerge ,
4040 } ,
41- kube:: { api:: DynamicObject , runtime:: controller, Resource } ,
41+ kube:: {
42+ api:: DynamicObject ,
43+ core:: { error_boundary, DeserializeGuard } ,
44+ runtime:: controller,
45+ Resource ,
46+ } ,
4247 kvp:: { Label , LabelError , Labels } ,
4348 logging:: controller:: ReconcilerError ,
4449 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>;
8994#[ strum_discriminants( derive( IntoStaticStr ) ) ]
9095#[ allow( clippy:: enum_variant_names) ]
9196pub enum Error {
97+ #[ snafu( display( "ZookeeperCluster object is invalid" ) ) ]
98+ InvalidZookeeperCluster {
99+ source : error_boundary:: InvalidObject ,
100+ } ,
101+
92102 #[ snafu( display( "crd validation failure" ) ) ]
93103 CrdValidationFailure {
94104 source : stackable_zookeeper_crd:: Error ,
@@ -253,6 +263,7 @@ impl ReconcilerError for Error {
253263 }
254264 fn secondary_object ( & self ) -> Option < ObjectRef < DynamicObject > > {
255265 match self {
266+ Error :: InvalidZookeeperCluster { source : _ } => None ,
256267 Error :: CrdValidationFailure { .. } => None ,
257268 Error :: NoServerRole => None ,
258269 Error :: RoleParseFailure { .. } => None ,
@@ -289,8 +300,15 @@ impl ReconcilerError for Error {
289300 }
290301}
291302
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 > {
293307 tracing:: info!( "Starting reconcile" ) ;
308+ let zk =
309+ zk. 0 . as_ref ( )
310+ . map_err ( error_boundary:: InvalidObject :: clone)
311+ . context ( InvalidZookeeperClusterSnafu ) ?;
294312 let client = & ctx. client ;
295313
296314 let resolved_product_image = zk
@@ -310,7 +328,7 @@ pub async fn reconcile_zk(zk: Arc<ZookeeperCluster>, ctx: Arc<Ctx>) -> Result<co
310328 let validated_config = validate_all_roles_and_groups_config (
311329 & resolved_product_image. app_version_label ,
312330 & transform_all_roles_to_config (
313- zk. as_ref ( ) ,
331+ zk,
314332 [ (
315333 ZookeeperRole :: Server . to_string ( ) ,
316334 (
@@ -336,16 +354,16 @@ pub async fn reconcile_zk(zk: Arc<ZookeeperCluster>, ctx: Arc<Ctx>) -> Result<co
336354 . map ( Cow :: Borrowed )
337355 . unwrap_or_default ( ) ;
338356
339- let vector_aggregator_address = resolve_vector_aggregator_address ( & zk, client)
357+ let vector_aggregator_address = resolve_vector_aggregator_address ( zk, client)
340358 . await
341359 . context ( ResolveVectorAggregatorAddressSnafu ) ?;
342360
343- let zookeeper_security = ZookeeperSecurity :: new_from_zookeeper_cluster ( client, & zk)
361+ let zookeeper_security = ZookeeperSecurity :: new_from_zookeeper_cluster ( client, zk)
344362 . await
345363 . context ( FailedToInitializeSecurityContextSnafu ) ?;
346364
347365 let ( rbac_sa, rbac_rolebinding) = build_rbac_resources (
348- zk. as_ref ( ) ,
366+ zk,
349367 APP_NAME ,
350368 cluster_resources
351369 . get_required_labels ( )
@@ -366,7 +384,7 @@ pub async fn reconcile_zk(zk: Arc<ZookeeperCluster>, ctx: Arc<Ctx>) -> Result<co
366384 let server_role_service = cluster_resources
367385 . add (
368386 client,
369- build_server_role_service ( & zk, & resolved_product_image, & zookeeper_security) ?,
387+ build_server_role_service ( zk, & resolved_product_image, & zookeeper_security) ?,
370388 )
371389 . await
372390 . context ( ApplyRoleServiceSnafu ) ?;
@@ -381,21 +399,21 @@ pub async fn reconcile_zk(zk: Arc<ZookeeperCluster>, ctx: Arc<Ctx>) -> Result<co
381399 . context ( FailedToResolveConfigSnafu ) ?;
382400
383401 let rg_service = build_server_rolegroup_service (
384- & zk,
402+ zk,
385403 & rolegroup,
386404 & resolved_product_image,
387405 & zookeeper_security,
388406 ) ?;
389407 let rg_configmap = build_server_rolegroup_config_map (
390- & zk,
408+ zk,
391409 & rolegroup,
392410 rolegroup_config,
393411 & resolved_product_image,
394412 vector_aggregator_address. as_deref ( ) ,
395413 & zookeeper_security,
396414 ) ?;
397415 let rg_statefulset = build_server_rolegroup_statefulset (
398- & zk,
416+ zk,
399417 & zk_role,
400418 & rolegroup,
401419 rolegroup_config,
@@ -431,7 +449,7 @@ pub async fn reconcile_zk(zk: Arc<ZookeeperCluster>, ctx: Arc<Ctx>) -> Result<co
431449 pod_disruption_budget : pdb,
432450 } ) = role_config
433451 {
434- add_pdbs ( pdb, & zk, & zk_role, client, & mut cluster_resources)
452+ add_pdbs ( pdb, zk, & zk_role, client, & mut cluster_resources)
435453 . await
436454 . context ( FailedToCreatePdbSnafu ) ?;
437455 }
@@ -440,8 +458,8 @@ pub async fn reconcile_zk(zk: Arc<ZookeeperCluster>, ctx: Arc<Ctx>) -> Result<co
440458 // We don't /need/ stability, but it's still nice to avoid spurious changes where possible.
441459 let mut discovery_hash = FnvHasher :: with_key ( 0 ) ;
442460 for discovery_cm in build_discovery_configmaps (
443- & zk,
444- & * zk,
461+ zk,
462+ zk,
445463 client,
446464 ZK_CONTROLLER_NAME ,
447465 & server_role_service,
@@ -468,18 +486,15 @@ pub async fn reconcile_zk(zk: Arc<ZookeeperCluster>, ctx: Arc<Ctx>) -> Result<co
468486 // Serialize as a string to discourage users from trying to parse the value,
469487 // and to keep things flexible if we end up changing the hasher at some point.
470488 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] ) ,
475490 } ;
476491
477492 cluster_resources
478493 . delete_orphaned_resources ( client)
479494 . await
480495 . context ( DeleteOrphansSnafu ) ?;
481496 client
482- . apply_patch_status ( OPERATOR_NAME , & * zk, & status)
497+ . apply_patch_status ( OPERATOR_NAME , zk, & status)
483498 . await
484499 . context ( ApplyStatusSnafu ) ?;
485500
@@ -1004,11 +1019,16 @@ fn build_server_rolegroup_statefulset(
10041019}
10051020
10061021pub fn error_policy (
1007- _obj : Arc < ZookeeperCluster > ,
1008- _error : & Error ,
1022+ _obj : Arc < DeserializeGuard < ZookeeperCluster > > ,
1023+ error : & Error ,
10091024 _ctx : Arc < Ctx > ,
10101025) -> 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+ }
10121032}
10131033
10141034#[ cfg( test) ]
0 commit comments