@@ -51,32 +51,64 @@ pub mod versioned {
5151}
5252
5353#[ derive( Clone , Debug ) ]
54- /// Helper struct that contains resolved AuthenticationClasses to reduce network API calls.
55- pub struct ResolvedAuthenticationClasses {
56- resolved_authentication_classes : Vec < core:: v1alpha1:: AuthenticationClass > ,
54+ /// Helper struct that contains dereferenced AuthenticationClasses to reduce network API calls.
55+ pub struct DereferencedAuthenticationClasses {
56+ dereferenced_authentication_classes : Vec < core:: v1alpha1:: AuthenticationClass > ,
5757}
5858
59- impl ResolvedAuthenticationClasses {
59+ impl DereferencedAuthenticationClasses {
60+ /// Fetch the referenced AuthenticationClasses from the Kubernetes API without validating them.
61+ ///
62+ /// Call [`Self::validate`] on the result to enforce the constraints documented there.
63+ pub async fn fetch_references (
64+ client : & Client ,
65+ auth_classes : & Vec < v1alpha1:: ZookeeperAuthentication > ,
66+ ) -> Result < DereferencedAuthenticationClasses , Error > {
67+ let mut dereferenced_authentication_classes: Vec < core:: v1alpha1:: AuthenticationClass > =
68+ vec ! [ ] ;
69+
70+ for auth_class in auth_classes {
71+ dereferenced_authentication_classes. push (
72+ core:: v1alpha1:: AuthenticationClass :: resolve (
73+ client,
74+ & auth_class. authentication_class ,
75+ )
76+ . await
77+ . context ( AuthenticationClassRetrievalSnafu {
78+ authentication_class : ObjectRef :: < core:: v1alpha1:: AuthenticationClass > :: new (
79+ & auth_class. authentication_class ,
80+ ) ,
81+ } ) ?,
82+ ) ;
83+ }
84+
85+ Ok ( DereferencedAuthenticationClasses {
86+ dereferenced_authentication_classes,
87+ } )
88+ }
89+
6090 /// Return the (first) TLS `AuthenticationClass` if available
6191 pub fn get_tls_authentication_class ( & self ) -> Option < & core:: v1alpha1:: AuthenticationClass > {
62- self . resolved_authentication_classes . iter ( ) . find ( |auth| {
63- matches ! (
64- auth. spec. provider,
65- core:: v1alpha1:: AuthenticationClassProvider :: Tls ( _)
66- )
67- } )
92+ self . dereferenced_authentication_classes
93+ . iter ( )
94+ . find ( |auth| {
95+ matches ! (
96+ auth. spec. provider,
97+ core:: v1alpha1:: AuthenticationClassProvider :: Tls ( _)
98+ )
99+ } )
68100 }
69101
70- /// Validates the resolved AuthenticationClasses.
102+ /// Validates the dereferenced AuthenticationClasses.
71103 /// Currently errors out if:
72104 /// - More than one AuthenticationClass was provided
73105 /// - AuthenticationClass mechanism was not supported
74106 pub fn validate ( & self ) -> Result < Self , Error > {
75- if self . resolved_authentication_classes . len ( ) > 1 {
107+ if self . dereferenced_authentication_classes . len ( ) > 1 {
76108 return Err ( Error :: MultipleAuthenticationClassesProvided ) ;
77109 }
78110
79- for auth_class in & self . resolved_authentication_classes {
111+ for auth_class in & self . dereferenced_authentication_classes {
80112 match & auth_class. spec . provider {
81113 core:: v1alpha1:: AuthenticationClassProvider :: Tls ( _) => { }
82114 core:: v1alpha1:: AuthenticationClassProvider :: Ldap ( _)
@@ -96,36 +128,8 @@ impl ResolvedAuthenticationClasses {
96128
97129 /// USE ONLY IN TESTS! We can not put it behind `#[cfg(test)]` because of <https://github.com/rust-lang/cargo/issues/8379>
98130 pub fn new_for_tests ( ) -> Self {
99- ResolvedAuthenticationClasses {
100- resolved_authentication_classes : vec ! [ ] ,
131+ DereferencedAuthenticationClasses {
132+ dereferenced_authentication_classes : vec ! [ ] ,
101133 }
102134 }
103135}
104-
105- /// Resolve provided AuthenticationClasses via API calls and validate the contents.
106- /// Currently errors out if:
107- /// - AuthenticationClass could not be resolved
108- /// - Validation failed
109- pub async fn resolve_authentication_classes (
110- client : & Client ,
111- auth_classes : & Vec < v1alpha1:: ZookeeperAuthentication > ,
112- ) -> Result < ResolvedAuthenticationClasses , Error > {
113- let mut resolved_authentication_classes: Vec < core:: v1alpha1:: AuthenticationClass > = vec ! [ ] ;
114-
115- for auth_class in auth_classes {
116- resolved_authentication_classes. push (
117- core:: v1alpha1:: AuthenticationClass :: resolve ( client, & auth_class. authentication_class )
118- . await
119- . context ( AuthenticationClassRetrievalSnafu {
120- authentication_class : ObjectRef :: < core:: v1alpha1:: AuthenticationClass > :: new (
121- & auth_class. authentication_class ,
122- ) ,
123- } ) ?,
124- ) ;
125- }
126-
127- ResolvedAuthenticationClasses {
128- resolved_authentication_classes,
129- }
130- . validate ( )
131- }
0 commit comments