@@ -59,6 +59,8 @@ var operatorConfigs = map[string]string{
59
59
}
60
60
var operatorConfigsAppliers = map [string ]func () error {}
61
61
62
+ const EXPERIMENTAL_DISABLE_PSI_CHECK = "EXPERIMENTAL_DISABLE_PSI_CHECK"
63
+
62
64
func TestMain (m * testing.M ) {
63
65
if os .Getenv ("KUBECONFIG" ) == "" {
64
66
klog .Errorf ("KUBECONFIG environment variable not set" )
@@ -265,6 +267,24 @@ func TestSoftTainterDeployment(t *testing.T) {
265
267
}
266
268
}(ctx , kubeClient )
267
269
270
+ // patch the operator deployment to mock PSI
271
+ prevDisablePSIcheck , foundDisablePSIcheck := os .LookupEnv (EXPERIMENTAL_DISABLE_PSI_CHECK )
272
+ if err := mockPSIEnv (ctx , kubeClient ); err != nil {
273
+ t .Fatalf ("Failed mocking PSI path enviromental variable to the operator depoyment: %v" , err )
274
+ }
275
+ defer func (ctx context.Context , kubeClient * k8sclient.Clientset , prevDisablePSIcheck string , foundDisablePSIcheck bool ) {
276
+ err := unmockPSIEnv (ctx , kubeClient , prevDisablePSIcheck , foundDisablePSIcheck )
277
+ if err != nil {
278
+ t .Fatalf ("Failed PSI path enviromental variable: %v" , err )
279
+ }
280
+ }(ctx , kubeClient , prevDisablePSIcheck , foundDisablePSIcheck )
281
+ // wait for descheduler operator pod to be running
282
+ deschOpPod , err := waitForPodRunningByNamePrefix (ctx , kubeClient , operatorclient .OperatorNamespace , operatorclient .OperandName , operatorclient .OperandName + "-operator" )
283
+ if err != nil {
284
+ t .Fatalf ("Unable to wait for the Descheduler operator pod to run" )
285
+ }
286
+ klog .Infof ("Descheduler pod running in %v" , deschOpPod .Name )
287
+
268
288
// apply devKubeVirtRelieveAndMigrate CR for the operator
269
289
if err := operatorConfigsAppliers [kubeVirtRelieveAndMigrateConf ](); err != nil {
270
290
t .Fatalf ("Unable to apply a CR for Descheduler operator: %v" , err )
@@ -358,6 +378,24 @@ func TestSoftTainterVAP(t *testing.T) {
358
378
}
359
379
}(ctx , kubeClient )
360
380
381
+ // patch the operator deployment to mock PSI
382
+ prevDisablePSIcheck , foundDisablePSIcheck := os .LookupEnv (EXPERIMENTAL_DISABLE_PSI_CHECK )
383
+ if err := mockPSIEnv (ctx , kubeClient ); err != nil {
384
+ t .Fatalf ("Failed mocking PSI path enviromental variable to the operator depoyment: %v" , err )
385
+ }
386
+ defer func (ctx context.Context , kubeClient * k8sclient.Clientset , prevDisablePSIcheck string , foundDisablePSIcheck bool ) {
387
+ err := unmockPSIEnv (ctx , kubeClient , prevDisablePSIcheck , foundDisablePSIcheck )
388
+ if err != nil {
389
+ t .Fatalf ("Failed PSI path enviromental variable: %v" , err )
390
+ }
391
+ }(ctx , kubeClient , prevDisablePSIcheck , foundDisablePSIcheck )
392
+ // wait for descheduler operator pod to be running
393
+ deschOpPod , err := waitForPodRunningByNamePrefix (ctx , kubeClient , operatorclient .OperatorNamespace , operatorclient .OperandName , operatorclient .OperandName + "-operator" )
394
+ if err != nil {
395
+ t .Fatalf ("Unable to wait for the Descheduler operator pod to run" )
396
+ }
397
+ klog .Infof ("Descheduler pod running in %v" , deschOpPod .Name )
398
+
361
399
// apply devKubeVirtRelieveAndMigrate CR for the operator
362
400
if err := operatorConfigsAppliers [kubeVirtRelieveAndMigrateConf ](); err != nil {
363
401
t .Fatalf ("Unable to apply a CR for Descheduler operator: %v" , err )
@@ -825,6 +863,27 @@ func updateNodeAndRetryOnConflicts(ctx context.Context, kubeClient *k8sclient.Cl
825
863
return nil
826
864
}
827
865
866
+ func updateDeploymentAndRetryOnConflicts (ctx context.Context , kubeClient * k8sclient.Clientset , deployment * appsv1.Deployment , opts metav1.UpdateOptions ) error {
867
+ uDeployment , uerr := kubeClient .AppsV1 ().Deployments (deployment .Namespace ).Update (ctx , deployment , opts )
868
+ if uerr != nil {
869
+ if apierrors .IsConflict (uerr ) {
870
+ if uDeployment .Name == "" {
871
+ uDeployment , uerr = kubeClient .AppsV1 ().Deployments (uDeployment .Namespace ).Get (ctx , uDeployment .Name , metav1.GetOptions {})
872
+ if uerr != nil {
873
+ return uerr
874
+ }
875
+ }
876
+ deployment .Spec .DeepCopyInto (& uDeployment .Spec )
877
+ uDeployment .ObjectMeta .Labels = deployment .ObjectMeta .Labels
878
+ uDeployment .ObjectMeta .Annotations = deployment .ObjectMeta .Annotations
879
+ _ , err := kubeClient .AppsV1 ().Deployments (deployment .Namespace ).Update (ctx , deployment , opts )
880
+ return err
881
+ }
882
+ return uerr
883
+ }
884
+ return nil
885
+ }
886
+
828
887
func tryUpdatingTaintWithExpectation (ctx context.Context , t * testing.T , clientSet * k8sclient.Clientset , node * corev1.Node , taint * corev1.Taint , add , expectedSuccess bool ) {
829
888
rnode , err := clientSet .CoreV1 ().Nodes ().Get (ctx , node .Name , metav1.GetOptions {})
830
889
if err != nil {
@@ -886,3 +945,40 @@ func tryRemovingTaintWithExpectedSuccess(ctx context.Context, t *testing.T, clie
886
945
func tryRemovingTaintWithExpectedFailure (ctx context.Context , t * testing.T , clientSet * k8sclient.Clientset , node * corev1.Node , taint * corev1.Taint ) {
887
946
tryUpdatingTaintWithExpectation (ctx , t , clientSet , node , taint , false , false )
888
947
}
948
+
949
+ func mockPSIEnv (ctx context.Context , kubeClient * k8sclient.Clientset ) error {
950
+ operatorDeployment , err := kubeClient .AppsV1 ().Deployments (operatorclient .OperatorNamespace ).Get (ctx , operatorclient .OperandName + "-operator" , metav1.GetOptions {})
951
+ if err != nil {
952
+ return err
953
+ }
954
+ operatorDeployment .Spec .Template .Spec .Containers [0 ].Env = append (
955
+ operatorDeployment .Spec .Template .Spec .Containers [0 ].Env ,
956
+ v1.EnvVar {
957
+ Name : EXPERIMENTAL_DISABLE_PSI_CHECK ,
958
+ Value : "true" ,
959
+ })
960
+ return updateDeploymentAndRetryOnConflicts (ctx , kubeClient , operatorDeployment , metav1.UpdateOptions {})
961
+ }
962
+
963
+ func unmockPSIEnv (ctx context.Context , kubeClient * k8sclient.Clientset , prevDisablePSIcheck string , foundDisablePSIcheck bool ) error {
964
+ operatorDeployment , err := kubeClient .AppsV1 ().Deployments (operatorclient .OperatorNamespace ).Get (ctx , operatorclient .OperandName + "-operator" , metav1.GetOptions {})
965
+ if err != nil {
966
+ return err
967
+ }
968
+ var envVars []v1.EnvVar
969
+ for _ , e := range operatorDeployment .Spec .Template .Spec .Containers [0 ].Env {
970
+ if e .Name != EXPERIMENTAL_DISABLE_PSI_CHECK {
971
+ envVars = append (envVars , e )
972
+ }
973
+ }
974
+ if foundDisablePSIcheck {
975
+ operatorDeployment .Spec .Template .Spec .Containers [0 ].Env = append (
976
+ envVars ,
977
+ v1.EnvVar {
978
+ Name : EXPERIMENTAL_DISABLE_PSI_CHECK ,
979
+ Value : prevDisablePSIcheck ,
980
+ })
981
+ }
982
+ operatorDeployment .Spec .Template .Spec .Containers [0 ].Env = envVars
983
+ return updateDeploymentAndRetryOnConflicts (ctx , kubeClient , operatorDeployment , metav1.UpdateOptions {})
984
+ }
0 commit comments