@@ -22,7 +22,7 @@ import (
22
22
"github.com/openshift/origin/pkg/cmd/server/crypto/extensions"
23
23
)
24
24
25
- func controllerSetup (startingObjects []runtime.Object , stopChannel chan struct {}, t * testing.T ) ( /*caName*/ string , * fake.Clientset , * watch.FakeWatcher , * ServiceServingCertController ) {
25
+ func controllerSetup (startingObjects []runtime.Object , stopChannel chan struct {}, t * testing.T ) ( /*caName*/ string , * fake.Clientset , * watch.FakeWatcher , * watch. FakeWatcher , * ServiceServingCertController ) {
26
26
certDir , err := ioutil .TempDir ("" , "serving-cert-unit-" )
27
27
if err != nil {
28
28
t .Fatalf ("unexpected error: %v" , err )
@@ -42,17 +42,21 @@ func controllerSetup(startingObjects []runtime.Object, stopChannel chan struct{}
42
42
43
43
kubeclient := fake .NewSimpleClientset (startingObjects ... )
44
44
fakeWatch := watch .NewFake ()
45
+ fakeSecretWatch := watch .NewFake ()
45
46
kubeclient .PrependReactor ("create" , "*" , func (action core.Action ) (handled bool , ret runtime.Object , err error ) {
46
47
return true , action .(core.CreateAction ).GetObject (), nil
47
48
})
48
49
kubeclient .PrependReactor ("update" , "*" , func (action core.Action ) (handled bool , ret runtime.Object , err error ) {
49
50
return true , action .(core.UpdateAction ).GetObject (), nil
50
51
})
51
- kubeclient .PrependWatchReactor ("*" , core .DefaultWatchReactor (fakeWatch , nil ))
52
+ kubeclient .PrependWatchReactor ("services" , core .DefaultWatchReactor (fakeWatch , nil ))
53
+ kubeclient .PrependWatchReactor ("secrets" , core .DefaultWatchReactor (fakeSecretWatch , nil ))
52
54
53
55
controller := NewServiceServingCertController (kubeclient .Core (), kubeclient .Core (), ca , "cluster.local" , 10 * time .Minute )
56
+ controller .serviceHasSynced = func () bool { return true }
57
+ controller .secretHasSynced = func () bool { return true }
54
58
55
- return caOptions .Name , kubeclient , fakeWatch , controller
59
+ return caOptions .Name , kubeclient , fakeWatch , fakeSecretWatch , controller
56
60
}
57
61
58
62
func checkGeneratedCertificate (t * testing.T , certData []byte , service * kapi.Service ) {
@@ -105,7 +109,7 @@ func TestBasicControllerFlow(t *testing.T) {
105
109
defer close (stopChannel )
106
110
received := make (chan bool )
107
111
108
- caName , kubeclient , fakeWatch , controller := controllerSetup ([]runtime.Object {}, stopChannel , t )
112
+ caName , kubeclient , fakeWatch , _ , controller := controllerSetup ([]runtime.Object {}, stopChannel , t )
109
113
controller .syncHandler = func (serviceKey string ) error {
110
114
defer func () { received <- true }()
111
115
@@ -200,7 +204,7 @@ func TestAlreadyExistingSecretControllerFlow(t *testing.T) {
200
204
existingSecret .Type = kapi .SecretTypeTLS
201
205
existingSecret .Annotations = expectedSecretAnnotations
202
206
203
- caName , kubeclient , fakeWatch , controller := controllerSetup ([]runtime.Object {existingSecret }, stopChannel , t )
207
+ caName , kubeclient , fakeWatch , _ , controller := controllerSetup ([]runtime.Object {existingSecret }, stopChannel , t )
204
208
kubeclient .PrependReactor ("create" , "secrets" , func (action core.Action ) (handled bool , ret runtime.Object , err error ) {
205
209
return true , & kapi.Secret {}, kapierrors .NewAlreadyExists (kapi .Resource ("secrets" ), "new-secret" )
206
210
})
@@ -277,7 +281,7 @@ func TestAlreadyExistingSecretForDifferentUIDControllerFlow(t *testing.T) {
277
281
existingSecret .Type = kapi .SecretTypeTLS
278
282
existingSecret .Annotations = map [string ]string {ServiceUIDAnnotation : "wrong-uid" , ServiceNameAnnotation : serviceName }
279
283
280
- _ , kubeclient , fakeWatch , controller := controllerSetup ([]runtime.Object {existingSecret }, stopChannel , t )
284
+ _ , kubeclient , fakeWatch , _ , controller := controllerSetup ([]runtime.Object {existingSecret }, stopChannel , t )
281
285
kubeclient .PrependReactor ("create" , "secrets" , func (action core.Action ) (handled bool , ret runtime.Object , err error ) {
282
286
return true , & kapi.Secret {}, kapierrors .NewAlreadyExists (kapi .Resource ("secrets" ), "new-secret" )
283
287
})
@@ -347,7 +351,7 @@ func TestSecretCreationErrorControllerFlow(t *testing.T) {
347
351
serviceUID := "some-uid"
348
352
namespace := "ns"
349
353
350
- _ , kubeclient , fakeWatch , controller := controllerSetup ([]runtime.Object {}, stopChannel , t )
354
+ _ , kubeclient , fakeWatch , _ , controller := controllerSetup ([]runtime.Object {}, stopChannel , t )
351
355
kubeclient .PrependReactor ("create" , "secrets" , func (action core.Action ) (handled bool , ret runtime.Object , err error ) {
352
356
return true , & kapi.Secret {}, kapierrors .NewForbidden (kapi .Resource ("secrets" ), "new-secret" , fmt .Errorf ("any reason" ))
353
357
})
@@ -409,7 +413,7 @@ func TestSkipGenerationControllerFlow(t *testing.T) {
409
413
serviceUID := "some-uid"
410
414
namespace := "ns"
411
415
412
- caName , kubeclient , fakeWatch , controller := controllerSetup ([]runtime.Object {}, stopChannel , t )
416
+ caName , kubeclient , fakeWatch , _ , controller := controllerSetup ([]runtime.Object {}, stopChannel , t )
413
417
kubeclient .PrependReactor ("update" , "service" , func (action core.Action ) (handled bool , ret runtime.Object , err error ) {
414
418
return true , & kapi.Service {}, kapierrors .NewForbidden (kapi .Resource ("fdsa" ), "new-service" , fmt .Errorf ("any service reason" ))
415
419
})
@@ -470,3 +474,136 @@ func TestSkipGenerationControllerFlow(t *testing.T) {
470
474
}
471
475
}
472
476
}
477
+
478
+ func TestRecreateSecretControllerFlow (t * testing.T ) {
479
+ stopChannel := make (chan struct {})
480
+ defer close (stopChannel )
481
+ received := make (chan bool )
482
+
483
+ caName , kubeclient , fakeWatch , fakeSecretWatch , controller := controllerSetup ([]runtime.Object {}, stopChannel , t )
484
+ controller .syncHandler = func (serviceKey string ) error {
485
+ defer func () { received <- true }()
486
+
487
+ err := controller .syncService (serviceKey )
488
+ if err != nil {
489
+ t .Errorf ("unexpected error: %v" , err )
490
+ }
491
+
492
+ return err
493
+ }
494
+ go controller .Run (1 , stopChannel )
495
+
496
+ expectedSecretName := "new-secret"
497
+ serviceName := "svc-name"
498
+ serviceUID := "some-uid"
499
+ expectedServiceAnnotations := map [string ]string {ServingCertSecretAnnotation : expectedSecretName , ServingCertCreatedByAnnotation : caName }
500
+ expectedSecretAnnotations := map [string ]string {ServiceUIDAnnotation : serviceUID , ServiceNameAnnotation : serviceName }
501
+ namespace := "ns"
502
+
503
+ serviceToAdd := & kapi.Service {}
504
+ serviceToAdd .Name = serviceName
505
+ serviceToAdd .Namespace = namespace
506
+ serviceToAdd .UID = types .UID (serviceUID )
507
+ serviceToAdd .Annotations = map [string ]string {ServingCertSecretAnnotation : expectedSecretName }
508
+ fakeWatch .Add (serviceToAdd )
509
+
510
+ secretToDelete := & kapi.Secret {}
511
+ secretToDelete .Name = expectedSecretName
512
+ secretToDelete .Namespace = namespace
513
+ secretToDelete .Annotations = map [string ]string {ServiceNameAnnotation : serviceName }
514
+
515
+ t .Log ("waiting to reach syncHandler" )
516
+ select {
517
+ case <- received :
518
+ case <- time .After (time .Duration (30 * time .Second )):
519
+ t .Fatalf ("failed to call into syncService" )
520
+ }
521
+
522
+ foundSecret := false
523
+ foundServiceUpdate := false
524
+ for _ , action := range kubeclient .Actions () {
525
+ switch {
526
+ case action .Matches ("create" , "secrets" ):
527
+ createSecret := action .(core.CreateAction )
528
+ newSecret := createSecret .GetObject ().(* kapi.Secret )
529
+ if newSecret .Name != expectedSecretName {
530
+ t .Errorf ("expected %v, got %v" , expectedSecretName , newSecret .Name )
531
+ continue
532
+ }
533
+ if newSecret .Namespace != namespace {
534
+ t .Errorf ("expected %v, got %v" , namespace , newSecret .Namespace )
535
+ continue
536
+ }
537
+ delete (newSecret .Annotations , ServingCertExpiryAnnotation )
538
+ if ! reflect .DeepEqual (newSecret .Annotations , expectedSecretAnnotations ) {
539
+ t .Errorf ("expected %v, got %v" , expectedSecretAnnotations , newSecret .Annotations )
540
+ continue
541
+ }
542
+
543
+ checkGeneratedCertificate (t , newSecret .Data ["tls.crt" ], serviceToAdd )
544
+ foundSecret = true
545
+
546
+ case action .Matches ("update" , "services" ):
547
+ updateService := action .(core.UpdateAction )
548
+ service := updateService .GetObject ().(* kapi.Service )
549
+ if ! reflect .DeepEqual (service .Annotations , expectedServiceAnnotations ) {
550
+ t .Errorf ("expected %v, got %v" , expectedServiceAnnotations , service .Annotations )
551
+ continue
552
+ }
553
+ foundServiceUpdate = true
554
+
555
+ }
556
+ }
557
+
558
+ if ! foundSecret {
559
+ t .Errorf ("secret wasn't created. Got %v\n " , kubeclient .Actions ())
560
+ }
561
+ if ! foundServiceUpdate {
562
+ t .Errorf ("service wasn't updated. Got %v\n " , kubeclient .Actions ())
563
+ }
564
+
565
+ kubeclient .ClearActions ()
566
+ fakeSecretWatch .Add (secretToDelete )
567
+ fakeSecretWatch .Delete (secretToDelete )
568
+
569
+ t .Log ("waiting to reach syncHandler" )
570
+ select {
571
+ case <- received :
572
+ case <- time .After (time .Duration (30 * time .Second )):
573
+ t .Fatalf ("failed to call into syncService" )
574
+ }
575
+
576
+ for _ , action := range kubeclient .Actions () {
577
+ switch {
578
+ case action .Matches ("create" , "secrets" ):
579
+ createSecret := action .(core.CreateAction )
580
+ newSecret := createSecret .GetObject ().(* kapi.Secret )
581
+ if newSecret .Name != expectedSecretName {
582
+ t .Errorf ("expected %v, got %v" , expectedSecretName , newSecret .Name )
583
+ continue
584
+ }
585
+ if newSecret .Namespace != namespace {
586
+ t .Errorf ("expected %v, got %v" , namespace , newSecret .Namespace )
587
+ continue
588
+ }
589
+ delete (newSecret .Annotations , ServingCertExpiryAnnotation )
590
+ if ! reflect .DeepEqual (newSecret .Annotations , expectedSecretAnnotations ) {
591
+ t .Errorf ("expected %v, got %v" , expectedSecretAnnotations , newSecret .Annotations )
592
+ continue
593
+ }
594
+
595
+ checkGeneratedCertificate (t , newSecret .Data ["tls.crt" ], serviceToAdd )
596
+ foundSecret = true
597
+
598
+ case action .Matches ("update" , "services" ):
599
+ updateService := action .(core.UpdateAction )
600
+ service := updateService .GetObject ().(* kapi.Service )
601
+ if ! reflect .DeepEqual (service .Annotations , expectedServiceAnnotations ) {
602
+ t .Errorf ("expected %v, got %v" , expectedServiceAnnotations , service .Annotations )
603
+ continue
604
+ }
605
+ foundServiceUpdate = true
606
+
607
+ }
608
+ }
609
+ }
0 commit comments