mirror of
				https://github.com/optim-enterprises-bv/kubernetes.git
				synced 2025-11-03 19:58:17 +00:00 
			
		
		
		
	Add test for ValidateJobUpdate
Change-Id: If194f941919e2f4256001030a96101b6c91c4d08
This commit is contained in:
		@@ -34,8 +34,11 @@ go_test(
 | 
				
			|||||||
        "//pkg/features:go_default_library",
 | 
					        "//pkg/features:go_default_library",
 | 
				
			||||||
        "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
 | 
					        "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
 | 
				
			||||||
        "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library",
 | 
					        "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library",
 | 
				
			||||||
 | 
					        "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library",
 | 
				
			||||||
        "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library",
 | 
					        "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library",
 | 
				
			||||||
        "//staging/src/k8s.io/component-base/featuregate/testing:go_default_library",
 | 
					        "//vendor/github.com/google/go-cmp/cmp:go_default_library",
 | 
				
			||||||
 | 
					        "//vendor/github.com/google/go-cmp/cmp/cmpopts:go_default_library",
 | 
				
			||||||
 | 
					        "//vendor/k8s.io/utils/pointer:go_default_library",
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -20,13 +20,17 @@ import (
 | 
				
			|||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
	"testing"
 | 
						"testing"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/google/go-cmp/cmp"
 | 
				
			||||||
 | 
						"github.com/google/go-cmp/cmp/cmpopts"
 | 
				
			||||||
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 | 
						metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 | 
				
			||||||
	"k8s.io/apimachinery/pkg/types"
 | 
						"k8s.io/apimachinery/pkg/types"
 | 
				
			||||||
 | 
						"k8s.io/apimachinery/pkg/util/validation/field"
 | 
				
			||||||
	utilfeature "k8s.io/apiserver/pkg/util/feature"
 | 
						utilfeature "k8s.io/apiserver/pkg/util/feature"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/apis/batch"
 | 
						"k8s.io/kubernetes/pkg/apis/batch"
 | 
				
			||||||
	api "k8s.io/kubernetes/pkg/apis/core"
 | 
						api "k8s.io/kubernetes/pkg/apis/core"
 | 
				
			||||||
	corevalidation "k8s.io/kubernetes/pkg/apis/core/validation"
 | 
						corevalidation "k8s.io/kubernetes/pkg/apis/core/validation"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/features"
 | 
						"k8s.io/kubernetes/pkg/features"
 | 
				
			||||||
 | 
						"k8s.io/utils/pointer"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func getValidManualSelector() *metav1.LabelSelector {
 | 
					func getValidManualSelector() *metav1.LabelSelector {
 | 
				
			||||||
@@ -268,6 +272,99 @@ func TestValidateJob(t *testing.T) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestValidateJobUpdate(t *testing.T) {
 | 
				
			||||||
 | 
						validGeneratedSelector := getValidGeneratedSelector()
 | 
				
			||||||
 | 
						validPodTemplateSpecForGenerated := getValidPodTemplateSpecForGenerated(validGeneratedSelector)
 | 
				
			||||||
 | 
						cases := map[string]struct {
 | 
				
			||||||
 | 
							old    batch.Job
 | 
				
			||||||
 | 
							update func(*batch.Job)
 | 
				
			||||||
 | 
							err    *field.Error
 | 
				
			||||||
 | 
						}{
 | 
				
			||||||
 | 
							"mutable fields": {
 | 
				
			||||||
 | 
								old: batch.Job{
 | 
				
			||||||
 | 
									ObjectMeta: metav1.ObjectMeta{Name: "abc", Namespace: metav1.NamespaceDefault},
 | 
				
			||||||
 | 
									Spec: batch.JobSpec{
 | 
				
			||||||
 | 
										Selector:                validGeneratedSelector,
 | 
				
			||||||
 | 
										Template:                validPodTemplateSpecForGenerated,
 | 
				
			||||||
 | 
										Parallelism:             pointer.Int32Ptr(5),
 | 
				
			||||||
 | 
										ActiveDeadlineSeconds:   pointer.Int64Ptr(2),
 | 
				
			||||||
 | 
										TTLSecondsAfterFinished: pointer.Int32Ptr(1),
 | 
				
			||||||
 | 
									},
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
								update: func(job *batch.Job) {
 | 
				
			||||||
 | 
									job.Spec.Parallelism = pointer.Int32Ptr(2)
 | 
				
			||||||
 | 
									job.Spec.ActiveDeadlineSeconds = pointer.Int64Ptr(3)
 | 
				
			||||||
 | 
									job.Spec.TTLSecondsAfterFinished = pointer.Int32Ptr(2)
 | 
				
			||||||
 | 
									job.Spec.ManualSelector = pointer.BoolPtr(true)
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							"immutable completion": {
 | 
				
			||||||
 | 
								old: batch.Job{
 | 
				
			||||||
 | 
									ObjectMeta: metav1.ObjectMeta{Name: "abc", Namespace: metav1.NamespaceDefault},
 | 
				
			||||||
 | 
									Spec: batch.JobSpec{
 | 
				
			||||||
 | 
										Selector: validGeneratedSelector,
 | 
				
			||||||
 | 
										Template: validPodTemplateSpecForGenerated,
 | 
				
			||||||
 | 
									},
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
								update: func(job *batch.Job) {
 | 
				
			||||||
 | 
									job.Spec.Completions = pointer.Int32Ptr(1)
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
								err: &field.Error{
 | 
				
			||||||
 | 
									Type:  field.ErrorTypeInvalid,
 | 
				
			||||||
 | 
									Field: "spec.completions",
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							"immutable selector": {
 | 
				
			||||||
 | 
								old: batch.Job{
 | 
				
			||||||
 | 
									ObjectMeta: metav1.ObjectMeta{Name: "abc", Namespace: metav1.NamespaceDefault},
 | 
				
			||||||
 | 
									Spec: batch.JobSpec{
 | 
				
			||||||
 | 
										Selector: validGeneratedSelector,
 | 
				
			||||||
 | 
										Template: validPodTemplateSpecForGenerated,
 | 
				
			||||||
 | 
									},
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
								update: func(job *batch.Job) {
 | 
				
			||||||
 | 
									job.Spec.Selector.MatchLabels["foo"] = "bar"
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
								err: &field.Error{
 | 
				
			||||||
 | 
									Type:  field.ErrorTypeInvalid,
 | 
				
			||||||
 | 
									Field: "spec.selector",
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							"immutable pod template": {
 | 
				
			||||||
 | 
								old: batch.Job{
 | 
				
			||||||
 | 
									ObjectMeta: metav1.ObjectMeta{Name: "abc", Namespace: metav1.NamespaceDefault},
 | 
				
			||||||
 | 
									Spec: batch.JobSpec{
 | 
				
			||||||
 | 
										Selector: validGeneratedSelector,
 | 
				
			||||||
 | 
										Template: validPodTemplateSpecForGenerated,
 | 
				
			||||||
 | 
									},
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
								update: func(job *batch.Job) {
 | 
				
			||||||
 | 
									job.Spec.Template.Spec.Containers = nil
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
								err: &field.Error{
 | 
				
			||||||
 | 
									Type:  field.ErrorTypeInvalid,
 | 
				
			||||||
 | 
									Field: "spec.template",
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						ignoreValueAndDetail := cmpopts.IgnoreFields(field.Error{}, "BadValue", "Detail")
 | 
				
			||||||
 | 
						for k, tc := range cases {
 | 
				
			||||||
 | 
							t.Run(k, func(t *testing.T) {
 | 
				
			||||||
 | 
								tc.old.ResourceVersion = "1"
 | 
				
			||||||
 | 
								update := tc.old.DeepCopy()
 | 
				
			||||||
 | 
								tc.update(update)
 | 
				
			||||||
 | 
								errs := ValidateJobUpdate(&tc.old, update, corevalidation.PodValidationOptions{})
 | 
				
			||||||
 | 
								var wantErrs field.ErrorList
 | 
				
			||||||
 | 
								if tc.err != nil {
 | 
				
			||||||
 | 
									wantErrs = append(wantErrs, tc.err)
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								if diff := cmp.Diff(wantErrs, errs, ignoreValueAndDetail); diff != "" {
 | 
				
			||||||
 | 
									t.Errorf("Unexpected validation errors (-want,+got):\n%s", diff)
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							})
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func TestValidateJobUpdateStatus(t *testing.T) {
 | 
					func TestValidateJobUpdateStatus(t *testing.T) {
 | 
				
			||||||
	type testcase struct {
 | 
						type testcase struct {
 | 
				
			||||||
		old    batch.Job
 | 
							old    batch.Job
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user