@@ -40,3 +40,120 @@ pub fn build_role_binding(cluster: &ValidatedCluster) -> RoleBinding {
4040fn rbac_labels ( cluster : & ValidatedCluster ) -> Labels {
4141 cluster. recommended_labels_for ( & NONE_ROLE_NAME , & NONE_ROLE_GROUP_NAME )
4242}
43+
44+ #[ cfg( test) ]
45+ mod tests {
46+ use serde_json:: json;
47+
48+ use super :: * ;
49+ use crate :: controller:: test_support:: { app_version_label, minimal_kafka, validated_cluster} ;
50+
51+ // The fixture's cluster name (`simple-kafka`) deliberately differs from the product name
52+ // (`kafka`), so swapped `name`/`instance` label values cannot pass unnoticed. The RBAC pair
53+ // is mode-independent, so the minimal ZooKeeper-mode cluster suffices.
54+ fn cluster ( ) -> ValidatedCluster {
55+ let kafka = minimal_kafka (
56+ r#"
57+ apiVersion: kafka.stackable.tech/v1alpha1
58+ kind: KafkaCluster
59+ metadata:
60+ name: simple-kafka
61+ namespace: default
62+ uid: 12345678-1234-1234-1234-123456789012
63+ spec:
64+ image:
65+ productVersion: 3.9.2
66+ clusterConfig:
67+ zookeeperConfigMapName: xyz
68+ brokers:
69+ roleGroups:
70+ default:
71+ replicas: 1
72+ "# ,
73+ ) ;
74+ validated_cluster ( & kafka)
75+ }
76+
77+ #[ test]
78+ fn test_service_account ( ) {
79+ let service_account = build_service_account ( & cluster ( ) ) ;
80+
81+ assert_eq ! (
82+ json!( {
83+ "apiVersion" : "v1" ,
84+ "kind" : "ServiceAccount" ,
85+ "metadata" : {
86+ // The RBAC resources are cluster-shared, so role and role group are `none`.
87+ "labels" : {
88+ "app.kubernetes.io/component" : "none" ,
89+ "app.kubernetes.io/instance" : "simple-kafka" ,
90+ "app.kubernetes.io/managed-by" : "kafka.stackable.tech_kafkacluster" ,
91+ "app.kubernetes.io/name" : "kafka" ,
92+ "app.kubernetes.io/role-group" : "none" ,
93+ "app.kubernetes.io/version" : app_version_label( "3.9.2" ) ,
94+ "stackable.tech/vendor" : "Stackable"
95+ } ,
96+ "name" : "simple-kafka-serviceaccount" ,
97+ "namespace" : "default" ,
98+ "ownerReferences" : [
99+ {
100+ "apiVersion" : "kafka.stackable.tech/v1alpha1" ,
101+ "controller" : true ,
102+ "kind" : "KafkaCluster" ,
103+ "name" : "simple-kafka" ,
104+ "uid" : "12345678-1234-1234-1234-123456789012"
105+ }
106+ ]
107+ }
108+ } ) ,
109+ serde_json:: to_value( service_account) . expect( "must be serializable" )
110+ ) ;
111+ }
112+
113+ #[ test]
114+ fn test_role_binding ( ) {
115+ let role_binding = build_role_binding ( & cluster ( ) ) ;
116+
117+ assert_eq ! (
118+ json!( {
119+ "apiVersion" : "rbac.authorization.k8s.io/v1" ,
120+ "kind" : "RoleBinding" ,
121+ "metadata" : {
122+ "labels" : {
123+ "app.kubernetes.io/component" : "none" ,
124+ "app.kubernetes.io/instance" : "simple-kafka" ,
125+ "app.kubernetes.io/managed-by" : "kafka.stackable.tech_kafkacluster" ,
126+ "app.kubernetes.io/name" : "kafka" ,
127+ "app.kubernetes.io/role-group" : "none" ,
128+ "app.kubernetes.io/version" : app_version_label( "3.9.2" ) ,
129+ "stackable.tech/vendor" : "Stackable"
130+ } ,
131+ "name" : "simple-kafka-rolebinding" ,
132+ "namespace" : "default" ,
133+ "ownerReferences" : [
134+ {
135+ "apiVersion" : "kafka.stackable.tech/v1alpha1" ,
136+ "controller" : true ,
137+ "kind" : "KafkaCluster" ,
138+ "name" : "simple-kafka" ,
139+ "uid" : "12345678-1234-1234-1234-123456789012"
140+ }
141+ ]
142+ } ,
143+ "roleRef" : {
144+ "apiGroup" : "rbac.authorization.k8s.io" ,
145+ "kind" : "ClusterRole" ,
146+ "name" : "kafka-clusterrole"
147+ } ,
148+ "subjects" : [
149+ {
150+ "kind" : "ServiceAccount" ,
151+ "name" : "simple-kafka-serviceaccount" ,
152+ "namespace" : "default"
153+ }
154+ ]
155+ } ) ,
156+ serde_json:: to_value( role_binding) . expect( "must be serializable" )
157+ ) ;
158+ }
159+ }
0 commit comments