@@ -14,6 +14,7 @@ use crate::{
1414 config_map:: build_rolegroup_config_map,
1515 listener:: { build_group_listener, group_listener_name} ,
1616 pdb:: build_pdb,
17+ rbac:: { build_role_binding, build_service_account} ,
1718 service:: { build_rolegroup_headless_service, build_rolegroup_metrics_service} ,
1819 statefulset:: build_node_rolegroup_statefulset,
1920 } ,
@@ -69,10 +70,7 @@ pub enum Error {
6970///
7071/// `service_account_name` is the name of the RBAC `ServiceAccount` the role-group Pods run under
7172/// (RBAC resources are built and applied separately, in the reconcile step).
72- pub fn build (
73- cluster : & ValidatedCluster ,
74- service_account_name : & str ,
75- ) -> Result < KubernetesResources , Error > {
73+ pub fn build ( cluster : & ValidatedCluster ) -> Result < KubernetesResources , Error > {
7674 let mut stateful_sets = vec ! [ ] ;
7775 let mut services = vec ! [ ] ;
7876 let mut listeners = vec ! [ ] ;
@@ -109,16 +107,10 @@ pub fn build(
109107
110108 let effective_replicas = rg. replicas . map ( i32:: from) ;
111109 stateful_sets. push (
112- build_node_rolegroup_statefulset (
113- cluster,
114- role_group_name,
115- rg,
116- effective_replicas,
117- service_account_name,
118- )
119- . context ( StatefulSetSnafu {
120- role_group : role_group_name. clone ( ) ,
121- } ) ?,
110+ build_node_rolegroup_statefulset ( cluster, role_group_name, rg, effective_replicas)
111+ . context ( StatefulSetSnafu {
112+ role_group : role_group_name. clone ( ) ,
113+ } ) ?,
122114 ) ;
123115 }
124116
@@ -128,11 +120,15 @@ pub fn build(
128120 listeners,
129121 config_maps,
130122 pod_disruption_budgets,
123+ service_accounts : vec ! [ build_service_account( cluster) ] ,
124+ role_bindings : vec ! [ build_role_binding( cluster) ] ,
131125 } )
132126}
133127
134128#[ cfg( test) ]
135129mod tests {
130+ use std:: collections:: BTreeMap ;
131+
136132 use stackable_operator:: kube:: Resource ;
137133
138134 use super :: { build, properties:: test_support:: minimal_validated_cluster} ;
@@ -149,7 +145,7 @@ mod tests {
149145 #[ test]
150146 fn build_produces_expected_resources ( ) {
151147 let cluster = minimal_validated_cluster ( ) ;
152- let resources = build ( & cluster, "simple-nifi-serviceaccount" ) . expect ( "build succeeds" ) ;
148+ let resources = build ( & cluster) . expect ( "build succeeds" ) ;
153149
154150 // The minimal fixture has a single `default` role group for the `node` role.
155151 assert_eq ! (
@@ -169,4 +165,57 @@ mod tests {
169165 [ "simple-nifi-node" ]
170166 ) ;
171167 }
168+
169+ /// Locks the RBAC resource names, the roleRef, and the recommended label set against
170+ /// accidental drift. The fixture's cluster name deliberately differs from the product name so
171+ /// that swapped `name`/`instance` label values cannot pass unnoticed.
172+ ///
173+ /// The version label is the bare `2.9.0` because the fixture hand-builds its
174+ /// [`ResolvedProductImage`](stackable_operator::commons::product_image_selection::ResolvedProductImage)
175+ /// instead of resolving it (which would append the `-stackable…` suffix).
176+ #[ test]
177+ fn build_produces_rbac ( ) {
178+ let cluster = minimal_validated_cluster ( ) ;
179+ let resources = build ( & cluster) . expect ( "build succeeds" ) ;
180+
181+ assert_eq ! (
182+ sorted_names( & resources. service_accounts) ,
183+ [ "simple-nifi-serviceaccount" ]
184+ ) ;
185+ assert_eq ! (
186+ sorted_names( & resources. role_bindings) ,
187+ [ "simple-nifi-rolebinding" ]
188+ ) ;
189+
190+ let expected_labels = BTreeMap :: from (
191+ [
192+ ( "app.kubernetes.io/component" , "none" ) ,
193+ ( "app.kubernetes.io/instance" , "simple-nifi" ) ,
194+ (
195+ "app.kubernetes.io/managed-by" ,
196+ "nifi.stackable.tech_nificluster" ,
197+ ) ,
198+ ( "app.kubernetes.io/name" , "nifi" ) ,
199+ ( "app.kubernetes.io/role-group" , "none" ) ,
200+ ( "app.kubernetes.io/version" , "2.9.0" ) ,
201+ ( "stackable.tech/vendor" , "Stackable" ) ,
202+ ]
203+ . map ( |( key, value) | ( key. to_string ( ) , value. to_string ( ) ) ) ,
204+ ) ;
205+ let service_account = resources
206+ . service_accounts
207+ . first ( )
208+ . expect ( "a ServiceAccount is built" ) ;
209+ assert_eq ! (
210+ service_account. metadata. labels,
211+ Some ( expected_labels. clone( ) )
212+ ) ;
213+
214+ let role_binding = resources
215+ . role_bindings
216+ . first ( )
217+ . expect ( "a RoleBinding is built" ) ;
218+ assert_eq ! ( role_binding. metadata. labels, Some ( expected_labels) ) ;
219+ assert_eq ! ( role_binding. role_ref. name, "nifi-clusterrole" ) ;
220+ }
172221}
0 commit comments