@@ -12,8 +12,8 @@ use stackable_operator::k8s_openapi::api::core::v1::{
1212 ConfigMap , EnvFromSource , EnvVar , PodSpec , Secret , Volume ,
1313} ;
1414use stackable_operator:: kube;
15- use stackable_operator:: kube:: api:: { Patch , PatchParams } ;
16- use stackable_operator:: kube:: core:: DynamicObject ;
15+ use stackable_operator:: kube:: api:: { PartialObjectMeta , Patch , PatchParams } ;
16+ use stackable_operator:: kube:: core:: { error_boundary , DeserializeGuard , DynamicObject } ;
1717use stackable_operator:: kube:: runtime:: controller:: {
1818 trigger_self, trigger_with, Action , ReconcileRequest ,
1919} ;
@@ -26,15 +26,20 @@ use strum::{EnumDiscriminants, IntoStaticStr};
2626
2727struct Ctx {
2828 kube : kube:: Client ,
29- cms : Store < ConfigMap > ,
29+ cms : Store < PartialObjectMeta < ConfigMap > > ,
3030 cms_inited : Arc < AtomicBool > ,
31- secrets : Store < Secret > ,
31+ secrets : Store < PartialObjectMeta < Secret > > ,
3232 secrets_inited : Arc < AtomicBool > ,
3333}
3434
3535#[ derive( Snafu , Debug , EnumDiscriminants ) ]
3636#[ strum_discriminants( derive( IntoStaticStr ) ) ]
3737enum Error {
38+ #[ snafu( display( "StatefulSet object is invalid" ) ) ]
39+ InvalidStatefulSet {
40+ source : error_boundary:: InvalidObject ,
41+ } ,
42+
3843 #[ snafu( display( "failed to patch object {obj_ref}" ) ) ]
3944 PatchFailed {
4045 source : kube:: Error ,
@@ -55,6 +60,7 @@ impl ReconcilerError for Error {
5560
5661 fn secondary_object ( & self ) -> Option < ObjectRef < DynamicObject > > {
5762 match self {
63+ Error :: InvalidStatefulSet { source : _ } => None ,
5864 Error :: PatchFailed { obj_ref, .. } => Some ( * obj_ref. clone ( ) ) ,
5965 Error :: ConfigMapsUninitialized => None ,
6066 Error :: SecretsUninitialized => None ,
@@ -63,10 +69,10 @@ impl ReconcilerError for Error {
6369}
6470
6571pub async fn start ( client : & Client , watch_namespace : & WatchNamespace ) {
66- let stses = watch_namespace. get_api :: < StatefulSet > ( client) ;
67- let cms = watch_namespace. get_api :: < ConfigMap > ( client) ;
68- let secrets = watch_namespace. get_api :: < Secret > ( client) ;
69- let sts_store = reflector:: store:: Writer :: new ( ( ) ) ;
72+ let stses = watch_namespace. get_api :: < DeserializeGuard < StatefulSet > > ( client) ;
73+ let cms = watch_namespace. get_api :: < PartialObjectMeta < ConfigMap > > ( client) ;
74+ let secrets = watch_namespace. get_api :: < PartialObjectMeta < Secret > > ( client) ;
75+ let sts_store = reflector:: store:: Writer :: < DeserializeGuard < StatefulSet > > :: new ( ( ) ) ;
7076 let cm_store = reflector:: store:: Writer :: new ( ( ) ) ;
7177 let secret_store = reflector:: store:: Writer :: new ( ( ) ) ;
7278 let cms_inited = Arc :: new ( AtomicBool :: from ( false ) ) ;
@@ -161,7 +167,17 @@ fn find_pod_refs<'a, K: Resource + 'a>(
161167 . chain ( container_env_from_refs)
162168}
163169
164- async fn reconcile ( sts : Arc < StatefulSet > , ctx : Arc < Ctx > ) -> Result < Action , Error > {
170+ async fn reconcile (
171+ sts : Arc < DeserializeGuard < StatefulSet > > ,
172+ ctx : Arc < Ctx > ,
173+ ) -> Result < Action , Error > {
174+ tracing:: info!( "Starting reconcile" ) ;
175+ let sts = sts
176+ . 0
177+ . as_ref ( )
178+ . map_err ( error_boundary:: InvalidObject :: clone)
179+ . context ( InvalidStatefulSetSnafu ) ?;
180+
165181 if !ctx. cms_inited . load ( std:: sync:: atomic:: Ordering :: SeqCst ) {
166182 return ConfigMapsUninitializedSnafu . fail ( ) ;
167183 }
@@ -181,12 +197,12 @@ async fn reconcile(sts: Arc<StatefulSet>, ctx: Arc<Ctx>) -> Result<Action, Error
181197 find_pod_refs (
182198 pod_spec,
183199 |volume| {
184- Some ( ObjectRef :: < ConfigMap > :: new (
200+ Some ( ObjectRef :: < PartialObjectMeta < ConfigMap > > :: new (
185201 & volume. config_map . as_ref ( ) ?. name ,
186202 ) )
187203 } ,
188204 |env_var| {
189- Some ( ObjectRef :: < ConfigMap > :: new (
205+ Some ( ObjectRef :: < PartialObjectMeta < ConfigMap > > :: new (
190206 & env_var
191207 . value_from
192208 . as_ref ( ) ?
@@ -196,7 +212,7 @@ async fn reconcile(sts: Arc<StatefulSet>, ctx: Arc<Ctx>) -> Result<Action, Error
196212 ) )
197213 } ,
198214 |env_from| {
199- Some ( ObjectRef :: < ConfigMap > :: new (
215+ Some ( ObjectRef :: < PartialObjectMeta < ConfigMap > > :: new (
200216 & env_from. config_map_ref . as_ref ( ) ?. name ,
201217 ) )
202218 } ,
@@ -225,17 +241,17 @@ async fn reconcile(sts: Arc<StatefulSet>, ctx: Arc<Ctx>) -> Result<Action, Error
225241 find_pod_refs (
226242 pod_spec,
227243 |volume| {
228- Some ( ObjectRef :: < Secret > :: new (
244+ Some ( ObjectRef :: < PartialObjectMeta < Secret > > :: new (
229245 volume. secret . as_ref ( ) ?. secret_name . as_deref ( ) ?,
230246 ) )
231247 } ,
232248 |env_var| {
233- Some ( ObjectRef :: < Secret > :: new (
249+ Some ( ObjectRef :: < PartialObjectMeta < Secret > > :: new (
234250 & env_var. value_from . as_ref ( ) ?. secret_key_ref . as_ref ( ) ?. name ,
235251 ) )
236252 } ,
237253 |env_from| {
238- Some ( ObjectRef :: < Secret > :: new (
254+ Some ( ObjectRef :: < PartialObjectMeta < Secret > > :: new (
239255 & env_from. secret_ref . as_ref ( ) ?. name ,
240256 ) )
241257 } ,
@@ -290,11 +306,16 @@ async fn reconcile(sts: Arc<StatefulSet>, ctx: Arc<Ctx>) -> Result<Action, Error
290306 )
291307 . await
292308 . context ( PatchFailedSnafu {
293- obj_ref : ObjectRef :: from_obj ( sts. as_ref ( ) ) . erase ( ) ,
309+ obj_ref : ObjectRef :: from_obj ( sts) . erase ( ) ,
294310 } ) ?;
295311 Ok ( Action :: await_change ( ) )
296312}
297313
298- fn error_policy ( _obj : Arc < StatefulSet > , _error : & Error , _ctx : Arc < Ctx > ) -> Action {
299- Action :: requeue ( Duration :: from_secs ( 5 ) )
314+ fn error_policy ( _obj : Arc < DeserializeGuard < StatefulSet > > , error : & Error , _ctx : Arc < Ctx > ) -> Action {
315+ match error {
316+ // root object is invalid, will be requeued when modified anyway
317+ Error :: InvalidStatefulSet { .. } => Action :: await_change ( ) ,
318+
319+ _ => Action :: requeue ( Duration :: from_secs ( 5 ) ) ,
320+ }
300321}
0 commit comments