@@ -43,6 +43,7 @@ use stackable_operator::{
4343 DeepMerge ,
4444 } ,
4545 kube:: {
46+ core:: { error_boundary, DeserializeGuard } ,
4647 runtime:: { controller:: Action , reflector:: ObjectRef } ,
4748 Resource as KubeResource , ResourceExt ,
4849 } ,
@@ -146,6 +147,11 @@ pub struct Ctx {
146147#[ strum_discriminants( derive( IntoStaticStr ) ) ]
147148#[ allow( clippy:: enum_variant_names) ]
148149pub enum Error {
150+ #[ snafu( display( "OpaCluster object is invalid" ) ) ]
151+ InvalidOpaCluster {
152+ source : error_boundary:: InvalidObject ,
153+ } ,
154+
149155 #[ snafu( display( "object does not define meta name" ) ) ]
150156 NoName ,
151157
@@ -363,9 +369,18 @@ pub struct OpaClusterConfigDecisionLog {
363369 console : bool ,
364370}
365371
366- pub async fn reconcile_opa ( opa : Arc < OpaCluster > , ctx : Arc < Ctx > ) -> Result < Action > {
372+ pub async fn reconcile_opa (
373+ opa : Arc < DeserializeGuard < OpaCluster > > ,
374+ ctx : Arc < Ctx > ,
375+ ) -> Result < Action > {
367376 tracing:: info!( "Starting reconcile" ) ;
368- let opa_ref = ObjectRef :: from_obj ( opa. as_ref ( ) ) ;
377+ let opa = opa
378+ . 0
379+ . as_ref ( )
380+ . map_err ( error_boundary:: InvalidObject :: clone)
381+ . context ( InvalidOpaClusterSnafu ) ?;
382+ let opa_ref = ObjectRef :: from_obj ( opa) ;
383+
369384 let client = & ctx. client ;
370385 let resolved_product_image = opa
371386 . spec
@@ -385,7 +400,7 @@ pub async fn reconcile_opa(opa: Arc<OpaCluster>, ctx: Arc<Ctx>) -> Result<Action
385400 let validated_config = validate_all_roles_and_groups_config (
386401 & resolved_product_image. product_version ,
387402 & transform_all_roles_to_config (
388- opa. as_ref ( ) ,
403+ opa,
389404 [ (
390405 opa_role. to_string ( ) ,
391406 (
@@ -409,11 +424,11 @@ pub async fn reconcile_opa(opa: Arc<OpaCluster>, ctx: Arc<Ctx>) -> Result<Action
409424 . map ( Cow :: Borrowed )
410425 . unwrap_or_default ( ) ;
411426
412- let vector_aggregator_address = resolve_vector_aggregator_address ( & opa, client)
427+ let vector_aggregator_address = resolve_vector_aggregator_address ( opa, client)
413428 . await
414429 . context ( ResolveVectorAggregatorAddressSnafu ) ?;
415430
416- let server_role_service = build_server_role_service ( & opa, & resolved_product_image) ?;
431+ let server_role_service = build_server_role_service ( opa, & resolved_product_image) ?;
417432 // required for discovery config map later
418433 let server_role_service = cluster_resources
419434 . add ( client, server_role_service)
@@ -424,8 +439,8 @@ pub async fn reconcile_opa(opa: Arc<OpaCluster>, ctx: Arc<Ctx>) -> Result<Action
424439 . get_required_labels ( )
425440 . context ( BuildLabelSnafu ) ?;
426441
427- let ( rbac_sa, rbac_rolebinding) = build_rbac_resources ( opa . as_ref ( ) , APP_NAME , required_labels )
428- . context ( BuildRbacResourcesSnafu ) ?;
442+ let ( rbac_sa, rbac_rolebinding) =
443+ build_rbac_resources ( opa , APP_NAME , required_labels ) . context ( BuildRbacResourcesSnafu ) ?;
429444
430445 let rbac_sa = cluster_resources
431446 . add ( client, rbac_sa)
@@ -450,15 +465,15 @@ pub async fn reconcile_opa(opa: Arc<OpaCluster>, ctx: Arc<Ctx>) -> Result<Action
450465 . context ( FailedToResolveConfigSnafu ) ?;
451466
452467 let rg_configmap = build_server_rolegroup_config_map (
453- & opa,
468+ opa,
454469 & resolved_product_image,
455470 & rolegroup,
456471 & merged_config,
457472 vector_aggregator_address. as_deref ( ) ,
458473 ) ?;
459- let rg_service = build_rolegroup_service ( & opa, & resolved_product_image, & rolegroup) ?;
474+ let rg_service = build_rolegroup_service ( opa, & resolved_product_image, & rolegroup) ?;
460475 let rg_daemonset = build_server_rolegroup_daemonset (
461- & opa,
476+ opa,
462477 & resolved_product_image,
463478 & opa_role,
464479 & rolegroup,
@@ -512,13 +527,9 @@ pub async fn reconcile_opa(opa: Arc<OpaCluster>, ctx: Arc<Ctx>) -> Result<Action
512527 . context ( ApplyPatchRoleGroupDaemonSetSnafu { rolegroup } ) ?;
513528 }
514529
515- for discovery_cm in build_discovery_configmaps (
516- opa. as_ref ( ) ,
517- opa. as_ref ( ) ,
518- & resolved_product_image,
519- & server_role_service,
520- )
521- . context ( BuildDiscoveryConfigSnafu ) ?
530+ for discovery_cm in
531+ build_discovery_configmaps ( opa, opa, & resolved_product_image, & server_role_service)
532+ . context ( BuildDiscoveryConfigSnafu ) ?
522533 {
523534 cluster_resources
524535 . add ( client, discovery_cm)
@@ -530,14 +541,11 @@ pub async fn reconcile_opa(opa: Arc<OpaCluster>, ctx: Arc<Ctx>) -> Result<Action
530541 ClusterOperationsConditionBuilder :: new ( & opa. spec . cluster_operation ) ;
531542
532543 let status = OpaClusterStatus {
533- conditions : compute_conditions (
534- opa. as_ref ( ) ,
535- & [ & ds_cond_builder, & cluster_operation_cond_builder] ,
536- ) ,
544+ conditions : compute_conditions ( opa, & [ & ds_cond_builder, & cluster_operation_cond_builder] ) ,
537545 } ;
538546
539547 client
540- . apply_patch_status ( OPERATOR_NAME , & * opa, & status)
548+ . apply_patch_status ( OPERATOR_NAME , opa, & status)
541549 . await
542550 . context ( ApplyStatusSnafu ) ?;
543551
@@ -1026,8 +1034,17 @@ fn build_server_rolegroup_daemonset(
10261034 } )
10271035}
10281036
1029- pub fn error_policy ( _obj : Arc < OpaCluster > , _error : & Error , _ctx : Arc < Ctx > ) -> Action {
1030- Action :: requeue ( * Duration :: from_secs ( 5 ) )
1037+ pub fn error_policy (
1038+ _obj : Arc < DeserializeGuard < OpaCluster > > ,
1039+ error : & Error ,
1040+ _ctx : Arc < Ctx > ,
1041+ ) -> Action {
1042+ match error {
1043+ // root object is invalid, will be requeued when modified anyway
1044+ Error :: InvalidOpaCluster { .. } => Action :: await_change ( ) ,
1045+
1046+ _ => Action :: requeue ( * Duration :: from_secs ( 10 ) ) ,
1047+ }
10311048}
10321049
10331050fn build_config_file ( merged_config : & OpaConfig ) -> String {
0 commit comments