-
Notifications
You must be signed in to change notification settings - Fork 22
Expand file tree
/
Copy pathreconciler_test.go
More file actions
494 lines (429 loc) · 18.6 KB
/
reconciler_test.go
File metadata and controls
494 lines (429 loc) · 18.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
package utils
import (
"context"
"fmt"
"reflect"
"strings"
"testing"
appstacksv1 "github.com/application-stacks/runtime-component-operator/api/v1"
"github.com/application-stacks/runtime-component-operator/common"
routev1 "github.com/openshift/api/route/v1"
appsv1 "k8s.io/api/apps/v1"
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/types"
"k8s.io/client-go/discovery"
fakediscovery "k8s.io/client-go/discovery/fake"
"k8s.io/client-go/kubernetes/scheme"
"k8s.io/client-go/rest"
coretesting "k8s.io/client-go/testing"
"k8s.io/client-go/tools/record"
servingv1alpha1 "knative.dev/serving/pkg/apis/serving/v1alpha1"
"sigs.k8s.io/controller-runtime/pkg/client"
fakeclient "sigs.k8s.io/controller-runtime/pkg/client/fake"
logf "sigs.k8s.io/controller-runtime/pkg/log"
"sigs.k8s.io/controller-runtime/pkg/log/zap"
)
var (
defaultMeta = metav1.ObjectMeta{
Name: "app",
Namespace: "runtimecomponent",
}
spec = appstacksv1.RuntimeComponentSpec{}
)
const (
routeCrtExpected = `-----BEGIN CERTIFICATE-----
MIIDJDCCAgygAwIBAgIQYjfKtSv5Ky2e9eT6lJGmSDANBgkqhkiG9w0BAQsFADA8
MQwwCgYDVQQKEwNJQk0xEjAQBgNVBAsTCVdlYlNwaGVyZTEYMBYGA1UEAxMPV0xP
IFRlc3QgSW50IENBMCAXDTIzMDQxMTIwMjcxOFoYDzIwNTMwMzMwMDYyNzE4WjAb
MRkwFwYDVQQDExBUZXN0IGNlcnRpZmljYXRlMIIBIjANBgkqhkiG9w0BAQEFAAOC
AQ8AMIIBCgKCAQEAruaFXcJ5/VYJKxGQbLbBcVv7sfmpU3XkXtIOSyUKENp02gnF
CDvwQKN6CFJHwvabflSSkMGPoshqHMlX9X2QUJRI9MqoI9iSTz0NY6t/2yedrK+0
vHzQrayD9UeEHWAyNKw794TB/9haUQQ0Ehp5jGFqk/p/U2g8CTyKM/41e3w2OnMA
HAfj4j1YMxDZ6jnxA3L6hGuAJwq+bg48I0xHx9cGEtQ9s4seKqaWeSGrlxwNW6up
4e19IcK1wHw+Kr3Nz4Wp2xBMLxae7632jrwkzWwsHankVYbo/ldqT7bXtKXB3vsZ
Fekqv/rPH8zdIN3absSlX+79VCokR95JrxjkFwIDAQABo0EwPzAOBgNVHQ8BAf8E
BAMCBaAwDAYDVR0TAQH/BAIwADAfBgNVHSMEGDAWgBQwrZjlaIwdBnegir6ZX4rf
wg8YQzANBgkqhkiG9w0BAQsFAAOCAQEASccwVEJ5L18vjkmkUGcZOuGZfchM4mqY
pHSQpJEmRalKE6Ci9mhUY9ijHVx19h8JYCUycK7shK2a024Jxj80tgUH7lvt3CUU
3fka3H8rqenGfYvKcQGu4/sp5G6C7Urt73y05n4itqojqX/EH5ie5lVCmnLaTD5O
rGbu5/wxlCL7U5pOE6AHOK8rHryRNIcy5WUmEtg834s68GOzU3lURDveITSRxH9U
FXuigxlTSyvbs4Kb/KIuZVo71IKvmg19NW086lja1NlI/Cvhiz6G7lzWZHYkWFAT
ytPQmBKGWBDeEph/kBi52auhlh1cpBguzXSufe0vB159nk6I+O43aQ==
-----END CERTIFICATE-----`
tlsCrt = `-----BEGIN CERTIFICATE-----
MIIDJDCCAgygAwIBAgIQYjfKtSv5Ky2e9eT6lJGmSDANBgkqhkiG9w0BAQsFADA8
MQwwCgYDVQQKEwNJQk0xEjAQBgNVBAsTCVdlYlNwaGVyZTEYMBYGA1UEAxMPV0xP
IFRlc3QgSW50IENBMCAXDTIzMDQxMTIwMjcxOFoYDzIwNTMwMzMwMDYyNzE4WjAb
MRkwFwYDVQQDExBUZXN0IGNlcnRpZmljYXRlMIIBIjANBgkqhkiG9w0BAQEFAAOC
AQ8AMIIBCgKCAQEAruaFXcJ5/VYJKxGQbLbBcVv7sfmpU3XkXtIOSyUKENp02gnF
CDvwQKN6CFJHwvabflSSkMGPoshqHMlX9X2QUJRI9MqoI9iSTz0NY6t/2yedrK+0
vHzQrayD9UeEHWAyNKw794TB/9haUQQ0Ehp5jGFqk/p/U2g8CTyKM/41e3w2OnMA
HAfj4j1YMxDZ6jnxA3L6hGuAJwq+bg48I0xHx9cGEtQ9s4seKqaWeSGrlxwNW6up
4e19IcK1wHw+Kr3Nz4Wp2xBMLxae7632jrwkzWwsHankVYbo/ldqT7bXtKXB3vsZ
Fekqv/rPH8zdIN3absSlX+79VCokR95JrxjkFwIDAQABo0EwPzAOBgNVHQ8BAf8E
BAMCBaAwDAYDVR0TAQH/BAIwADAfBgNVHSMEGDAWgBQwrZjlaIwdBnegir6ZX4rf
wg8YQzANBgkqhkiG9w0BAQsFAAOCAQEASccwVEJ5L18vjkmkUGcZOuGZfchM4mqY
pHSQpJEmRalKE6Ci9mhUY9ijHVx19h8JYCUycK7shK2a024Jxj80tgUH7lvt3CUU
3fka3H8rqenGfYvKcQGu4/sp5G6C7Urt73y05n4itqojqX/EH5ie5lVCmnLaTD5O
rGbu5/wxlCL7U5pOE6AHOK8rHryRNIcy5WUmEtg834s68GOzU3lURDveITSRxH9U
FXuigxlTSyvbs4Kb/KIuZVo71IKvmg19NW086lja1NlI/Cvhiz6G7lzWZHYkWFAT
ytPQmBKGWBDeEph/kBi52auhlh1cpBguzXSufe0vB159nk6I+O43aQ==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIDYzCCAkugAwIBAgIQHUhe9rTL8xqZSBWoWMAKlzANBgkqhkiG9w0BAQsFADA4
MQwwCgYDVQQKEwNJQk0xEjAQBgNVBAsTCVdlYlNwaGVyZTEUMBIGA1UEAxMLV0xP
IFRlc3QgQ0EwIBcNMjMwNDExMTkxOTE5WhgPMjA1MzA0MDMwOTE5MTlaMDwxDDAK
BgNVBAoTA0lCTTESMBAGA1UECxMJV2ViU3BoZXJlMRgwFgYDVQQDEw9XTE8gVGVz
dCBJbnQgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC22iIaO0Or
cIjre8vYw97GpLLG9Hk8ini94Ac5ndBRqP6Ft/VYTxRSq79K9NdVY81FaPgpXAG1
dkXMRB6AV5ksb7rW3Pd05LxYIPwh+scuMQshLO6PC+5grJnVjGDqsVbZutKQrUXs
jB6ZabwdY+FzL9l7CKYr96aDnqw24XzAWO7oLCfO6UlT7E2RuqPsDgCmVi6fUjli
yqegJk7XO1wNTTGF0PwxtnVvTxXfj2yxWi+LYpdj3vS/Utooo6VuadXHZLQROAdi
0C+yGRlAW3rSDHD5RC9I1QxpdZ6OI5fVUow0LtGpu+xT93yCQg/NBb+BEAuPfl6B
Xilc23lQRsjNAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwICpDAPBgNVHRMBAf8EBTAD
AQH/MB0GA1UdDgQWBBQwrZjlaIwdBnegir6ZX4rfwg8YQzAfBgNVHSMEGDAWgBRO
O94eOb0mqo2C1+FsGP8fPHqsnTANBgkqhkiG9w0BAQsFAAOCAQEAlnb2K4bCWmVf
SWIhd2n4uXkqZZ0jv4sdDyB9E7bEZVcP9LOrd2y9AzEOoj60PH34CeiAASiAdnsA
hkMhfeuuhXqmiScRZOnpGv+7Zn2QtEzuyQR4jWypbazu7f/o3/PsCT/QWHF5wjby
iRQI8vOB8plJMHlEo5+VZWwQgwVliiLH+BoOsSUgAxwfJckTfHvJ+w2G0heLly93
tRanvHec4tOuWG+W/ndFgjUuN4ruGlwOQp1cDMqhyFLlUCxcvOPVJfQETuq09G3w
xShDUu0sZVfPbLCPBclFHqBo1hwX4O5QxF8ZhuQf2HQDzENnUSRLsZ2KQ0xsiB3K
O3reDUrwAw==
-----END CERTIFICATE-----`
tlsKey = `fakekey`
caCrt = `-----BEGIN CERTIFICATE-----
MIIDPjCCAiagAwIBAgIQP2PJh7eh2XwB44qQWNrQQjANBgkqhkiG9w0BAQsFADA4
MQwwCgYDVQQKEwNJQk0xEjAQBgNVBAsTCVdlYlNwaGVyZTEUMBIGA1UEAxMLV0xP
IFRlc3QgQ0EwIBcNMjMwNDExMTkxNjIzWhgPMjA1MzA0MDMxOTE2MjNaMDgxDDAK
BgNVBAoTA0lCTTESMBAGA1UECxMJV2ViU3BoZXJlMRQwEgYDVQQDEwtXTE8gVGVz
dCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJqE2F7Zxz99QX3
TsZeZXFjuUCkpmgzxak4bx3LrrIHuMLANkLiRwPfx/eYAHUKoyFVPSomYbsO4Ism
W9oMft371f8gTYw4Fhtd1CBHqUjvS2eG1cQvyp0BpyLffutXMYszt3xlvDOvJPi/
Pi5cviPs1mOah6vWw0U/4/9bxatmBHm9fOBfwAfkobNPapgEO6dq9PgazjsnKFEX
u4qCYB5tCOoAigs9JbJKkftz7lkIUNV/j57eoKXWhZ7jl0yIAobF88UvufsmvHl1
6TOG+NI9x2Lio4ktrMR84CCUtVfmlmwozZc94lAZzbgz+oFZ9Sqe2Lw5zhxsc8gy
f85pla0CAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgKkMA8GA1UdEwEB/wQFMAMBAf8w
HQYDVR0OBBYEFE473h45vSaqjYLX4WwY/x88eqydMA0GCSqGSIb3DQEBCwUAA4IB
AQCK8UUbsylNruQ7BiUvwS3juuDnwOetQUl8nfiYfjGxI16DnTyxm1U8gqJfe56y
1cHx7mCEp/S4Nzt0mHjmaXowef6m+oz/rWgYYUSCs1SV7acCtuWMw16g8Hw9Uf1o
HQ5/wVdxLQSdyk9aMmxc/J/3je6luwGQOQH2Atpy0sR+YnJrGLXELElyBdz5UVpG
EO/bg7zXzFr+MEyEjnUOV+iDlZ2fny3jDFDZDCbSxaS8ZjlU9yqrBQuHncYJtAhD
dSfynBwa4E2wECsYlpC9Kn39FhGYGNrgPEExtCsyRgTuexCag7hNCFMB3LqBjQow
hQRsBqxwjnK5AFLH7xQyhoWc
-----END CERTIFICATE-----`
caCertExpected = `-----BEGIN CERTIFICATE-----
MIIDPjCCAiagAwIBAgIQP2PJh7eh2XwB44qQWNrQQjANBgkqhkiG9w0BAQsFADA4
MQwwCgYDVQQKEwNJQk0xEjAQBgNVBAsTCVdlYlNwaGVyZTEUMBIGA1UEAxMLV0xP
IFRlc3QgQ0EwIBcNMjMwNDExMTkxNjIzWhgPMjA1MzA0MDMxOTE2MjNaMDgxDDAK
BgNVBAoTA0lCTTESMBAGA1UECxMJV2ViU3BoZXJlMRQwEgYDVQQDEwtXTE8gVGVz
dCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJqE2F7Zxz99QX3
TsZeZXFjuUCkpmgzxak4bx3LrrIHuMLANkLiRwPfx/eYAHUKoyFVPSomYbsO4Ism
W9oMft371f8gTYw4Fhtd1CBHqUjvS2eG1cQvyp0BpyLffutXMYszt3xlvDOvJPi/
Pi5cviPs1mOah6vWw0U/4/9bxatmBHm9fOBfwAfkobNPapgEO6dq9PgazjsnKFEX
u4qCYB5tCOoAigs9JbJKkftz7lkIUNV/j57eoKXWhZ7jl0yIAobF88UvufsmvHl1
6TOG+NI9x2Lio4ktrMR84CCUtVfmlmwozZc94lAZzbgz+oFZ9Sqe2Lw5zhxsc8gy
f85pla0CAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgKkMA8GA1UdEwEB/wQFMAMBAf8w
HQYDVR0OBBYEFE473h45vSaqjYLX4WwY/x88eqydMA0GCSqGSIb3DQEBCwUAA4IB
AQCK8UUbsylNruQ7BiUvwS3juuDnwOetQUl8nfiYfjGxI16DnTyxm1U8gqJfe56y
1cHx7mCEp/S4Nzt0mHjmaXowef6m+oz/rWgYYUSCs1SV7acCtuWMw16g8Hw9Uf1o
HQ5/wVdxLQSdyk9aMmxc/J/3je6luwGQOQH2Atpy0sR+YnJrGLXELElyBdz5UVpG
EO/bg7zXzFr+MEyEjnUOV+iDlZ2fny3jDFDZDCbSxaS8ZjlU9yqrBQuHncYJtAhD
dSfynBwa4E2wECsYlpC9Kn39FhGYGNrgPEExtCsyRgTuexCag7hNCFMB3LqBjQow
hQRsBqxwjnK5AFLH7xQyhoWc
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIDYzCCAkugAwIBAgIQHUhe9rTL8xqZSBWoWMAKlzANBgkqhkiG9w0BAQsFADA4
MQwwCgYDVQQKEwNJQk0xEjAQBgNVBAsTCVdlYlNwaGVyZTEUMBIGA1UEAxMLV0xP
IFRlc3QgQ0EwIBcNMjMwNDExMTkxOTE5WhgPMjA1MzA0MDMwOTE5MTlaMDwxDDAK
BgNVBAoTA0lCTTESMBAGA1UECxMJV2ViU3BoZXJlMRgwFgYDVQQDEw9XTE8gVGVz
dCBJbnQgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC22iIaO0Or
cIjre8vYw97GpLLG9Hk8ini94Ac5ndBRqP6Ft/VYTxRSq79K9NdVY81FaPgpXAG1
dkXMRB6AV5ksb7rW3Pd05LxYIPwh+scuMQshLO6PC+5grJnVjGDqsVbZutKQrUXs
jB6ZabwdY+FzL9l7CKYr96aDnqw24XzAWO7oLCfO6UlT7E2RuqPsDgCmVi6fUjli
yqegJk7XO1wNTTGF0PwxtnVvTxXfj2yxWi+LYpdj3vS/Utooo6VuadXHZLQROAdi
0C+yGRlAW3rSDHD5RC9I1QxpdZ6OI5fVUow0LtGpu+xT93yCQg/NBb+BEAuPfl6B
Xilc23lQRsjNAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwICpDAPBgNVHRMBAf8EBTAD
AQH/MB0GA1UdDgQWBBQwrZjlaIwdBnegir6ZX4rfwg8YQzAfBgNVHSMEGDAWgBRO
O94eOb0mqo2C1+FsGP8fPHqsnTANBgkqhkiG9w0BAQsFAAOCAQEAlnb2K4bCWmVf
SWIhd2n4uXkqZZ0jv4sdDyB9E7bEZVcP9LOrd2y9AzEOoj60PH34CeiAASiAdnsA
hkMhfeuuhXqmiScRZOnpGv+7Zn2QtEzuyQR4jWypbazu7f/o3/PsCT/QWHF5wjby
iRQI8vOB8plJMHlEo5+VZWwQgwVliiLH+BoOsSUgAxwfJckTfHvJ+w2G0heLly93
tRanvHec4tOuWG+W/ndFgjUuN4ruGlwOQp1cDMqhyFLlUCxcvOPVJfQETuq09G3w
xShDUu0sZVfPbLCPBclFHqBo1hwX4O5QxF8ZhuQf2HQDzENnUSRLsZ2KQ0xsiB3K
O3reDUrwAw==
-----END CERTIFICATE-----`
destCACrt = "fakedestcacrt"
)
func TestGetDiscoveryClient(t *testing.T) {
logger := zap.New()
logf.SetLogger(logger)
runtimecomponent := createRuntimeComponent(objMeta, spec)
objs, s := []runtime.Object{runtimecomponent}, scheme.Scheme
s.AddKnownTypes(appstacksv1.GroupVersion, runtimecomponent)
cl := fakeclient.NewFakeClient(objs...)
rcl := fakeclient.NewFakeClient(objs...)
r := NewReconcilerBase(rcl, cl, s, &rest.Config{}, record.NewFakeRecorder(10))
newDC, err := r.GetDiscoveryClient()
if newDC == nil {
t.Fatalf("GetDiscoverClient did not create a new discovery client. newDC: (%v) err: (%v)", newDC, err)
}
}
func TestCreateOrUpdate(t *testing.T) {
logger := zap.New()
logf.SetLogger(logger)
serviceAccount := &corev1.ServiceAccount{ObjectMeta: defaultMeta}
runtimecomponent := createRuntimeComponent(objMeta, spec)
objs, s := []runtime.Object{runtimecomponent}, scheme.Scheme
s.AddKnownTypes(appstacksv1.GroupVersion, runtimecomponent)
cl := fakeclient.NewFakeClient(objs...)
rcl := fakeclient.NewFakeClient(objs...)
r := NewReconcilerBase(rcl, cl, s, &rest.Config{}, record.NewFakeRecorder(10))
err := r.CreateOrUpdate(serviceAccount, runtimecomponent, func() error {
CustomizeServiceAccount(serviceAccount, runtimecomponent, r.GetClient())
return nil
})
testCOU := []Test{{"CreateOrUpdate error is nil", nil, err}}
verifyTests(testCOU, t)
}
func TestDeleteResources(t *testing.T) {
logger := zap.New()
logf.SetLogger(logger)
runtimecomponent := createRuntimeComponent(objMeta, spec)
objs, s := []runtime.Object{runtimecomponent}, scheme.Scheme
s.AddKnownTypes(appstacksv1.GroupVersion, runtimecomponent)
cl := fakeclient.NewFakeClient(objs...)
rcl := fakeclient.NewFakeClient(objs...)
r := NewReconcilerBase(rcl, cl, s, &rest.Config{}, record.NewFakeRecorder(10))
r.SetDiscoveryClient(createFakeDiscoveryClient())
nsn := types.NamespacedName{Name: "app", Namespace: "runtimecomponent"}
sa := &corev1.ServiceAccount{ObjectMeta: defaultMeta}
ss := &appsv1.StatefulSet{ObjectMeta: defaultMeta}
roList := []client.Object{sa, ss}
if err := r.GetClient().Create(context.TODO(), sa); err != nil {
t.Fatalf("Create ServiceAccount: (%v)", err)
}
if err := r.GetClient().Get(context.TODO(), nsn, sa); err != nil {
t.Fatalf("Get ServiceAccount (%v)", err)
}
if err := r.GetClient().Create(context.TODO(), ss); err != nil {
t.Fatalf("Create StatefulSet: (%v)", err)
}
if err := r.GetClient().Get(context.TODO(), nsn, ss); err != nil {
t.Fatalf("Get StatefulSet (%v)", err)
}
// Delete Resources
r.DeleteResources(roList)
if err := r.GetClient().Get(context.TODO(), nsn, sa); err == nil {
t.Fatalf("ServiceAccount was not deleted")
}
if err := r.GetClient().Get(context.TODO(), nsn, ss); err == nil {
t.Fatalf("StatefulSet was not deleted")
}
}
func TestGetOpConfigMap(t *testing.T) {
logger := zap.New()
logf.SetLogger(logger)
configMap := &corev1.ConfigMap{
ObjectMeta: metav1.ObjectMeta{Name: name, Namespace: namespace},
Data: map[string]string{
stack: `{"expose":true, "service":{"port": 3000,"type": "ClusterIP"}}`,
},
}
runtimecomponent := createRuntimeComponent(objMeta, spec)
objs, s := []runtime.Object{runtimecomponent}, scheme.Scheme
s.AddKnownTypes(appstacksv1.GroupVersion, runtimecomponent)
cl := fakeclient.NewFakeClient(objs...)
rcl := fakeclient.NewFakeClient(objs...)
r := NewReconcilerBase(rcl, cl, s, &rest.Config{}, record.NewFakeRecorder(10))
if err := r.GetClient().Create(context.TODO(), configMap); err != nil {
t.Fatalf("Create configMap: (%v)", err)
}
cm, err := r.GetOpConfigMap(name, namespace)
testGAOCM := []Test{
{"GetOpConfigMap error is nil", nil, err},
{"GetOpConfigMap ConfigMap is correct", true, reflect.DeepEqual(cm.Data, configMap.Data)},
}
verifyTests(testGAOCM, t)
}
func TestManageError(t *testing.T) {
logger := zap.New()
logf.SetLogger(logger)
err := fmt.Errorf("test-error")
runtimecomponent := createRuntimeComponent(objMeta, spec)
objs, s := []runtime.Object{runtimecomponent}, scheme.Scheme
s.AddKnownTypes(appstacksv1.GroupVersion, runtimecomponent)
cl := fakeclient.NewFakeClient(objs...)
rcl := fakeclient.NewFakeClient(objs...)
r := NewReconcilerBase(rcl, cl, s, &rest.Config{}, record.NewFakeRecorder(10))
rec, err := r.ManageError(err, common.StatusConditionTypeReconciled, runtimecomponent)
testME := []Test{
{"ManageError Requeue", true, rec.Requeue},
{"ManageError New Condition Status", corev1.ConditionFalse, runtimecomponent.Status.Conditions[0].Status},
}
verifyTests(testME, t)
}
func TestManageSuccess(t *testing.T) {
logger := zap.New()
logf.SetLogger(logger)
runtimecomponent := createRuntimeComponent(objMeta, spec)
objs, s := []runtime.Object{runtimecomponent}, scheme.Scheme
s.AddKnownTypes(appstacksv1.GroupVersion, runtimecomponent)
cl := fakeclient.NewFakeClient(objs...)
rcl := fakeclient.NewFakeClient(objs...)
r := NewReconcilerBase(rcl, cl, s, &rest.Config{}, record.NewFakeRecorder(10))
r.ManageSuccess(common.StatusConditionTypeReconciled, runtimecomponent)
testMS := []Test{
{"ManageSuccess New Condition Status", corev1.ConditionTrue, runtimecomponent.Status.Conditions[0].Status},
}
verifyTests(testMS, t)
}
func TestIsGroupVersionSupported(t *testing.T) {
logger := zap.New()
logf.SetLogger(logger)
runtimecomponent := createRuntimeComponent(objMeta, spec)
objs, s := []runtime.Object{runtimecomponent}, scheme.Scheme
s.AddKnownTypes(appstacksv1.GroupVersion, runtimecomponent)
cl := fakeclient.NewFakeClient(objs...)
rcl := fakeclient.NewFakeClient(objs...)
r := NewReconcilerBase(rcl, cl, s, &rest.Config{}, record.NewFakeRecorder(10))
fakeDiscoveryClient := &fakediscovery.FakeDiscovery{
Fake: &coretesting.Fake{Resources: []*metav1.APIResourceList{
{
GroupVersion: "abc/v1",
APIResources: []metav1.APIResource{
{Kind: "Test", Name: "tests", Group: "abc", Version: "v1"},
}}}},
}
r.SetDiscoveryClient(fakeDiscoveryClient)
ok, err := r.IsGroupVersionSupported("abc/v1", "Test")
if err != nil && ok {
t.Fatalf("Group version should be supported: (%v)", err)
}
ok, err = r.IsGroupVersionSupported("abc/v1", "Abc")
if err == nil && ok {
t.Fatalf("Group version should not be supported")
}
ok, err = r.IsGroupVersionSupported("abc/v2", "Test")
if err == nil && ok {
t.Fatalf("Group version should not be supported")
}
}
// testGetSvcTLSValues test part of the function GetRouteTLSValues in reconciler.go.
func testGetSvcTLSValues(t *testing.T) {
// Configure the runtime component
runtimecomponent := createRuntimeComponent(objMeta, spec)
expose := true
runtimecomponent.Spec.Expose = &expose
runtimecomponent.Spec.Service = &appstacksv1.RuntimeComponentService{
Port: 3000,
}
objs, s := []runtime.Object{runtimecomponent}, scheme.Scheme
s.AddKnownTypes(appstacksv1.GroupVersion, runtimecomponent)
// Deploy the expected secret
cl := fakeclient.NewFakeClient(objs...)
rcl := fakeclient.NewFakeClient(objs...)
secret := makeCertSecret("my-app-svc-tls", namespace)
runtimecomponent.Spec.Service.CertificateSecretRef = &secret.Name
if err := cl.Create(context.TODO(), secret); err != nil {
t.Fatal(err)
}
runtimecomponent.Status.SetReference(common.StatusReferenceCertSecretName, secret.Name)
// Use the reconciler to retrieve the secret
r := NewReconcilerBase(rcl, cl, s, &rest.Config{}, record.NewFakeRecorder(10))
key, cert, ca, destCa, err := r.GetRouteTLSValues(runtimecomponent)
if err != nil {
t.Fatal(err)
}
// Verify the results where only destCa should be retrieved.
testSTV := []Test{
{"Svc TLS Value - Key", "", key},
{"Svc TLS Value - Cert", "", cert},
{"Svc TLS Value - CA Cert", "", ca},
{"Svc TLS Value - Dest CA Cert", caCrt, destCa},
}
verifyTests(testSTV, t)
}
// testGetRouteTLSValues test the function GetRouteTLSValues in reconciler.go.
func testGetRouteTLSValues(t *testing.T) {
// Configure the rumtime component
runtimecomponent := createRuntimeComponent(objMeta, spec)
terminationPolicy := routev1.TLSTerminationReencrypt
secretRefName := "my-app-route-tls"
runtimecomponent.Spec.Expose = &expose
manageTLS := false
runtimecomponent.Spec.ManageTLS = &manageTLS
runtimecomponent.Spec.Route = &appstacksv1.RuntimeComponentRoute{
Host: "myapp.mycompany.com",
Termination: &terminationPolicy,
CertificateSecretRef: &secretRefName,
}
objs, s := []runtime.Object{runtimecomponent}, scheme.Scheme
s.AddKnownTypes(appstacksv1.GroupVersion, runtimecomponent)
// Create a fake client and a reconciler
cl := fakeclient.NewFakeClient(objs...)
rcl := fakeclient.NewFakeClient(objs...)
r := NewReconcilerBase(rcl, cl, s, &rest.Config{}, record.NewFakeRecorder(10))
// Make and deploy the secret for later retrieval
secret := makeCertSecret(secretRefName, namespace)
if err := cl.Create(context.TODO(), secret); err != nil {
t.Fatal(err)
}
// Use the reconciler to retrieve the secret
key, cert, ca, destCa, err := r.GetRouteTLSValues(runtimecomponent)
if err != nil {
t.Fatal(err)
}
// Verify the result
testRTV := []Test{
{"Route TLS Value - Key", key, tlsKey},
{"Route TLS Value - Cert", strings.Trim(cert, "\n"), routeCrtExpected},
{"Route TLS Value - CA Cert", ca, caCertExpected},
{"Route TLS Value - Dest CA Cert", destCa, destCACrt},
}
verifyTests(testRTV, t)
}
func TestGetRouteTLSValues(t *testing.T) {
logger := zap.New()
logf.SetLogger(logger)
// Test two scenarios: retrieving secret from service and retrieving secret from route
testGetSvcTLSValues(t)
testGetRouteTLSValues(t)
}
func createFakeDiscoveryClient() discovery.DiscoveryInterface {
fakeDiscoveryClient := &fakediscovery.FakeDiscovery{Fake: &coretesting.Fake{}}
fakeDiscoveryClient.Resources = []*metav1.APIResourceList{
{
GroupVersion: routev1.SchemeGroupVersion.String(),
APIResources: []metav1.APIResource{
{Name: "routes", Namespaced: true, Kind: "Route"},
},
},
{
GroupVersion: servingv1alpha1.SchemeGroupVersion.String(),
APIResources: []metav1.APIResource{
{Name: "services", Namespaced: true, Kind: "Service", SingularName: "service"},
},
},
}
return fakeDiscoveryClient
}
// makeCertSecret returns a pointer to a simple Secret object with fake values inside.
func makeCertSecret(n string, ns string) *corev1.Secret {
data := map[string][]byte{
"ca.crt": []byte(caCrt),
"tls.crt": []byte(tlsCrt),
"tls.key": []byte(tlsKey),
"destCA.crt": []byte(destCACrt),
}
secret := corev1.Secret{
ObjectMeta: metav1.ObjectMeta{
Name: n,
Namespace: ns,
},
Type: "kubernetes.io/tls",
Data: data,
}
return &secret
}