// ValidateBoundPod tests if required fields on a bound pod are set. func ValidateBoundPod(pod *api.BoundPod) errs.ValidationErrorList { allErrs := errs.ValidationErrorList{} if len(pod.Name) == 0 { allErrs = append(allErrs, errs.NewFieldRequired("name", pod.Name)) } else if !util.IsDNSSubdomain(pod.Name) { allErrs = append(allErrs, errs.NewFieldInvalid("name", pod.Name, "")) } if len(pod.Namespace) == 0 { allErrs = append(allErrs, errs.NewFieldRequired("namespace", pod.Namespace)) } else if !util.IsDNSSubdomain(pod.Namespace) { allErrs = append(allErrs, errs.NewFieldInvalid("namespace", pod.Namespace, "")) } allErrs = append(allErrs, ValidatePodSpec(&pod.Spec).Prefix("spec")...) return allErrs }
// ValidateObjectMeta validates an object's metadata on creation. It expects that name generation has already // been performed. func ValidateObjectMeta(meta *api.ObjectMeta, requiresNamespace bool, nameFn ValidateNameFunc) errs.ValidationErrorList { allErrs := errs.ValidationErrorList{} if len(meta.GenerateName) != 0 { if ok, qualifier := nameFn(meta.GenerateName, true); !ok { allErrs = append(allErrs, errs.NewFieldInvalid("generateName", meta.GenerateName, qualifier)) } } // if the generated name validates, but the calculated value does not, it's a problem with generation, and we // report it here. This may confuse users, but indicates a programming bug and still must be validated. if len(meta.Name) == 0 { allErrs = append(allErrs, errs.NewFieldRequired("name", meta.Name)) } else { if ok, qualifier := nameFn(meta.Name, false); !ok { allErrs = append(allErrs, errs.NewFieldInvalid("name", meta.Name, qualifier)) } } if requiresNamespace { if len(meta.Namespace) == 0 { allErrs = append(allErrs, errs.NewFieldRequired("namespace", meta.Namespace)) } else if !util.IsDNSSubdomain(meta.Namespace) { allErrs = append(allErrs, errs.NewFieldInvalid("namespace", meta.Namespace, dnsSubdomainErrorMsg)) } } else { if len(meta.Namespace) != 0 { allErrs = append(allErrs, errs.NewFieldInvalid("namespace", meta.Namespace, "namespace is not allowed on this type")) } } allErrs = append(allErrs, ValidateLabels(meta.Labels, "labels")...) allErrs = append(allErrs, ValidateAnnotations(meta.Annotations, "annotations")...) return allErrs }
func ValidatePod(pod *Pod) (errors []error) { if !util.IsDNSSubdomain(pod.Name) { errors = append(errors, apierrs.NewInvalid("Pod.Name", pod.Name)) } if errs := api.ValidateManifest(&pod.Manifest); len(errs) != 0 { errors = append(errors, errs...) } return errors }
// nameIsDNSSubdomain is a ValidateNameFunc for names that must be a DNS subdomain. func nameIsDNSSubdomain(name string, prefix bool) (bool, string) { if prefix { name = maskTrailingDash(name) } if util.IsDNSSubdomain(name) { return true, "" } return false, dnsSubdomainErrorMsg }
// ValidateEvent makes sure that the event makes sense. func ValidateEvent(event *api.Event) errs.ValidationErrorList { allErrs := errs.ValidationErrorList{} if event.Namespace != event.InvolvedObject.Namespace { allErrs = append(allErrs, errs.NewFieldInvalid("involvedObject.namespace", event.InvolvedObject.Namespace, "namespace does not match involvedObject")) } if !util.IsDNSSubdomain(event.Namespace) { allErrs = append(allErrs, errs.NewFieldInvalid("namespace", event.Namespace, "")) } return allErrs }
// ValidateBoundPod tests if required fields on a bound pod are set. func ValidateBoundPod(pod *api.BoundPod) (errors []error) { if !util.IsDNSSubdomain(pod.Name) { errors = append(errors, errs.NewFieldInvalid("name", pod.Name)) } if !util.IsDNSSubdomain(pod.Namespace) { errors = append(errors, errs.NewFieldInvalid("namespace", pod.Namespace)) } containerManifest := &api.ContainerManifest{ Version: "v1beta2", ID: pod.Name, UUID: pod.UID, Containers: pod.Spec.Containers, Volumes: pod.Spec.Volumes, RestartPolicy: pod.Spec.RestartPolicy, } if errs := ValidateManifest(containerManifest); len(errs) != 0 { errors = append(errors, errs...) } return errors }
// ValidateReplicationController tests if required fields in the replication controller are set. func ValidateReplicationController(controller *api.ReplicationController) errs.ValidationErrorList { allErrs := errs.ValidationErrorList{} if len(controller.Name) == 0 { allErrs = append(allErrs, errs.NewFieldRequired("name", controller.Name)) } if !util.IsDNSSubdomain(controller.Namespace) { allErrs = append(allErrs, errs.NewFieldInvalid("namespace", controller.Namespace, "")) } allErrs = append(allErrs, ValidateReplicationControllerSpec(&controller.Spec).Prefix("spec")...) allErrs = append(allErrs, validateLabels(controller.Labels, "labels")...) return allErrs }
// ValidatePod tests if required fields in the pod are set. func ValidatePod(pod *api.Pod) errs.ValidationErrorList { allErrs := errs.ValidationErrorList{} if len(pod.Name) == 0 { allErrs = append(allErrs, errs.NewFieldRequired("name", pod.Name)) } if !util.IsDNSSubdomain(pod.Namespace) { allErrs = append(allErrs, errs.NewFieldInvalid("namespace", pod.Namespace)) } allErrs = append(allErrs, ValidatePodState(&pod.DesiredState).Prefix("desiredState")...) allErrs = append(allErrs, validateLabels(pod.Labels)...) return allErrs }
// ValidateService tests if required fields in the service are set. func ValidateService(service *api.Service, lister ServiceLister, ctx api.Context) errs.ValidationErrorList { allErrs := errs.ValidationErrorList{} if len(service.Name) == 0 { allErrs = append(allErrs, errs.NewFieldRequired("name", service.Name)) } else if !util.IsDNS952Label(service.Name) { allErrs = append(allErrs, errs.NewFieldInvalid("name", service.Name, "")) } if !util.IsDNSSubdomain(service.Namespace) { allErrs = append(allErrs, errs.NewFieldInvalid("namespace", service.Namespace, "")) } if !util.IsValidPortNum(service.Spec.Port) { allErrs = append(allErrs, errs.NewFieldInvalid("spec.port", service.Spec.Port, "")) } if len(service.Spec.Protocol) == 0 { service.Spec.Protocol = "TCP" } else if !supportedPortProtocols.Has(strings.ToUpper(string(service.Spec.Protocol))) { allErrs = append(allErrs, errs.NewFieldNotSupported("spec.protocol", service.Spec.Protocol)) } if service.Spec.Selector != nil { allErrs = append(allErrs, validateLabels(service.Spec.Selector, "spec.selector")...) } allErrs = append(allErrs, validateLabels(service.Labels, "labels")...) if service.Spec.CreateExternalLoadBalancer { services, err := lister.ListServices(ctx) if err != nil { allErrs = append(allErrs, errs.NewInternalError(err)) } else { for i := range services.Items { if services.Items[i].Name != service.Name && services.Items[i].Spec.CreateExternalLoadBalancer && services.Items[i].Spec.Port == service.Spec.Port { allErrs = append(allErrs, errs.NewConflict("service", service.Name, fmt.Errorf("port: %d is already in use", service.Spec.Port))) break } } } } if service.Spec.SessionAffinity == "" { service.Spec.SessionAffinity = api.AffinityTypeNone } else if !supportedSessionAffinityType.Has(string(service.Spec.SessionAffinity)) { allErrs = append(allErrs, errs.NewFieldNotSupported("spec.sessionAffinity", service.Spec.SessionAffinity)) } return allErrs }
// ValidateBoundPod tests if required fields on a bound pod are set. // TODO: to be removed. func ValidateBoundPod(pod *api.BoundPod) errs.ValidationErrorList { allErrs := errs.ValidationErrorList{} if len(pod.Name) == 0 { allErrs = append(allErrs, errs.NewFieldRequired("name", pod.Name)) } else { if ok, qualifier := nameIsDNSSubdomain(pod.Name, false); !ok { allErrs = append(allErrs, errs.NewFieldInvalid("name", pod.Name, qualifier)) } } if len(pod.Namespace) == 0 { allErrs = append(allErrs, errs.NewFieldRequired("namespace", pod.Namespace)) } else if !util.IsDNSSubdomain(pod.Namespace) { allErrs = append(allErrs, errs.NewFieldInvalid("namespace", pod.Namespace, dnsSubdomainErrorMsg)) } allErrs = append(allErrs, ValidatePodSpec(&pod.Spec).Prefix("spec")...) return allErrs }
// ValidateManifest tests that the specified ContainerManifest has valid data. // This includes checking formatting and uniqueness. It also canonicalizes the // structure by setting default values and implementing any backwards-compatibility // tricks. func ValidateManifest(manifest *ContainerManifest) []error { allErrs := errorList{} if len(manifest.Version) == 0 { allErrs.Append(makeInvalidError("ContainerManifest.Version", manifest.Version)) } else if !supportedManifestVersions.Has(strings.ToLower(manifest.Version)) { allErrs.Append(makeNotSupportedError("ContainerManifest.Version", manifest.Version)) } if !util.IsDNSSubdomain(manifest.ID) { allErrs.Append(makeInvalidError("ContainerManifest.ID", manifest.ID)) } allVolumes, errs := validateVolumes(manifest.Volumes) if len(errs) != 0 { allErrs.Append(errs...) } allErrs.Append(validateContainers(manifest.Containers, allVolumes)...) return []error(allErrs) }
// ValidateSecret tests if required fields in the Secret are set. func ValidateSecret(secret *api.Secret) errs.ValidationErrorList { allErrs := errs.ValidationErrorList{} allErrs = append(allErrs, ValidateObjectMeta(&secret.ObjectMeta, true, ValidateSecretName).Prefix("metadata")...) totalSize := 0 for key, value := range secret.Data { if !util.IsDNSSubdomain(key) { allErrs = append(allErrs, errs.NewFieldInvalid(fmt.Sprintf("data[%s]", key), key, cIdentifierErrorMsg)) } totalSize += len(value) } if totalSize > api.MaxSecretSize { allErrs = append(allErrs, errs.NewFieldForbidden("data", "Maximum secret size exceeded")) } return allErrs }
// ValidateManifest tests that the specified ContainerManifest has valid data. // This includes checking formatting and uniqueness. It also canonicalizes the // structure by setting default values and implementing any backwards-compatibility // tricks. // TODO(thockin): We should probably collect all errors rather than aborting the validation. func ValidateManifest(manifest *ContainerManifest) error { if len(manifest.Version) == 0 { return makeInvalidError("ContainerManifest.Version", manifest.Version) } if !supportedManifestVersions.Has(strings.ToLower(manifest.Version)) { return makeNotSupportedError("ContainerManifest.Version", manifest.Version) } if !util.IsDNSSubdomain(manifest.ID) { return makeInvalidError("ContainerManifest.ID", manifest.ID) } allVolumes, err := validateVolumes(manifest.Volumes) if err != nil { return err } if err := validateContainers(manifest.Containers, allVolumes); err != nil { return err } return nil }