Fixes TestNodeSelectorUpdate flaky test

This commit is contained in:
Abdullah Gharaibeh 2021-10-25 00:17:47 -04:00
parent 89dd275dde
commit 74e1b07a5e

View File

@ -38,7 +38,9 @@ import (
"k8s.io/apiserver/pkg/util/feature" "k8s.io/apiserver/pkg/util/feature"
"k8s.io/client-go/informers" "k8s.io/client-go/informers"
clientset "k8s.io/client-go/kubernetes" clientset "k8s.io/client-go/kubernetes"
typedv1 "k8s.io/client-go/kubernetes/typed/batch/v1"
restclient "k8s.io/client-go/rest" restclient "k8s.io/client-go/rest"
"k8s.io/client-go/util/retry"
featuregatetesting "k8s.io/component-base/featuregate/testing" featuregatetesting "k8s.io/component-base/featuregate/testing"
jobcontroller "k8s.io/kubernetes/pkg/controller/job" jobcontroller "k8s.io/kubernetes/pkg/controller/job"
"k8s.io/kubernetes/pkg/features" "k8s.io/kubernetes/pkg/features"
@ -652,12 +654,14 @@ func TestNodeSelectorUpdate(t *testing.T) {
} }
jobName := job.Name jobName := job.Name
jobNamespace := job.Namespace jobNamespace := job.Namespace
jobClient := clientSet.BatchV1().Jobs(jobNamespace)
// (1) Unsuspend and set node selector in the same update. // (1) Unsuspend and set node selector in the same update.
nodeSelector := map[string]string{"foo": "bar"} nodeSelector := map[string]string{"foo": "bar"}
job.Spec.Template.Spec.NodeSelector = nodeSelector _, err = updateJob(ctx, jobClient, jobName, func(j *batchv1.Job) {
job.Spec.Suspend = pointer.BoolPtr(false) j.Spec.Template.Spec.NodeSelector = nodeSelector
_, err = clientSet.BatchV1().Jobs(jobNamespace).Update(ctx, job, metav1.UpdateOptions{}) j.Spec.Suspend = pointer.BoolPtr(false)
})
if !featureGate { if !featureGate {
if err == nil || !strings.Contains(err.Error(), "spec.template: Invalid value") { if err == nil || !strings.Contains(err.Error(), "spec.template: Invalid value") {
t.Errorf("Expected \"spec.template: Invalid value\" error, got: %v", err) t.Errorf("Expected \"spec.template: Invalid value\" error, got: %v", err)
@ -691,12 +695,10 @@ func TestNodeSelectorUpdate(t *testing.T) {
} }
// (3) Update node selector again. It should fail since the job is unsuspended. // (3) Update node selector again. It should fail since the job is unsuspended.
var updatedJob *batchv1.Job _, err = updateJob(ctx, jobClient, jobName, func(j *batchv1.Job) {
if updatedJob, err = clientSet.BatchV1().Jobs(jobNamespace).Get(ctx, jobName, metav1.GetOptions{}); err != nil { j.Spec.Template.Spec.NodeSelector = map[string]string{"foo": "baz"}
t.Fatalf("can't find the job: %v", err) })
}
updatedJob.Spec.Template.Spec.NodeSelector = map[string]string{"foo": "baz"}
_, err = clientSet.BatchV1().Jobs(jobNamespace).Update(ctx, updatedJob, metav1.UpdateOptions{})
if err == nil || !strings.Contains(err.Error(), "spec.template: Invalid value") { if err == nil || !strings.Contains(err.Error(), "spec.template: Invalid value") {
t.Errorf("Expected \"spec.template: Invalid value\" error, got: %v", err) t.Errorf("Expected \"spec.template: Invalid value\" error, got: %v", err)
} }
@ -1014,3 +1016,17 @@ func setDuringTest(val *int, newVal int) func() {
*val = origVal *val = origVal
} }
} }
func updateJob(ctx context.Context, jobClient typedv1.JobInterface, jobName string, updateFunc func(*batchv1.Job)) (*batchv1.Job, error) {
var job *batchv1.Job
err := retry.RetryOnConflict(retry.DefaultBackoff, func() error {
newJob, err := jobClient.Get(ctx, jobName, metav1.GetOptions{})
if err != nil {
return err
}
updateFunc(newJob)
job, err = jobClient.Update(ctx, newJob, metav1.UpdateOptions{})
return err
})
return job, err
}