1
1
use crate :: builder:: ObjectMetaBuilder ;
2
+ use crate :: error:: OperatorResult ;
2
3
use crate :: k8s_openapi:: api:: core:: v1:: ServiceAccount ;
3
4
use crate :: k8s_openapi:: api:: rbac:: v1:: { RoleBinding , RoleRef , Subject } ;
4
5
use kube:: { Resource , ResourceExt } ;
6
+ use std:: collections:: BTreeMap ;
5
7
6
8
/// Build RBAC objects for the product workloads.
7
9
/// The `rbac_prefix` is meant to be the product name, for example: zookeeper, airflow, etc.
8
10
/// and it is a assumed that a ClusterRole named `{rbac_prefix}-clusterrole` exists.
9
- pub fn build_rbac_resources < T : Resource > (
11
+ pub fn build_rbac_resources < T : Clone + Resource < DynamicType = ( ) > > (
10
12
resource : & T ,
11
13
rbac_prefix : & str ,
12
- ) -> ( ServiceAccount , RoleBinding ) {
14
+ labels : BTreeMap < String , String > ,
15
+ ) -> OperatorResult < ( ServiceAccount , RoleBinding ) > {
13
16
let sa_name = format ! ( "{rbac_prefix}-sa" ) ;
14
17
let service_account = ServiceAccount {
15
18
metadata : ObjectMetaBuilder :: new ( )
16
19
. name_and_namespace ( resource)
17
20
. name ( sa_name. clone ( ) )
21
+ . ownerreference_from_resource ( resource, None , Some ( true ) ) ?
22
+ . with_labels ( labels. clone ( ) )
18
23
. build ( ) ,
19
24
..ServiceAccount :: default ( )
20
25
} ;
@@ -23,6 +28,8 @@ pub fn build_rbac_resources<T: Resource>(
23
28
metadata : ObjectMetaBuilder :: new ( )
24
29
. name_and_namespace ( resource)
25
30
. name ( format ! ( "{rbac_prefix}-rolebinding" ) )
31
+ . ownerreference_from_resource ( resource, None , Some ( true ) ) ?
32
+ . with_labels ( labels)
26
33
. build ( ) ,
27
34
role_ref : RoleRef {
28
35
kind : "ClusterRole" . to_string ( ) ,
@@ -37,7 +44,7 @@ pub fn build_rbac_resources<T: Resource>(
37
44
} ] ) ,
38
45
} ;
39
46
40
- ( service_account, role_binding)
47
+ Ok ( ( service_account, role_binding) )
41
48
}
42
49
43
50
#[ cfg( test) ]
@@ -46,6 +53,7 @@ mod tests {
46
53
use kube:: CustomResource ;
47
54
use schemars:: { self , JsonSchema } ;
48
55
use serde:: { Deserialize , Serialize } ;
56
+ use std:: collections:: BTreeMap ;
49
57
50
58
const CLUSTER_NAME : & str = "simple-cluster" ;
51
59
const RESOURCE_NAME : & str = "test-resource" ;
@@ -64,6 +72,7 @@ mod tests {
64
72
metadata:
65
73
name: {CLUSTER_NAME}
66
74
namespace: {CLUSTER_NAME}-ns
75
+ uid: 12345
67
76
spec:
68
77
test: 100
69
78
"
@@ -74,7 +83,8 @@ mod tests {
74
83
#[ test]
75
84
fn test_build_rbac ( ) {
76
85
let cluster = build_test_resource ( ) ;
77
- let ( rbac_sa, rbac_rolebinding) = build_rbac_resources ( & cluster, RESOURCE_NAME ) ;
86
+ let ( rbac_sa, rbac_rolebinding) =
87
+ build_rbac_resources ( & cluster, RESOURCE_NAME , BTreeMap :: new ( ) ) . unwrap ( ) ;
78
88
79
89
assert_eq ! (
80
90
Some ( format!( "{RESOURCE_NAME}-sa" ) ) ,
0 commit comments