@@ -13,6 +13,7 @@ use crate::controller::{
1313 config_map,
1414 listener:: { build_group_listener, group_listener_name} ,
1515 pdb:: build_pdb,
16+ rbac:: { build_role_binding, build_service_account} ,
1617 service:: {
1718 build_rolegroup_headless_service, build_rolegroup_metrics_service,
1819 headless_service_ports,
@@ -52,13 +53,9 @@ pub enum Error {
5253/// Does not need a Kubernetes client: every reference to another Kubernetes resource is already
5354/// dereferenced and validated by this point, so the errors returned here are resource-assembly
5455/// failures only.
55- ///
56- /// `service_account_name` is the name of the RBAC `ServiceAccount` the role-group Pods run under
57- /// (RBAC resources are built and applied separately, in the reconcile step).
5856pub fn build (
5957 cluster : & ValidatedCluster ,
6058 cluster_info : & KubernetesClusterInfo ,
61- service_account_name : & str ,
6259) -> Result < KubernetesResources , Error > {
6360 let mut stateful_sets = vec ! [ ] ;
6461 let mut services = vec ! [ ] ;
@@ -115,7 +112,6 @@ pub fn build(
115112 role,
116113 role_group_name,
117114 role_group_config,
118- service_account_name,
119115 )
120116 . context ( StatefulSetSnafu {
121117 role_group : role_group_name. clone ( ) ,
@@ -147,11 +143,15 @@ pub fn build(
147143 listeners,
148144 config_maps,
149145 pod_disruption_budgets,
146+ service_accounts : vec ! [ build_service_account( cluster) ] ,
147+ role_bindings : vec ! [ build_role_binding( cluster) ] ,
150148 } )
151149}
152150
153151#[ cfg( test) ]
154152mod tests {
153+ use std:: collections:: BTreeMap ;
154+
155155 use stackable_operator:: {
156156 commons:: networking:: DomainName , kube:: Resource , utils:: cluster_info:: KubernetesClusterInfo ,
157157 } ;
@@ -177,8 +177,7 @@ mod tests {
177177 . expect ( "cluster.local is a valid domain name" ) ,
178178 } ;
179179
180- let resources =
181- build ( & cluster, & cluster_info, "simple-trino-serviceaccount" ) . expect ( "build succeeds" ) ;
180+ let resources = build ( & cluster, & cluster_info) . expect ( "build succeeds" ) ;
182181
183182 // One StatefulSet per role group.
184183 assert_eq ! (
@@ -219,4 +218,58 @@ mod tests {
219218 [ "simple-trino-coordinator" , "simple-trino-worker" ]
220219 ) ;
221220 }
221+
222+ /// Locks the RBAC resource names, the roleRef, and the recommended label set against
223+ /// accidental drift. The fixture's cluster name deliberately differs from the product name so
224+ /// that swapped `name`/`instance` label values cannot pass unnoticed.
225+ #[ test]
226+ fn build_produces_rbac ( ) {
227+ let cluster = validated_cluster ( ) ;
228+ let cluster_info = KubernetesClusterInfo {
229+ cluster_domain : DomainName :: try_from ( "cluster.local" )
230+ . expect ( "cluster.local is a valid domain name" ) ,
231+ } ;
232+
233+ let resources = build ( & cluster, & cluster_info) . expect ( "build succeeds" ) ;
234+
235+ assert_eq ! (
236+ sorted_names( & resources. service_accounts) ,
237+ [ "simple-trino-serviceaccount" ]
238+ ) ;
239+ assert_eq ! (
240+ sorted_names( & resources. role_bindings) ,
241+ [ "simple-trino-rolebinding" ]
242+ ) ;
243+
244+ let expected_labels = BTreeMap :: from (
245+ [
246+ ( "app.kubernetes.io/component" , "none" ) ,
247+ ( "app.kubernetes.io/instance" , "simple-trino" ) ,
248+ (
249+ "app.kubernetes.io/managed-by" ,
250+ "trino.stackable.tech_trinocluster" ,
251+ ) ,
252+ ( "app.kubernetes.io/name" , "trino" ) ,
253+ ( "app.kubernetes.io/role-group" , "none" ) ,
254+ ( "app.kubernetes.io/version" , "481-stackable0.0.0-dev" ) ,
255+ ( "stackable.tech/vendor" , "Stackable" ) ,
256+ ]
257+ . map ( |( key, value) | ( key. to_string ( ) , value. to_string ( ) ) ) ,
258+ ) ;
259+ let service_account = resources
260+ . service_accounts
261+ . first ( )
262+ . expect ( "a ServiceAccount is built" ) ;
263+ assert_eq ! (
264+ service_account. metadata. labels,
265+ Some ( expected_labels. clone( ) )
266+ ) ;
267+
268+ let role_binding = resources
269+ . role_bindings
270+ . first ( )
271+ . expect ( "a RoleBinding is built" ) ;
272+ assert_eq ! ( role_binding. metadata. labels, Some ( expected_labels) ) ;
273+ assert_eq ! ( role_binding. role_ref. name, "trino-clusterrole" ) ;
274+ }
222275}
0 commit comments