@@ -24,32 +24,86 @@ import (
24
24
. "github.com/onsi/gomega"
25
25
rbacv1 "k8s.io/api/rbac/v1"
26
26
apierrors "k8s.io/apimachinery/pkg/api/errors"
27
+ metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
27
28
"k8s.io/apimachinery/pkg/runtime/schema"
28
29
ctrlclient "sigs.k8s.io/controller-runtime/pkg/client"
30
+ "sigs.k8s.io/controller-runtime/pkg/client/fake"
29
31
)
30
32
31
33
func TestCluster_ReconcileKubeletRBACBinding_NoError (t * testing.T ) {
34
+ type wantRBAC struct {
35
+ role ctrlclient.ObjectKey
36
+ roleBinding ctrlclient.ObjectKey
37
+ }
32
38
tests := []struct {
33
- name string
34
- client ctrlclient.Client
39
+ name string
40
+ client ctrlclient.Client
41
+ version semver.Version
42
+ want * wantRBAC
35
43
}{
36
44
{
37
- name : " role binding and role already exist " ,
38
- client : & fakeClient {
39
- get : map [ string ] interface {}{
40
- "kube-system/kubeadm:kubelet-config-1.12" : & rbacv1. RoleBinding {},
41
- "kube-system/ kubeadm:kubelet-config-1.13" : & rbacv1. Role { },
42
- },
45
+ name : "creates role and role binding for Kubernetes/kubeadm < v1.24 " ,
46
+ client : fake . NewClientBuilder (). Build (),
47
+ version : semver . MustParse ( "1.23.3" ),
48
+ want : & wantRBAC {
49
+ role : ctrlclient. ObjectKey { Namespace : metav1 . NamespaceSystem , Name : " kubeadm:kubelet-config-1.23" },
50
+ roleBinding : ctrlclient. ObjectKey { Namespace : metav1 . NamespaceSystem , Name : "kubeadm:kubelet-config-1.23" },
43
51
},
44
52
},
45
53
{
46
- name : "role binding and role don't exist" ,
47
- client : & fakeClient {},
54
+ name : "tolerates existing role binding for Kubernetes/kubeadm < v1.24" ,
55
+ client : fake .NewClientBuilder ().WithObjects (
56
+ & rbacv1.RoleBinding {ObjectMeta : metav1.ObjectMeta {Namespace : metav1 .NamespaceSystem , Name : "kubeadm:kubelet-config-1.23" }, RoleRef : rbacv1.RoleRef {
57
+ Name : "kubeadm:kubelet-config-1.23" ,
58
+ }},
59
+ & rbacv1.Role {ObjectMeta : metav1.ObjectMeta {Namespace : metav1 .NamespaceSystem , Name : "kubeadm:kubelet-config-1.23" }, Rules : []rbacv1.PolicyRule {{
60
+ Verbs : []string {"get" },
61
+ APIGroups : []string {"" },
62
+ Resources : []string {"configmaps" },
63
+ ResourceNames : []string {"kubelet-config-1.23" },
64
+ }}},
65
+ ).Build (),
66
+ version : semver .MustParse ("1.23.3" ),
67
+ want : & wantRBAC {
68
+ role : ctrlclient.ObjectKey {Namespace : metav1 .NamespaceSystem , Name : "kubeadm:kubelet-config-1.23" },
69
+ roleBinding : ctrlclient.ObjectKey {Namespace : metav1 .NamespaceSystem , Name : "kubeadm:kubelet-config-1.23" },
70
+ },
48
71
},
49
72
{
50
- name : "create returns an already exists error" ,
51
- client : & fakeClient {
52
- createErr : apierrors .NewAlreadyExists (schema.GroupResource {}, "" ),
73
+ name : "creates role and role binding for Kubernetes/kubeadm >= v1.24" ,
74
+ client : fake .NewClientBuilder ().Build (),
75
+ version : semver .MustParse ("1.24.0" ),
76
+ want : & wantRBAC {
77
+ role : ctrlclient.ObjectKey {Namespace : metav1 .NamespaceSystem , Name : "kubeadm:kubelet-config" },
78
+ roleBinding : ctrlclient.ObjectKey {Namespace : metav1 .NamespaceSystem , Name : "kubeadm:kubelet-config" },
79
+ },
80
+ },
81
+ {
82
+ name : "creates role and role binding for Kubernetes/kubeadm >= v1.24 ignoring pre-release and build tags" ,
83
+ client : fake .NewClientBuilder ().Build (),
84
+ version : semver .MustParse ("1.24.0-alpha.1+xyz.1" ),
85
+ want : & wantRBAC {
86
+ role : ctrlclient.ObjectKey {Namespace : metav1 .NamespaceSystem , Name : "kubeadm:kubelet-config" },
87
+ roleBinding : ctrlclient.ObjectKey {Namespace : metav1 .NamespaceSystem , Name : "kubeadm:kubelet-config" },
88
+ },
89
+ },
90
+ {
91
+ name : "tolerates existing role binding for Kubernetes/kubeadm >= v1.24" ,
92
+ client : fake .NewClientBuilder ().WithObjects (
93
+ & rbacv1.RoleBinding {ObjectMeta : metav1.ObjectMeta {Namespace : metav1 .NamespaceSystem , Name : "kubeadm:kubelet-config" }, RoleRef : rbacv1.RoleRef {
94
+ Name : "kubeadm:kubelet-config" ,
95
+ }},
96
+ & rbacv1.Role {ObjectMeta : metav1.ObjectMeta {Namespace : metav1 .NamespaceSystem , Name : "kubeadm:kubelet-config" }, Rules : []rbacv1.PolicyRule {{
97
+ Verbs : []string {"get" },
98
+ APIGroups : []string {"" },
99
+ Resources : []string {"configmaps" },
100
+ ResourceNames : []string {"kubelet-config" },
101
+ }}},
102
+ ).Build (),
103
+ version : semver .MustParse ("1.24.1" ),
104
+ want : & wantRBAC {
105
+ role : ctrlclient.ObjectKey {Namespace : metav1 .NamespaceSystem , Name : "kubeadm:kubelet-config" },
106
+ roleBinding : ctrlclient.ObjectKey {Namespace : metav1 .NamespaceSystem , Name : "kubeadm:kubelet-config" },
53
107
},
54
108
},
55
109
}
@@ -61,8 +115,27 @@ func TestCluster_ReconcileKubeletRBACBinding_NoError(t *testing.T) {
61
115
c := & Workload {
62
116
Client : tt .client ,
63
117
}
64
- g .Expect (c .ReconcileKubeletRBACBinding (ctx , semver .MustParse ("1.12.3" ))).To (Succeed ())
65
- g .Expect (c .ReconcileKubeletRBACRole (ctx , semver .MustParse ("1.13.3" ))).To (Succeed ())
118
+ g .Expect (c .ReconcileKubeletRBACBinding (ctx , tt .version )).To (Succeed ())
119
+ g .Expect (c .ReconcileKubeletRBACRole (ctx , tt .version )).To (Succeed ())
120
+ if tt .want != nil {
121
+ r := & rbacv1.Role {}
122
+ // Role exists
123
+ g .Expect (tt .client .Get (ctx , tt .want .role , r )).To (Succeed ())
124
+ // Role ensure grants for the KubeletConfig config map
125
+ g .Expect (r .Rules ).To (Equal ([]rbacv1.PolicyRule {
126
+ {
127
+ Verbs : []string {"get" },
128
+ APIGroups : []string {"" },
129
+ Resources : []string {"configmaps" },
130
+ ResourceNames : []string {generateKubeletConfigName (tt .version )},
131
+ },
132
+ }))
133
+ // RoleBinding exists
134
+ b := & rbacv1.RoleBinding {}
135
+ // RoleBinding refers to the role
136
+ g .Expect (tt .client .Get (ctx , tt .want .roleBinding , b )).To (Succeed ())
137
+ g .Expect (b .RoleRef .Name ).To (Equal (tt .want .role .Name ))
138
+ }
66
139
})
67
140
}
68
141
}
0 commit comments