// Process transforms Template object into List object. It generates // Parameter values using the defined set of generators first, and then it // substitutes all Parameter expression occurrences with their corresponding // values (currently in the containers' Environment variables only). func (p *Processor) Process(template *api.Template) fielderrors.ValidationErrorList { templateErrors := fielderrors.ValidationErrorList{} if err := p.GenerateParameterValues(template); err != nil { return append(templateErrors.Prefix("Template"), fielderrors.NewFieldInvalid("parameters", err, "failure to generate parameter value")) } for i, item := range template.Objects { if obj, ok := item.(*runtime.Unknown); ok { // TODO: use runtime.DecodeList when it returns ValidationErrorList obj, err := runtime.UnstructuredJSONScheme.Decode(obj.RawJSON) if err != nil { util.ReportError(&templateErrors, i, *fielderrors.NewFieldInvalid("objects", err, "unable to handle object")) continue } item = obj } newItem, err := p.SubstituteParameters(template.Parameters, item) if err != nil { util.ReportError(&templateErrors, i, *fielderrors.NewFieldInvalid("parameters", template.Parameters, err.Error())) } stripNamespace(newItem) if err := util.AddObjectLabels(newItem, template.ObjectLabels); err != nil { util.ReportError(&templateErrors, i, *fielderrors.NewFieldInvalid("labels", err, "label could not be applied")) } template.Objects[i] = newItem } return templateErrors }
// Process transforms Template object into List object. It generates // Parameter values using the defined set of generators first, and then it // substitutes all Parameter expression occurrences with their corresponding // values (currently in the containers' Environment variables only). func (p *Processor) Process(template *api.Template) fielderrors.ValidationErrorList { templateErrors := fielderrors.ValidationErrorList{} if err, badParam := p.GenerateParameterValues(template); err != nil { return append(templateErrors.Prefix("Template"), fielderrors.NewFieldInvalid("parameters", *badParam, err.Error())) } for i, item := range template.Objects { if obj, ok := item.(*runtime.Unknown); ok { // TODO: use runtime.DecodeList when it returns ValidationErrorList decodedObj, err := runtime.UnstructuredJSONScheme.Decode(obj.RawJSON) if err != nil { util.ReportError(&templateErrors, i, *fielderrors.NewFieldInvalid("objects", obj, "unable to handle object")) continue } item = decodedObj } newItem, err := p.SubstituteParameters(template.Parameters, item) if err != nil { util.ReportError(&templateErrors, i, *fielderrors.NewFieldInvalid("parameters", template.Parameters, err.Error())) } // If an object definition's metadata includes a namespace field, the field will be stripped out of // the definition during template instantiation. This is necessary because all objects created during // instantiation are placed into the target namespace, so it would be invalid for the object to declare //a different namespace. stripNamespace(newItem) if err := util.AddObjectLabels(newItem, template.ObjectLabels); err != nil { util.ReportError(&templateErrors, i, *fielderrors.NewFieldInvalid("labels", err, "label could not be applied")) } template.Objects[i] = newItem } return templateErrors }
func validateHookVolumes(volumes []string) fielderrors.ValidationErrorList { errs := fielderrors.ValidationErrorList{} for i, vol := range volumes { vErrs := fielderrors.ValidationErrorList{} if len(vol) == 0 { vErrs = append(vErrs, fielderrors.NewFieldInvalid("", "", "must not be empty")) } errs = append(errs, vErrs.PrefixIndex(i)...) } return errs }
func validateEnv(vars []kapi.EnvVar) fielderrors.ValidationErrorList { allErrs := fielderrors.ValidationErrorList{} for i, ev := range vars { vErrs := fielderrors.ValidationErrorList{} if len(ev.Name) == 0 { vErrs = append(vErrs, fielderrors.NewFieldRequired("name")) } if !util.IsCIdentifier(ev.Name) { vErrs = append(vErrs, fielderrors.NewFieldInvalid("name", ev.Name, "must match regex "+util.CIdentifierFmt)) } allErrs = append(allErrs, vErrs.PrefixIndex(i)...) } return allErrs }
func ValidateImageStreamImport(isi *api.ImageStreamImport) fielderrors.ValidationErrorList { errs := fielderrors.ValidationErrorList{} for i, spec := range isi.Spec.Images { from := spec.From switch from.Kind { case "DockerImage": if spec.To != nil && len(spec.To.Name) == 0 { errs = append(errs, fielderrors.ValidationErrorList{fielderrors.NewFieldInvalid("to.name", spec.To.Name, "the name of the target tag must be specified")}.PrefixIndex(i)...) } if len(spec.From.Name) == 0 { errs = append(errs, fielderrors.ValidationErrorList{fielderrors.NewFieldRequired("from.name")}.PrefixIndex(i)...) } else { if _, err := api.ParseDockerImageReference(spec.From.Name); err != nil { errs = append(errs, fielderrors.ValidationErrorList{fielderrors.NewFieldInvalid("from.name", spec.From.Name, err.Error())}.PrefixIndex(i)...) } } default: errs = append(errs, fielderrors.ValidationErrorList{fielderrors.NewFieldInvalid("from.kind", from.Kind, "only DockerImage is supported")}.PrefixIndex(i)...) } } errs = errs.Prefix("spec.images") if spec := isi.Spec.Repository; spec != nil { from := spec.From switch from.Kind { case "DockerImage": if len(spec.From.Name) == 0 { errs = append(errs, fielderrors.NewFieldRequired("spec.repository.from.name")) } else { if _, err := api.ParseDockerImageReference(spec.From.Name); err != nil { errs = append(errs, fielderrors.NewFieldInvalid("spec.repository.from.name", spec.From.Name, err.Error())) } } default: errs = append(errs, fielderrors.NewFieldInvalid("spec.repository.from.kind", from.Kind, "only DockerImage is supported")) } } if len(isi.Spec.Images) == 0 && isi.Spec.Repository == nil { errs = append(errs, fielderrors.NewFieldInvalid("spec.images", nil, "you must specify at least one image or a repository import")) } errs = append(errs, validation.ValidateObjectMeta(&isi.ObjectMeta, true, ValidateImageStreamName).Prefix("metadata")...) return errs }