@@ -30,6 +30,141 @@ import (
30
30
capi "k8s.io/api/certificates/v1beta1"
31
31
)
32
32
33
+ func TestIsKubeletServingCSR (t * testing.T ) {
34
+ newCSR := func (base pemOptions , overlays ... pemOptions ) * x509.CertificateRequest {
35
+ b := csrWithOpts (base , overlays ... )
36
+ csr , err := ParseCSR (b )
37
+ if err != nil {
38
+ t .Fatal (err )
39
+ }
40
+ return csr
41
+ }
42
+ tests := map [string ]struct {
43
+ req * x509.CertificateRequest
44
+ usages []capi.KeyUsage
45
+ exp bool
46
+ }{
47
+ "defaults for kubelet-serving" : {
48
+ req : newCSR (kubeletServerPEMOptions ),
49
+ usages : kubeletServerUsages ,
50
+ exp : true ,
51
+ },
52
+ "does not default to kube-apiserver-client-kubelet if org is not 'system:nodes'" : {
53
+ req : newCSR (kubeletServerPEMOptions , pemOptions {org : "not-system:nodes" }),
54
+ usages : kubeletServerUsages ,
55
+ exp : false ,
56
+ },
57
+ "does not default to kubelet-serving if CN does not have system:node: prefix" : {
58
+ req : newCSR (kubeletServerPEMOptions , pemOptions {cn : "notprefixed" }),
59
+ usages : kubeletServerUsages ,
60
+ exp : false ,
61
+ },
62
+ "does not default to kubelet-serving if it has an unexpected usage" : {
63
+ req : newCSR (kubeletServerPEMOptions ),
64
+ usages : append (kubeletServerUsages , capi .UsageClientAuth ),
65
+ exp : false ,
66
+ },
67
+ "does not default to kubelet-serving if it is missing an expected usage" : {
68
+ req : newCSR (kubeletServerPEMOptions ),
69
+ usages : kubeletServerUsages [1 :],
70
+ exp : false ,
71
+ },
72
+ "does not default to kubelet-serving if it does not specify any dnsNames or ipAddresses" : {
73
+ req : newCSR (kubeletServerPEMOptions , pemOptions {ipAddresses : []net.IP {}, dnsNames : []string {}}),
74
+ usages : kubeletServerUsages [1 :],
75
+ exp : false ,
76
+ },
77
+ "does not default to kubelet-serving if it specifies a URI SAN" : {
78
+ req : newCSR (kubeletServerPEMOptions , pemOptions {uris : []string {"http://something" }}),
79
+ usages : kubeletServerUsages ,
80
+ exp : false ,
81
+ },
82
+ "does not default to kubelet-serving if it specifies an emailAddress SAN" : {
83
+ req : newCSR (kubeletServerPEMOptions , pemOptions {emailAddresses : []string {"something" }}),
84
+ usages : kubeletServerUsages ,
85
+ exp : false ,
86
+ },
87
+ }
88
+ for name , test := range tests {
89
+ t .Run (name , func (t * testing.T ) {
90
+ got := IsKubeletServingCSR (test .req , test .usages )
91
+ if test .exp != got {
92
+ t .Errorf ("unexpected IsKubeletClientCSR output: exp=%v, got=%v" , test .exp , got )
93
+ }
94
+ })
95
+ }
96
+ }
97
+
98
+ func TestIsKubeletClientCSR (t * testing.T ) {
99
+ newCSR := func (base pemOptions , overlays ... pemOptions ) * x509.CertificateRequest {
100
+ b := csrWithOpts (base , overlays ... )
101
+ csr , err := ParseCSR (b )
102
+ if err != nil {
103
+ t .Fatal (err )
104
+ }
105
+ return csr
106
+ }
107
+ tests := map [string ]struct {
108
+ req * x509.CertificateRequest
109
+ usages []capi.KeyUsage
110
+ exp bool
111
+ }{
112
+ "defaults for kube-apiserver-client-kubelet" : {
113
+ req : newCSR (kubeletClientPEMOptions ),
114
+ usages : kubeletClientUsages ,
115
+ exp : true ,
116
+ },
117
+ "does not default to kube-apiserver-client-kubelet if org is not 'system:nodes'" : {
118
+ req : newCSR (kubeletClientPEMOptions , pemOptions {org : "not-system:nodes" }),
119
+ usages : kubeletClientUsages ,
120
+ exp : false ,
121
+ },
122
+ "does not default to kube-apiserver-client-kubelet if a dnsName is set" : {
123
+ req : newCSR (kubeletClientPEMOptions , pemOptions {dnsNames : []string {"something" }}),
124
+ usages : kubeletClientUsages ,
125
+ exp : false ,
126
+ },
127
+ "does not default to kube-apiserver-client-kubelet if an emailAddress is set" : {
128
+ req : newCSR (kubeletClientPEMOptions , pemOptions {emailAddresses : []string {"something" }}),
129
+ usages : kubeletClientUsages ,
130
+ exp : false ,
131
+ },
132
+ "does not default to kube-apiserver-client-kubelet if a uri SAN is set" : {
133
+ req : newCSR (kubeletClientPEMOptions , pemOptions {uris : []string {"http://something" }}),
134
+ usages : kubeletClientUsages ,
135
+ exp : false ,
136
+ },
137
+ "does not default to kube-apiserver-client-kubelet if an ipAddress is set" : {
138
+ req : newCSR (kubeletClientPEMOptions , pemOptions {ipAddresses : []net.IP {{0 , 0 , 0 , 0 }}}),
139
+ usages : kubeletClientUsages ,
140
+ exp : false ,
141
+ },
142
+ "does not default to kube-apiserver-client-kubelet if CN does not have 'system:node:' prefix" : {
143
+ req : newCSR (kubeletClientPEMOptions , pemOptions {cn : "not-prefixed" }),
144
+ usages : kubeletClientUsages ,
145
+ exp : false ,
146
+ },
147
+ "does not default to kube-apiserver-client-kubelet if it has an unexpected usage" : {
148
+ req : newCSR (kubeletClientPEMOptions ),
149
+ usages : append (kubeletClientUsages , capi .UsageServerAuth ),
150
+ exp : false ,
151
+ },
152
+ "does not default to kube-apiserver-client-kubelet if it is missing an expected usage" : {
153
+ req : newCSR (kubeletClientPEMOptions ),
154
+ usages : kubeletClientUsages [1 :],
155
+ exp : false ,
156
+ },
157
+ }
158
+ for name , test := range tests {
159
+ t .Run (name , func (t * testing.T ) {
160
+ got := IsKubeletClientCSR (test .req , test .usages )
161
+ if test .exp != got {
162
+ t .Errorf ("unexpected IsKubeletClientCSR output: exp=%v, got=%v" , test .exp , got )
163
+ }
164
+ })
165
+ }
166
+ }
167
+
33
168
var (
34
169
kubeletClientUsages = []capi.KeyUsage {
35
170
capi .UsageDigitalSignature ,
0 commit comments