@@ -944,3 +944,146 @@ func TestGetOverrideSchedulingFor(t *testing.T) {
944944 })
945945 }
946946}
947+
948+ func TestGetOverrideReplicasFor (t * testing.T ) {
949+ tests := []struct {
950+ name string
951+ certManagerObj v1alpha1.CertManager
952+ deploymentName string
953+ expectedOverrideReplicas int32
954+ }{
955+ {
956+ name : "get override replicas of cert manager controller config" ,
957+ certManagerObj : v1alpha1.CertManager {
958+ ObjectMeta : metav1.ObjectMeta {
959+ Name : "cluster" ,
960+ },
961+ Spec : v1alpha1.CertManagerSpec {
962+ ControllerConfig : & v1alpha1.DeploymentConfig {
963+ OverrideReplicas : 2 ,
964+ },
965+ },
966+ },
967+ deploymentName : certmanagerControllerDeployment ,
968+ expectedOverrideReplicas : 2 ,
969+ },
970+ {
971+ name : "get override scheduling of cert manager webhook config" ,
972+ certManagerObj : v1alpha1.CertManager {
973+ ObjectMeta : metav1.ObjectMeta {
974+ Name : "cluster" ,
975+ },
976+ Spec : v1alpha1.CertManagerSpec {
977+ WebhookConfig : & v1alpha1.DeploymentConfig {
978+ OverrideReplicas : 0 ,
979+ },
980+ },
981+ },
982+ deploymentName : certmanagerWebhookDeployment ,
983+ expectedOverrideReplicas : 0 ,
984+ },
985+ {
986+ name : "get override scheduling of cert manager cainjector config" ,
987+ certManagerObj : v1alpha1.CertManager {
988+ ObjectMeta : metav1.ObjectMeta {
989+ Name : "cluster" ,
990+ },
991+ Spec : v1alpha1.CertManagerSpec {
992+ CAInjectorConfig : & v1alpha1.DeploymentConfig {
993+ OverrideReplicas : 2 ,
994+ },
995+ },
996+ },
997+ deploymentName : certmanagerCAinjectorDeployment ,
998+ expectedOverrideReplicas : 2 ,
999+ },
1000+ }
1001+
1002+ ctx , cancel := context .WithCancel (context .Background ())
1003+ defer cancel ()
1004+
1005+ // Create channel to know when the watch has started.
1006+ watcherStarted := make (chan struct {})
1007+ // Create the fake client.
1008+ fakeClient := fake .NewSimpleClientset ()
1009+ // A watch reactor for cert manager objects that allows the injection of the watcherStarted channel.
1010+ fakeClient .PrependWatchReactor ("certmanagers" , func (action clienttesting.Action ) (handled bool , ret watch.Interface , err error ) {
1011+ gvr := action .GetResource ()
1012+ ns := action .GetNamespace ()
1013+ watch , err := fakeClient .Tracker ().Watch (gvr , ns )
1014+ if err != nil {
1015+ return false , nil , err
1016+ }
1017+ close (watcherStarted )
1018+ return true , watch , nil
1019+ })
1020+
1021+ // Create cert manager informers using the fake client.
1022+ certManagerInformers := certmanoperatorinformer .NewSharedInformerFactory (fakeClient , 0 ).Operator ().V1alpha1 ().CertManagers ()
1023+
1024+ // Create a channel to receive the cert manager objects from the informer.
1025+ certManagerChan := make (chan * v1alpha1.CertManager , 1 )
1026+
1027+ // Add event handlers to the informer to write the cert manager objects to
1028+ // the channel received during the add and the delete events.
1029+ certManagerInformers .Informer ().AddEventHandler (cache.ResourceEventHandlerFuncs {
1030+ AddFunc : func (obj interface {}) {
1031+ certManagerObj := obj .(* v1alpha1.CertManager )
1032+ t .Logf ("cert manager obj added: %s" , certManagerObj .Name )
1033+ certManagerChan <- certManagerObj
1034+ },
1035+ DeleteFunc : func (obj interface {}) {
1036+ certManagerObj := obj .(* v1alpha1.CertManager )
1037+ t .Logf ("cert manager obj deleted: %s" , certManagerObj .Name )
1038+ certManagerChan <- certManagerObj
1039+ },
1040+ })
1041+
1042+ // Make sure informer is running.
1043+ go certManagerInformers .Informer ().Run (ctx .Done ())
1044+
1045+ // This is not required in tests, but it serves as a proof-of-concept by
1046+ // ensuring that the informer goroutine have warmed up and called List before
1047+ // we send any events to it.
1048+ cache .WaitForCacheSync (ctx .Done (), certManagerInformers .Informer ().HasSynced )
1049+
1050+ // The fake client doesn't support resource version. Any writes to the client
1051+ // after the informer's initial LIST and before the informer establishing the
1052+ // watcher will be missed by the informer. Therefore we wait until the watcher
1053+ // starts.
1054+ <- watcherStarted
1055+
1056+ for _ , tc := range tests {
1057+ t .Run (tc .name , func (t * testing.T ) {
1058+ // Create the cert manager object using the fake client.
1059+ _ , err := fakeClient .OperatorV1alpha1 ().CertManagers ().Create (ctx , & tc .certManagerObj , metav1.CreateOptions {})
1060+ if err != nil {
1061+ t .Fatalf ("error injecting cert manager add: %v" , err )
1062+ }
1063+
1064+ // Wait for the informer to get the event.
1065+ select {
1066+ case <- certManagerChan :
1067+ case <- time .After (wait .ForeverTestTimeout ):
1068+ t .Fatal ("Informer did not get the added cert manager object" )
1069+ }
1070+
1071+ actualOverrideReplicas , err := getOverrideReplicasFor (certManagerInformers , tc .deploymentName )
1072+ assert .NoError (t , err )
1073+ require .Equal (t , tc .expectedOverrideReplicas , actualOverrideReplicas )
1074+
1075+ // Delete the cert manager object using the fake client.
1076+ err = fakeClient .OperatorV1alpha1 ().CertManagers ().Delete (ctx , tc .certManagerObj .Name , metav1.DeleteOptions {})
1077+ if err != nil {
1078+ t .Fatalf ("error deleting cert manager add: %v" , err )
1079+ }
1080+
1081+ // Wait for the informer to get the event.
1082+ select {
1083+ case <- certManagerChan :
1084+ case <- time .After (wait .ForeverTestTimeout ):
1085+ t .Fatal ("Informer did not get the deleted cert manager" )
1086+ }
1087+ })
1088+ }
1089+ }
0 commit comments