@@ -108,6 +108,16 @@ func TestUpdateCoreDNS(t *testing.T) {
108
108
"Corefile" : expectedCorefile ,
109
109
},
110
110
}
111
+ updatedCM := & corev1.ConfigMap {
112
+ ObjectMeta : metav1.ObjectMeta {
113
+ Name : coreDNSKey ,
114
+ Namespace : metav1 .NamespaceSystem ,
115
+ },
116
+ Data : map [string ]string {
117
+ "Corefile" : "updated-core-file" ,
118
+ "Corefile-backup" : expectedCorefile ,
119
+ },
120
+ }
111
121
kubeadmCM := & corev1.ConfigMap {
112
122
ObjectMeta : metav1.ObjectMeta {
113
123
Name : kubeadmConfigKey ,
@@ -124,15 +134,48 @@ func TestUpdateCoreDNS(t *testing.T) {
124
134
` ),
125
135
},
126
136
}
137
+ kubeadmCM181 := & corev1.ConfigMap {
138
+ ObjectMeta : metav1.ObjectMeta {
139
+ Name : kubeadmConfigKey ,
140
+ Namespace : metav1 .NamespaceSystem ,
141
+ },
142
+ Data : map [string ]string {
143
+ "ClusterConfiguration" : yaml .Raw (`
144
+ apiServer:
145
+ apiVersion: kubeadm.k8s.io/v1beta2
146
+ dns:
147
+ type: CoreDNS
148
+ imageTag: v1.8.1
149
+ imageRepository: k8s.gcr.io
150
+ kind: ClusterConfiguration
151
+ ` ),
152
+ },
153
+ }
154
+
155
+ oldCR := & rbacv1.ClusterRole {
156
+ TypeMeta : metav1.TypeMeta {
157
+ Kind : "ClusterRole" ,
158
+ APIVersion : "rbac.authorization.k8s.io/v1" ,
159
+ },
160
+ ObjectMeta : metav1.ObjectMeta {
161
+ Name : coreDNSClusterRoleName ,
162
+ },
163
+ }
164
+
165
+ semver1191 := semver .MustParse ("1.19.1" )
166
+ semver1221 := semver .MustParse ("1.22.1" )
167
+ semver1230 := semver .MustParse ("1.23.0" )
127
168
128
169
tests := []struct {
129
170
name string
130
171
kcp * controlplanev1.KubeadmControlPlane
131
172
migrator coreDNSMigrator
173
+ semver semver.Version
132
174
objs []client.Object
133
175
expectErr bool
134
176
expectUpdates bool
135
177
expectImage string
178
+ expectRules []rbacv1.PolicyRule
136
179
}{
137
180
{
138
181
name : "returns early without error if skip core dns annotation is present" ,
@@ -150,6 +193,7 @@ func TestUpdateCoreDNS(t *testing.T) {
150
193
},
151
194
},
152
195
},
196
+ semver : semver1191 ,
153
197
objs : []client.Object {badCM },
154
198
expectErr : false ,
155
199
},
@@ -160,23 +204,27 @@ func TestUpdateCoreDNS(t *testing.T) {
160
204
KubeadmConfigSpec : bootstrapv1.KubeadmConfigSpec {},
161
205
},
162
206
},
207
+ semver : semver1191 ,
163
208
objs : []client.Object {badCM },
164
209
expectErr : false ,
165
210
},
166
211
{
167
212
name : "returns early without error if CoreDNS info is not found" ,
168
213
kcp : validKCP ,
214
+ semver : semver1191 ,
169
215
expectErr : false ,
170
216
},
171
217
{
172
218
name : "returns error if there was a problem retrieving CoreDNS info" ,
173
219
kcp : validKCP ,
220
+ semver : semver1191 ,
174
221
objs : []client.Object {badCM },
175
222
expectErr : true ,
176
223
},
177
224
{
178
225
name : "returns early without error if CoreDNS fromImage == ToImage" ,
179
226
kcp : validKCP ,
227
+ semver : semver1191 ,
180
228
objs : []client.Object {depl , cm },
181
229
expectErr : false ,
182
230
},
@@ -198,6 +246,7 @@ func TestUpdateCoreDNS(t *testing.T) {
198
246
},
199
247
},
200
248
},
249
+ semver : semver1191 ,
201
250
objs : []client.Object {depl , cm },
202
251
expectErr : true ,
203
252
},
@@ -218,6 +267,7 @@ func TestUpdateCoreDNS(t *testing.T) {
218
267
},
219
268
},
220
269
},
270
+ semver : semver1191 ,
221
271
// no kubeadmConfigMap available so it will trigger an error
222
272
objs : []client.Object {depl , cm },
223
273
expectErr : true ,
@@ -242,6 +292,7 @@ func TestUpdateCoreDNS(t *testing.T) {
242
292
migrator : & fakeMigrator {
243
293
migrateErr : errors .New ("failed to migrate" ),
244
294
},
295
+ semver : semver1191 ,
245
296
objs : []client.Object {depl , cm , kubeadmCM },
246
297
expectErr : true ,
247
298
},
@@ -265,6 +316,7 @@ func TestUpdateCoreDNS(t *testing.T) {
265
316
migrator : & fakeMigrator {
266
317
migratedCorefile : "updated-core-file" ,
267
318
},
319
+ semver : semver1191 ,
268
320
objs : []client.Object {depl , cm , kubeadmCM },
269
321
expectErr : false ,
270
322
expectUpdates : true ,
@@ -290,6 +342,7 @@ func TestUpdateCoreDNS(t *testing.T) {
290
342
migrator : & fakeMigrator {
291
343
migratedCorefile : "updated-core-file" ,
292
344
},
345
+ semver : semver1191 ,
293
346
objs : []client.Object {deplWithImage ("k8s.gcr.io/some-repo/coredns:1.7.0" ), cm , kubeadmCM },
294
347
expectErr : false ,
295
348
expectUpdates : true ,
@@ -314,6 +367,7 @@ func TestUpdateCoreDNS(t *testing.T) {
314
367
migrator : & fakeMigrator {
315
368
migratedCorefile : "updated-core-file" ,
316
369
},
370
+ semver : semver1191 ,
317
371
objs : []client.Object {deplWithImage ("k8s.gcr.io/coredns:1.6.7" ), cm , kubeadmCM },
318
372
expectErr : false ,
319
373
expectUpdates : true ,
@@ -338,6 +392,7 @@ func TestUpdateCoreDNS(t *testing.T) {
338
392
migrator : & fakeMigrator {
339
393
migratedCorefile : "updated-core-file" ,
340
394
},
395
+ semver : semver1191 ,
341
396
objs : []client.Object {deplWithImage ("k8s.gcr.io/coredns:1.7.0" ), cm , kubeadmCM },
342
397
expectErr : false ,
343
398
expectUpdates : false ,
@@ -361,6 +416,7 @@ func TestUpdateCoreDNS(t *testing.T) {
361
416
migrator : & fakeMigrator {
362
417
migratedCorefile : "updated-core-file" ,
363
418
},
419
+ semver : semver1191 ,
364
420
objs : []client.Object {deplWithImage ("k8s.gcr.io/coredns:1.7.0" ), cm , kubeadmCM },
365
421
expectErr : false ,
366
422
expectUpdates : true ,
@@ -382,12 +438,61 @@ func TestUpdateCoreDNS(t *testing.T) {
382
438
},
383
439
},
384
440
},
441
+ semver : semver1191 ,
385
442
migrator : & fakeMigrator {
386
443
migratedCorefile : "updated-core-file" ,
387
444
},
388
445
objs : []client.Object {deplWithImage ("k8s.gcr.io/coredns/coredns:v1.8.0" ), cm , kubeadmCM },
389
446
expectErr : false ,
390
447
expectUpdates : false ,
448
+ expectRules : oldCR .Rules ,
449
+ },
450
+ {
451
+ name : "upgrade from Kubernetes v1.21.x to v1.22.y and update cluster role" ,
452
+ kcp : & controlplanev1.KubeadmControlPlane {
453
+ Spec : controlplanev1.KubeadmControlPlaneSpec {
454
+ KubeadmConfigSpec : bootstrapv1.KubeadmConfigSpec {
455
+ ClusterConfiguration : & bootstrapv1.ClusterConfiguration {
456
+ DNS : bootstrapv1.DNS {
457
+ ImageMeta : bootstrapv1.ImageMeta {
458
+ ImageRepository : "k8s.gcr.io" ,
459
+ ImageTag : "v1.8.1" , // NOTE: ImageTags requires the v prefix
460
+ },
461
+ },
462
+ },
463
+ },
464
+ },
465
+ },
466
+ migrator : & fakeMigrator {
467
+ migratedCorefile : "updated-core-file" ,
468
+ },
469
+ semver : semver1221 ,
470
+ objs : []client.Object {deplWithImage ("k8s.gcr.io/coredns/coredns:v1.8.1" ), updatedCM , kubeadmCM181 , oldCR },
471
+ expectErr : false ,
472
+ expectUpdates : true ,
473
+ expectImage : "k8s.gcr.io/coredns/coredns:v1.8.1" , // NOTE: ImageName has coredns/coredns
474
+ expectRules : coreDNS181PolicyRules ,
475
+ },
476
+ {
477
+ name : "returns early without error if kubernetes version is >= v1.23" ,
478
+ kcp : & controlplanev1.KubeadmControlPlane {
479
+ Spec : controlplanev1.KubeadmControlPlaneSpec {
480
+ KubeadmConfigSpec : bootstrapv1.KubeadmConfigSpec {
481
+ ClusterConfiguration : & bootstrapv1.ClusterConfiguration {
482
+ DNS : bootstrapv1.DNS {
483
+ ImageMeta : bootstrapv1.ImageMeta {
484
+ ImageRepository : "k8s.gcr.io" ,
485
+ ImageTag : "v1.8.1" , // NOTE: ImageTags requires the v prefix
486
+ },
487
+ },
488
+ },
489
+ },
490
+ },
491
+ },
492
+ semver : semver1230 ,
493
+ objs : []client.Object {deplWithImage ("k8s.gcr.io/coredns/coredns:v1.8.1" ), updatedCM , kubeadmCM181 },
494
+ expectErr : false ,
495
+ expectRules : oldCR .Rules ,
391
496
},
392
497
}
393
498
@@ -412,7 +517,7 @@ func TestUpdateCoreDNS(t *testing.T) {
412
517
Client : env .GetClient (),
413
518
CoreDNSMigrator : tt .migrator ,
414
519
}
415
- err := w .UpdateCoreDNS (ctx , tt .kcp , semver . MustParse ( "1.19.1" ) )
520
+ err := w .UpdateCoreDNS (ctx , tt .kcp , tt . semver )
416
521
417
522
if tt .expectErr {
418
523
g .Expect (err ).To (HaveOccurred ())
@@ -455,6 +560,15 @@ func TestUpdateCoreDNS(t *testing.T) {
455
560
g .Expect (env .Get (ctx , client.ObjectKey {Name : coreDNSKey , Namespace : metav1 .NamespaceSystem }, & actualDeployment )).To (Succeed ())
456
561
return actualDeployment .Spec .Template .Spec .Containers [0 ].Image
457
562
}, "5s" ).Should (Equal (tt .expectImage ))
563
+
564
+ // assert CoreDNS ClusterRole
565
+ if tt .expectRules != nil {
566
+ var actualClusterRole rbacv1.ClusterRole
567
+ g .Eventually (func () []rbacv1.PolicyRule {
568
+ g .Expect (env .Get (ctx , client.ObjectKey {Name : coreDNSClusterRoleName }, & actualClusterRole )).To (Succeed ())
569
+ return actualClusterRole .Rules
570
+ }, "5s" ).Should (Equal (tt .expectRules ))
571
+ }
458
572
}
459
573
})
460
574
}
@@ -550,6 +664,7 @@ func TestUpdateCoreDNSClusterRole(t *testing.T) {
550
664
name string
551
665
kubernetesVersion semver.Version
552
666
coreDNSVersion string
667
+ sourceCoreDNSVersion string
553
668
coreDNSPolicyRules []rbacv1.PolicyRule
554
669
expectErr bool
555
670
expectCoreDNSPolicyRules []rbacv1.PolicyRule
@@ -568,38 +683,51 @@ func TestUpdateCoreDNSClusterRole(t *testing.T) {
568
683
coreDNSPolicyRules : coreDNS180PolicyRules ,
569
684
expectCoreDNSPolicyRules : coreDNS180PolicyRules ,
570
685
},
686
+ {
687
+ name : "does not patch ClusterRole: Kubernetes > 1.22 && CoreDNS >= 1.8.1" ,
688
+ kubernetesVersion : semver.Version {Major : 1 , Minor : 23 , Patch : 0 },
689
+ coreDNSVersion : "1.8.1" ,
690
+ sourceCoreDNSVersion : "1.8.1" ,
691
+ coreDNSPolicyRules : coreDNS180PolicyRules ,
692
+ expectCoreDNSPolicyRules : coreDNS180PolicyRules ,
693
+ },
571
694
{
572
695
name : "does not patch ClusterRole: CoreDNS < 1.8.1" ,
573
696
kubernetesVersion : semver.Version {Major : 1 , Minor : 22 , Patch : 0 },
574
697
coreDNSVersion : "1.8.0" ,
698
+ sourceCoreDNSVersion : "1.7.0" ,
575
699
coreDNSPolicyRules : coreDNS180PolicyRules ,
576
700
expectCoreDNSPolicyRules : coreDNS180PolicyRules ,
577
701
},
578
702
{
579
703
name : "patch ClusterRole: Kubernetes == 1.22 alpha and CoreDNS == 1.8.1" ,
580
704
kubernetesVersion : semver.Version {Major : 1 , Minor : 22 , Patch : 0 , Pre : []semver.PRVersion {{VersionStr : "alpha" }}},
581
705
coreDNSVersion : "1.8.1" ,
706
+ sourceCoreDNSVersion : "1.8.1" ,
582
707
coreDNSPolicyRules : coreDNS180PolicyRules ,
583
708
expectCoreDNSPolicyRules : coreDNS181PolicyRules ,
584
709
},
585
710
{
586
711
name : "patch ClusterRole: Kubernetes == 1.22 and CoreDNS == 1.8.1" ,
587
712
kubernetesVersion : semver.Version {Major : 1 , Minor : 22 , Patch : 0 },
588
713
coreDNSVersion : "1.8.1" ,
714
+ sourceCoreDNSVersion : "1.8.1" ,
589
715
coreDNSPolicyRules : coreDNS180PolicyRules ,
590
716
expectCoreDNSPolicyRules : coreDNS181PolicyRules ,
591
717
},
592
718
{
593
719
name : "patch ClusterRole: Kubernetes > 1.22 and CoreDNS > 1.8.1" ,
594
720
kubernetesVersion : semver.Version {Major : 1 , Minor : 22 , Patch : 2 },
595
721
coreDNSVersion : "1.8.5" ,
722
+ sourceCoreDNSVersion : "1.8.1" ,
596
723
coreDNSPolicyRules : coreDNS180PolicyRules ,
597
724
expectCoreDNSPolicyRules : coreDNS181PolicyRules ,
598
725
},
599
726
{
600
727
name : "patch ClusterRole: Kubernetes > 1.22 and CoreDNS > 1.8.1: no-op" ,
601
728
kubernetesVersion : semver.Version {Major : 1 , Minor : 22 , Patch : 2 },
602
729
coreDNSVersion : "1.8.5" ,
730
+ sourceCoreDNSVersion : "1.8.5" ,
603
731
coreDNSPolicyRules : coreDNS181PolicyRules ,
604
732
expectCoreDNSPolicyRules : coreDNS181PolicyRules ,
605
733
},
@@ -622,7 +750,7 @@ func TestUpdateCoreDNSClusterRole(t *testing.T) {
622
750
Client : fakeClient ,
623
751
}
624
752
625
- err := w .updateCoreDNSClusterRole (ctx , tt .kubernetesVersion , & coreDNSInfo {ToImageTag : tt .coreDNSVersion })
753
+ err := w .updateCoreDNSClusterRole (ctx , tt .kubernetesVersion , & coreDNSInfo {ToImageTag : tt .coreDNSVersion , FromImageTag : tt . sourceCoreDNSVersion })
626
754
627
755
if tt .expectErr {
628
756
g .Expect (err ).To (HaveOccurred ())
0 commit comments