mirror of
				https://github.com/optim-enterprises-bv/kubernetes.git
				synced 2025-11-03 19:58:17 +00:00 
			
		
		
		
	Merge pull request #105980 from ahg-g/ahg-mutable
Make job pod template annotations and labels mutable for suspended jobs that never started
This commit is contained in:
		@@ -263,6 +263,8 @@ func validatePodTemplateUpdate(spec, oldSpec batch.JobSpec, fldPath *field.Path,
 | 
			
		||||
		}
 | 
			
		||||
		oldTemplate.Spec.NodeSelector = template.Spec.NodeSelector // +k8s:verify-mutation:reason=clone
 | 
			
		||||
		oldTemplate.Spec.Tolerations = template.Spec.Tolerations   // +k8s:verify-mutation:reason=clone
 | 
			
		||||
		oldTemplate.Annotations = template.Annotations             // +k8s:verify-mutation:reason=clone
 | 
			
		||||
		oldTemplate.Labels = template.Labels                       // +k8s:verify-mutation:reason=clone
 | 
			
		||||
	}
 | 
			
		||||
	allErrs = append(allErrs, apivalidation.ValidateImmutableField(template, oldTemplate, fldPath.Child("template"))...)
 | 
			
		||||
	return allErrs
 | 
			
		||||
 
 | 
			
		||||
@@ -647,6 +647,72 @@ func TestValidateJobUpdate(t *testing.T) {
 | 
			
		||||
				AllowMutableSchedulingDirectives: true,
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
		"immutable annotations": {
 | 
			
		||||
			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.Annotations = map[string]string{"foo": "baz"}
 | 
			
		||||
			},
 | 
			
		||||
			err: &field.Error{
 | 
			
		||||
				Type:  field.ErrorTypeInvalid,
 | 
			
		||||
				Field: "spec.template",
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
		"mutable annotations": {
 | 
			
		||||
			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.Annotations = map[string]string{"foo": "baz"}
 | 
			
		||||
			},
 | 
			
		||||
			opts: JobValidationOptions{
 | 
			
		||||
				AllowMutableSchedulingDirectives: true,
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
		"immutable labels": {
 | 
			
		||||
			old: batch.Job{
 | 
			
		||||
				ObjectMeta: metav1.ObjectMeta{Name: "abc", Namespace: metav1.NamespaceDefault},
 | 
			
		||||
				Spec: batch.JobSpec{
 | 
			
		||||
					Selector: validGeneratedSelector,
 | 
			
		||||
					Template: validPodTemplateSpecForGenerated,
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
			update: func(job *batch.Job) {
 | 
			
		||||
				newLabels := getValidGeneratedSelector().MatchLabels
 | 
			
		||||
				newLabels["bar"] = "baz"
 | 
			
		||||
				job.Spec.Template.Labels = newLabels
 | 
			
		||||
			},
 | 
			
		||||
			err: &field.Error{
 | 
			
		||||
				Type:  field.ErrorTypeInvalid,
 | 
			
		||||
				Field: "spec.template",
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
		"mutable labels": {
 | 
			
		||||
			old: batch.Job{
 | 
			
		||||
				ObjectMeta: metav1.ObjectMeta{Name: "abc", Namespace: metav1.NamespaceDefault},
 | 
			
		||||
				Spec: batch.JobSpec{
 | 
			
		||||
					Selector: validGeneratedSelector,
 | 
			
		||||
					Template: validPodTemplateSpecForGenerated,
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
			update: func(job *batch.Job) {
 | 
			
		||||
				newLabels := getValidGeneratedSelector().MatchLabels
 | 
			
		||||
				newLabels["bar"] = "baz"
 | 
			
		||||
				job.Spec.Template.Labels = newLabels
 | 
			
		||||
			},
 | 
			
		||||
			opts: JobValidationOptions{
 | 
			
		||||
				AllowMutableSchedulingDirectives: true,
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
	ignoreValueAndDetail := cmpopts.IgnoreFields(field.Error{}, "BadValue", "Detail")
 | 
			
		||||
	for k, tc := range cases {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user