mirror of
				https://github.com/optim-enterprises-bv/kubernetes.git
				synced 2025-11-04 04:08:16 +00:00 
			
		
		
		
	Merge pull request #4017 from smarterclayton/relax_annotation_validations
Slightly relax annotation validation
This commit is contained in:
		@@ -30,6 +30,28 @@ import (
 | 
				
			|||||||
	"github.com/golang/glog"
 | 
						"github.com/golang/glog"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// ValidateLabels validates that a set of labels are correctly defined.
 | 
				
			||||||
 | 
					func ValidateLabels(labels map[string]string, field string) errs.ValidationErrorList {
 | 
				
			||||||
 | 
						allErrs := errs.ValidationErrorList{}
 | 
				
			||||||
 | 
						for k := range labels {
 | 
				
			||||||
 | 
							if !util.IsQualifiedName(k) {
 | 
				
			||||||
 | 
								allErrs = append(allErrs, errs.NewFieldInvalid(field, k, ""))
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return allErrs
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// ValidateAnnotations validates that a set of annotations are correctly defined.
 | 
				
			||||||
 | 
					func ValidateAnnotations(annotations map[string]string, field string) errs.ValidationErrorList {
 | 
				
			||||||
 | 
						allErrs := errs.ValidationErrorList{}
 | 
				
			||||||
 | 
						for k := range annotations {
 | 
				
			||||||
 | 
							if !util.IsQualifiedName(strings.ToLower(k)) {
 | 
				
			||||||
 | 
								allErrs = append(allErrs, errs.NewFieldInvalid(field, k, ""))
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return allErrs
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ValidateNameFunc validates that the provided name is valid for a given resource type.
 | 
					// ValidateNameFunc validates that the provided name is valid for a given resource type.
 | 
				
			||||||
// Not all resources have the same validation rules for names.
 | 
					// Not all resources have the same validation rules for names.
 | 
				
			||||||
type ValidateNameFunc func(name string) (bool, string)
 | 
					type ValidateNameFunc func(name string) (bool, string)
 | 
				
			||||||
@@ -72,7 +94,7 @@ func ValidateObjectMeta(meta *api.ObjectMeta, requiresNamespace bool, nameFn Val
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	allErrs = append(allErrs, ValidateLabels(meta.Labels, "labels")...)
 | 
						allErrs = append(allErrs, ValidateLabels(meta.Labels, "labels")...)
 | 
				
			||||||
	allErrs = append(allErrs, ValidateLabels(meta.Annotations, "annotations")...)
 | 
						allErrs = append(allErrs, ValidateAnnotations(meta.Annotations, "annotations")...)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Clear self link internally
 | 
						// Clear self link internally
 | 
				
			||||||
	// TODO: move to its own area
 | 
						// TODO: move to its own area
 | 
				
			||||||
@@ -107,7 +129,7 @@ func ValidateObjectMetaUpdate(old, meta *api.ObjectMeta) errs.ValidationErrorLis
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	allErrs = append(allErrs, ValidateLabels(meta.Labels, "labels")...)
 | 
						allErrs = append(allErrs, ValidateLabels(meta.Labels, "labels")...)
 | 
				
			||||||
	allErrs = append(allErrs, ValidateLabels(meta.Annotations, "annotations")...)
 | 
						allErrs = append(allErrs, ValidateAnnotations(meta.Annotations, "annotations")...)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Clear self link internally
 | 
						// Clear self link internally
 | 
				
			||||||
	// TODO: move to its own area
 | 
						// TODO: move to its own area
 | 
				
			||||||
@@ -492,17 +514,6 @@ func ValidatePodSpec(spec *api.PodSpec) errs.ValidationErrorList {
 | 
				
			|||||||
	return allErrs
 | 
						return allErrs
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ValidateLabels validates that a set of labels are correctly defined.
 | 
					 | 
				
			||||||
func ValidateLabels(labels map[string]string, field string) errs.ValidationErrorList {
 | 
					 | 
				
			||||||
	allErrs := errs.ValidationErrorList{}
 | 
					 | 
				
			||||||
	for k := range labels {
 | 
					 | 
				
			||||||
		if !util.IsQualifiedName(k) {
 | 
					 | 
				
			||||||
			allErrs = append(allErrs, errs.NewFieldInvalid(field, k, ""))
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return allErrs
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// ValidatePodUpdate tests to see if the update is legal
 | 
					// ValidatePodUpdate tests to see if the update is legal
 | 
				
			||||||
func ValidatePodUpdate(newPod, oldPod *api.Pod) errs.ValidationErrorList {
 | 
					func ValidatePodUpdate(newPod, oldPod *api.Pod) errs.ValidationErrorList {
 | 
				
			||||||
	allErrs := errs.ValidationErrorList{}
 | 
						allErrs := errs.ValidationErrorList{}
 | 
				
			||||||
@@ -609,7 +620,6 @@ func ValidateReplicationControllerSpec(spec *api.ReplicationControllerSpec) errs
 | 
				
			|||||||
		if !selector.Matches(labels) {
 | 
							if !selector.Matches(labels) {
 | 
				
			||||||
			allErrs = append(allErrs, errs.NewFieldInvalid("template.labels", spec.Template.Labels, "selector does not match template"))
 | 
								allErrs = append(allErrs, errs.NewFieldInvalid("template.labels", spec.Template.Labels, "selector does not match template"))
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		allErrs = append(allErrs, ValidateLabels(spec.Template.Annotations, "annotations")...)
 | 
					 | 
				
			||||||
		allErrs = append(allErrs, ValidatePodTemplateSpec(spec.Template).Prefix("template")...)
 | 
							allErrs = append(allErrs, ValidatePodTemplateSpec(spec.Template).Prefix("template")...)
 | 
				
			||||||
		// RestartPolicy has already been first-order validated as per ValidatePodTemplateSpec().
 | 
							// RestartPolicy has already been first-order validated as per ValidatePodTemplateSpec().
 | 
				
			||||||
		if spec.Template.Spec.RestartPolicy.Always == nil {
 | 
							if spec.Template.Spec.RestartPolicy.Always == nil {
 | 
				
			||||||
@@ -625,7 +635,7 @@ func ValidateReplicationControllerSpec(spec *api.ReplicationControllerSpec) errs
 | 
				
			|||||||
func ValidatePodTemplateSpec(spec *api.PodTemplateSpec) errs.ValidationErrorList {
 | 
					func ValidatePodTemplateSpec(spec *api.PodTemplateSpec) errs.ValidationErrorList {
 | 
				
			||||||
	allErrs := errs.ValidationErrorList{}
 | 
						allErrs := errs.ValidationErrorList{}
 | 
				
			||||||
	allErrs = append(allErrs, ValidateLabels(spec.Labels, "labels")...)
 | 
						allErrs = append(allErrs, ValidateLabels(spec.Labels, "labels")...)
 | 
				
			||||||
	allErrs = append(allErrs, ValidateLabels(spec.Annotations, "annotations")...)
 | 
						allErrs = append(allErrs, ValidateAnnotations(spec.Annotations, "annotations")...)
 | 
				
			||||||
	allErrs = append(allErrs, ValidatePodSpec(&spec.Spec).Prefix("spec")...)
 | 
						allErrs = append(allErrs, ValidatePodSpec(&spec.Spec).Prefix("spec")...)
 | 
				
			||||||
	allErrs = append(allErrs, ValidateReadOnlyPersistentDisks(spec.Spec.Volumes).Prefix("spec.volumes")...)
 | 
						allErrs = append(allErrs, ValidateReadOnlyPersistentDisks(spec.Spec.Volumes).Prefix("spec.volumes")...)
 | 
				
			||||||
	return allErrs
 | 
						return allErrs
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -74,6 +74,43 @@ func TestValidateLabels(t *testing.T) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestValidateAnnotations(t *testing.T) {
 | 
				
			||||||
 | 
						successCases := []map[string]string{
 | 
				
			||||||
 | 
							{"simple": "bar"},
 | 
				
			||||||
 | 
							{"now-with-dashes": "bar"},
 | 
				
			||||||
 | 
							{"1-starts-with-num": "bar"},
 | 
				
			||||||
 | 
							{"1234": "bar"},
 | 
				
			||||||
 | 
							{"simple/simple": "bar"},
 | 
				
			||||||
 | 
							{"now-with-dashes/simple": "bar"},
 | 
				
			||||||
 | 
							{"now-with-dashes/now-with-dashes": "bar"},
 | 
				
			||||||
 | 
							{"now.with.dots/simple": "bar"},
 | 
				
			||||||
 | 
							{"now-with.dashes-and.dots/simple": "bar"},
 | 
				
			||||||
 | 
							{"1-num.2-num/3-num": "bar"},
 | 
				
			||||||
 | 
							{"1234/5678": "bar"},
 | 
				
			||||||
 | 
							{"1.2.3.4/5678": "bar"},
 | 
				
			||||||
 | 
							{"UpperCase123": "bar"},
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						for i := range successCases {
 | 
				
			||||||
 | 
							errs := ValidateAnnotations(successCases[i], "field")
 | 
				
			||||||
 | 
							if len(errs) != 0 {
 | 
				
			||||||
 | 
								t.Errorf("case[%d] expected success, got %#v", i, errs)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						errorCases := []map[string]string{
 | 
				
			||||||
 | 
							{"nospecialchars^=@": "bar"},
 | 
				
			||||||
 | 
							{"cantendwithadash-": "bar"},
 | 
				
			||||||
 | 
							{"only/one/slash": "bar"},
 | 
				
			||||||
 | 
							{strings.Repeat("a", 254): "bar"},
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						for i := range errorCases {
 | 
				
			||||||
 | 
							errs := ValidateAnnotations(errorCases[i], "field")
 | 
				
			||||||
 | 
							if len(errs) != 1 {
 | 
				
			||||||
 | 
								t.Errorf("case[%d] expected failure", i)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func TestValidateVolumes(t *testing.T) {
 | 
					func TestValidateVolumes(t *testing.T) {
 | 
				
			||||||
	successCase := []api.Volume{
 | 
						successCase := []api.Volume{
 | 
				
			||||||
		{Name: "abc"},
 | 
							{Name: "abc"},
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user