1- //! Builders that turn a [`ValidatedCluster`](crate::controller::ValidatedCluster) into
1+ //! Builders that turn a [`ValidatedCluster`] into
22//! Kubernetes resources.
33
44use std:: str:: FromStr ;
@@ -15,6 +15,7 @@ use crate::{
1515 config_map:: { self , build_rolegroup_config_map} ,
1616 discovery:: { self , build_discovery_config_map} ,
1717 pdb:: build_pdb,
18+ rbac:: { build_role_binding, build_service_account} ,
1819 service:: { build_rolegroup_metrics_service, build_rolegroup_service} ,
1920 statefulset:: { self , build_rolegroup_statefulset} ,
2021 } ,
@@ -56,7 +57,6 @@ pub enum Error {
5657pub fn build (
5758 cluster : & ValidatedCluster ,
5859 cluster_info : & KubernetesClusterInfo ,
59- service_account_name : & str ,
6060) -> Result < KubernetesResources , Error > {
6161 let mut stateful_sets = vec ! [ ] ;
6262 let mut services = vec ! [ ] ;
@@ -83,17 +83,11 @@ pub fn build(
8383 } ) ?,
8484 ) ;
8585 stateful_sets. push (
86- build_rolegroup_statefulset (
87- cluster,
88- hbase_role,
89- role_group_name,
90- rg_config,
91- service_account_name,
92- )
93- . with_context ( |_| StatefulSetSnafu {
94- hbase_role : hbase_role. clone ( ) ,
95- role_group : role_group_name. clone ( ) ,
96- } ) ?,
86+ build_rolegroup_statefulset ( cluster, hbase_role, role_group_name, rg_config)
87+ . with_context ( |_| StatefulSetSnafu {
88+ hbase_role : hbase_role. clone ( ) ,
89+ role_group : role_group_name. clone ( ) ,
90+ } ) ?,
9791 ) ;
9892 }
9993
@@ -113,6 +107,8 @@ pub fn build(
113107 services,
114108 config_maps,
115109 pod_disruption_budgets,
110+ service_accounts : vec ! [ build_service_account( cluster) ] ,
111+ role_bindings : vec ! [ build_role_binding( cluster) ] ,
116112 } )
117113}
118114
@@ -127,6 +123,8 @@ pub mod role;
127123
128124#[ cfg( test) ]
129125mod tests {
126+ use std:: collections:: BTreeMap ;
127+
130128 use stackable_operator:: kube:: Resource ;
131129
132130 use super :: build;
@@ -146,8 +144,7 @@ mod tests {
146144 fn build_produces_expected_resource_names ( ) {
147145 let cluster = test_utils:: validated_cluster ( ) ;
148146 let cluster_info = test_utils:: cluster_info ( ) ;
149- let resources =
150- build ( & cluster, & cluster_info, "hbase-serviceaccount" ) . expect ( "build succeeds" ) ;
147+ let resources = build ( & cluster, & cluster_info) . expect ( "build succeeds" ) ;
151148
152149 // One StatefulSet per role group (one `default` group for each of the three roles).
153150 assert_eq ! (
@@ -186,4 +183,58 @@ mod tests {
186183 [ "hbase-master" , "hbase-regionserver" , "hbase-restserver" ]
187184 ) ;
188185 }
186+
187+ /// Locks the RBAC resource names, the roleRef, and the recommended label set against
188+ /// accidental drift. The cluster name deliberately differs from the product name so that
189+ /// swapped `name`/`instance` label values cannot pass unnoticed (the shared fixture is named
190+ /// `hbase`, which would mask exactly that swap).
191+ #[ test]
192+ fn build_produces_rbac ( ) {
193+ let hbase = test_utils:: hbase_from_yaml (
194+ & test_utils:: MINIMAL_HBASE_YAML . replace ( "name: hbase" , "name: my-hbase" ) ,
195+ ) ;
196+ let cluster = test_utils:: validated_cluster_from ( & hbase) ;
197+ let cluster_info = test_utils:: cluster_info ( ) ;
198+ let resources = build ( & cluster, & cluster_info) . expect ( "build succeeds" ) ;
199+
200+ assert_eq ! (
201+ sorted_names( & resources. service_accounts) ,
202+ [ "my-hbase-serviceaccount" ]
203+ ) ;
204+ assert_eq ! (
205+ sorted_names( & resources. role_bindings) ,
206+ [ "my-hbase-rolebinding" ]
207+ ) ;
208+
209+ let expected_labels = BTreeMap :: from (
210+ [
211+ ( "app.kubernetes.io/component" , "none" ) ,
212+ ( "app.kubernetes.io/instance" , "my-hbase" ) ,
213+ (
214+ "app.kubernetes.io/managed-by" ,
215+ "hbase.stackable.com_hbasecluster" ,
216+ ) ,
217+ ( "app.kubernetes.io/name" , "hbase" ) ,
218+ ( "app.kubernetes.io/role-group" , "none" ) ,
219+ ( "app.kubernetes.io/version" , "2.6.3-stackable0.0.0-dev" ) ,
220+ ( "stackable.tech/vendor" , "Stackable" ) ,
221+ ]
222+ . map ( |( key, value) | ( key. to_string ( ) , value. to_string ( ) ) ) ,
223+ ) ;
224+ let service_account = resources
225+ . service_accounts
226+ . first ( )
227+ . expect ( "a ServiceAccount is built" ) ;
228+ assert_eq ! (
229+ service_account. metadata. labels,
230+ Some ( expected_labels. clone( ) )
231+ ) ;
232+
233+ let role_binding = resources
234+ . role_bindings
235+ . first ( )
236+ . expect ( "a RoleBinding is built" ) ;
237+ assert_eq ! ( role_binding. metadata. labels, Some ( expected_labels) ) ;
238+ assert_eq ! ( role_binding. role_ref. name, "hbase-clusterrole" ) ;
239+ }
189240}
0 commit comments