func ValidateCrossVersionObjectReference(ref autoscaling.CrossVersionObjectReference, fldPath *field.Path) field.ErrorList { allErrs := field.ErrorList{} if len(ref.Kind) == 0 { allErrs = append(allErrs, field.Required(fldPath.Child("kind"), "")) } else if ok, msg := apivalidation.IsValidPathSegmentName(ref.Kind); !ok { allErrs = append(allErrs, field.Invalid(fldPath.Child("kind"), ref.Kind, msg)) } if len(ref.Name) == 0 { allErrs = append(allErrs, field.Required(fldPath.Child("name"), "")) } else if ok, msg := apivalidation.IsValidPathSegmentName(ref.Name); !ok { allErrs = append(allErrs, field.Invalid(fldPath.Child("name"), ref.Name, msg)) } return allErrs }
// NoNamespaceKeyFunc is the default function for constructing storage paths to a resource relative to prefix without a namespace func NoNamespaceKeyFunc(ctx api.Context, prefix string, name string) (string, error) { if len(name) == 0 { return "", kubeerr.NewBadRequest("Name parameter required.") } if msgs := validation.IsValidPathSegmentName(name); len(msgs) != 0 { return "", kubeerr.NewBadRequest(fmt.Sprintf("Name parameter invalid: %q: %s", name, strings.Join(msgs, ";"))) } key := prefix + "/" + name return key, nil }
// NoNamespaceKeyFunc is the default function for constructing etcd paths to a resource relative to prefix without a namespace func NoNamespaceKeyFunc(ctx api.Context, prefix string, name string) (string, error) { if len(name) == 0 { return "", kubeerr.NewBadRequest("Name parameter required.") } if ok, msg := validation.IsValidPathSegmentName(name); !ok { return "", kubeerr.NewBadRequest(fmt.Sprintf("Name parameter invalid: %v.", msg)) } key := prefix + "/" + name return key, nil }
func NoNamespaceKeyFunc(prefix string, obj runtime.Object) (string, error) { meta, err := meta.Accessor(obj) if err != nil { return "", err } name := meta.Name() if ok, msg := validation.IsValidPathSegmentName(name); !ok { return "", fmt.Errorf("invalid name: %v", msg) } return prefix + "/" + meta.Name(), nil }
func NamespaceKeyFunc(prefix string, obj runtime.Object) (string, error) { meta, err := meta.Accessor(obj) if err != nil { return "", err } name := meta.GetName() if msgs := validation.IsValidPathSegmentName(name); len(msgs) != 0 { return "", fmt.Errorf("invalid name: %v", msgs) } return prefix + "/" + meta.GetNamespace() + "/" + name, nil }
func ValidateSubresourceReference(ref extensions.SubresourceReference, fldPath *field.Path) field.ErrorList { allErrs := field.ErrorList{} if len(ref.Kind) == 0 { allErrs = append(allErrs, field.Required(fldPath.Child("kind"), "")) } else if ok, msg := apivalidation.IsValidPathSegmentName(ref.Kind); !ok { allErrs = append(allErrs, field.Invalid(fldPath.Child("kind"), ref.Kind, msg)) } if len(ref.Name) == 0 { allErrs = append(allErrs, field.Required(fldPath.Child("name"), "")) } else if ok, msg := apivalidation.IsValidPathSegmentName(ref.Name); !ok { allErrs = append(allErrs, field.Invalid(fldPath.Child("name"), ref.Name, msg)) } if len(ref.Subresource) == 0 { allErrs = append(allErrs, field.Required(fldPath.Child("subresource"), "")) } else if ok, msg := apivalidation.IsValidPathSegmentName(ref.Subresource); !ok { allErrs = append(allErrs, field.Invalid(fldPath.Child("subresource"), ref.Subresource, msg)) } return allErrs }
func ValidateSubresourceReference(ref extensions.SubresourceReference) validation.ErrorList { allErrs := validation.ErrorList{} if len(ref.Kind) == 0 { allErrs = append(allErrs, validation.NewRequiredError("kind")) } else if ok, msg := apivalidation.IsValidPathSegmentName(ref.Kind); !ok { allErrs = append(allErrs, validation.NewInvalidError("kind", ref.Kind, msg)) } if len(ref.Name) == 0 { allErrs = append(allErrs, validation.NewRequiredError("name")) } else if ok, msg := apivalidation.IsValidPathSegmentName(ref.Name); !ok { allErrs = append(allErrs, validation.NewInvalidError("name", ref.Name, msg)) } if len(ref.Subresource) == 0 { allErrs = append(allErrs, validation.NewRequiredError("subresource")) } else if ok, msg := apivalidation.IsValidPathSegmentName(ref.Subresource); !ok { allErrs = append(allErrs, validation.NewInvalidError("subresource", ref.Subresource, msg)) } return allErrs }
// NamespaceKeyFunc is the default function for constructing storage paths to a resource relative to prefix enforcing namespace rules. // If no namespace is on context, it errors. func NamespaceKeyFunc(ctx api.Context, prefix string, name string) (string, error) { key := NamespaceKeyRootFunc(ctx, prefix) ns, ok := api.NamespaceFrom(ctx) if !ok || len(ns) == 0 { return "", kubeerr.NewBadRequest("Namespace parameter required.") } if len(name) == 0 { return "", kubeerr.NewBadRequest("Name parameter required.") } if msgs := validation.IsValidPathSegmentName(name); len(msgs) != 0 { return "", kubeerr.NewBadRequest(fmt.Sprintf("Name parameter invalid: %q: %s", name, strings.Join(msgs, ";"))) } key = key + "/" + name return key, nil }
// Resource sets the resource to access (<resource>/[ns/<namespace>/]<name>) func (r *Request) Resource(resource string) *Request { if r.err != nil { return r } if len(r.resource) != 0 { r.err = fmt.Errorf("resource already set to %q, cannot change to %q", r.resource, resource) return r } if msgs := validation.IsValidPathSegmentName(resource); len(msgs) != 0 { r.err = fmt.Errorf("invalid resource %q: %v", resource, msgs) return r } r.resource = resource return r }
// Namespace applies the namespace scope to a request (<resource>/[ns/<namespace>/]<name>) func (r *Request) Namespace(namespace string) *Request { if r.err != nil { return r } if r.namespaceSet { r.err = fmt.Errorf("namespace already set to %q, cannot change to %q", r.namespace, namespace) return r } if msgs := validation.IsValidPathSegmentName(namespace); len(msgs) != 0 { r.err = fmt.Errorf("invalid namespace %q: %v", namespace, msgs) return r } r.namespaceSet = true r.namespace = namespace return r }
// SubResource sets a sub-resource path which can be multiple segments segment after the resource // name but before the suffix. func (r *Request) SubResource(subresources ...string) *Request { if r.err != nil { return r } subresource := path.Join(subresources...) if len(r.subresource) != 0 { r.err = fmt.Errorf("subresource already set to %q, cannot change to %q", r.resource, subresource) return r } for _, s := range subresources { if msgs := validation.IsValidPathSegmentName(s); len(msgs) != 0 { r.err = fmt.Errorf("invalid subresource %q: %v", s, msgs) return r } } r.subresource = subresource return r }
// Name sets the name of a resource to access (<resource>/[ns/<namespace>/]<name>) func (r *Request) Name(resourceName string) *Request { if r.err != nil { return r } if len(resourceName) == 0 { r.err = fmt.Errorf("resource name may not be empty") return r } if len(r.resourceName) != 0 { r.err = fmt.Errorf("resource name already set to %q, cannot change to %q", r.resourceName, resourceName) return r } if ok, msg := validation.IsValidPathSegmentName(resourceName); !ok { r.err = fmt.Errorf("invalid resource name %q: %s", resourceName, msg) return r } r.resourceName = resourceName return r }
// Minimal validation of names for roles and bindings. Identical to the validation for Openshift. See: // * https://github.com/kubernetes/kubernetes/blob/60db50/pkg/api/validation/name.go // * https://github.com/openshift/origin/blob/388478/pkg/api/helpers.go func minimalNameRequirements(name string, prefix bool) (bool, string) { return validation.IsValidPathSegmentName(name) }