mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-08-09 12:07:47 +00:00
Merge pull request #31522 from krousey/path_validation
Automatic merge from submit-queue Split path validation into a separate library This PR splits path segment validation into it's own package. This cuts off one of the restclient's dependency paths to some docker packages, and completely eliminates its dependency on go-restful swagger validation. cc @kubernetes/sig-api-machinery
This commit is contained in:
commit
9f58a867e1
@ -21,6 +21,7 @@ import (
|
|||||||
"k8s.io/kubernetes/pkg/api/errors"
|
"k8s.io/kubernetes/pkg/api/errors"
|
||||||
"k8s.io/kubernetes/pkg/api/unversioned"
|
"k8s.io/kubernetes/pkg/api/unversioned"
|
||||||
"k8s.io/kubernetes/pkg/api/validation"
|
"k8s.io/kubernetes/pkg/api/validation"
|
||||||
|
path "k8s.io/kubernetes/pkg/api/validation/path"
|
||||||
"k8s.io/kubernetes/pkg/runtime"
|
"k8s.io/kubernetes/pkg/runtime"
|
||||||
"k8s.io/kubernetes/pkg/util/validation/field"
|
"k8s.io/kubernetes/pkg/util/validation/field"
|
||||||
)
|
)
|
||||||
@ -81,7 +82,7 @@ func BeforeCreate(strategy RESTCreateStrategy, ctx api.Context, obj runtime.Obje
|
|||||||
// Custom validation (including name validation) passed
|
// Custom validation (including name validation) passed
|
||||||
// Now run common validation on object meta
|
// Now run common validation on object meta
|
||||||
// Do this *after* custom validation so that specific error messages are shown whenever possible
|
// Do this *after* custom validation so that specific error messages are shown whenever possible
|
||||||
if errs := validation.ValidateObjectMeta(objectMeta, strategy.NamespaceScoped(), validation.ValidatePathSegmentName, field.NewPath("metadata")); len(errs) > 0 {
|
if errs := validation.ValidateObjectMeta(objectMeta, strategy.NamespaceScoped(), path.ValidatePathSegmentName, field.NewPath("metadata")); len(errs) > 0 {
|
||||||
return errors.NewInvalid(kind.GroupKind(), objectMeta.Name, errs)
|
return errors.NewInvalid(kind.GroupKind(), objectMeta.Name, errs)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -27,7 +27,7 @@ import (
|
|||||||
"k8s.io/kubernetes/pkg/api/errors"
|
"k8s.io/kubernetes/pkg/api/errors"
|
||||||
"k8s.io/kubernetes/pkg/api/rest"
|
"k8s.io/kubernetes/pkg/api/rest"
|
||||||
"k8s.io/kubernetes/pkg/api/unversioned"
|
"k8s.io/kubernetes/pkg/api/unversioned"
|
||||||
"k8s.io/kubernetes/pkg/api/validation"
|
"k8s.io/kubernetes/pkg/api/validation/path"
|
||||||
"k8s.io/kubernetes/pkg/conversion"
|
"k8s.io/kubernetes/pkg/conversion"
|
||||||
"k8s.io/kubernetes/pkg/fields"
|
"k8s.io/kubernetes/pkg/fields"
|
||||||
"k8s.io/kubernetes/pkg/labels"
|
"k8s.io/kubernetes/pkg/labels"
|
||||||
@ -366,7 +366,7 @@ func (t *Tester) testCreateIgnoresMismatchedNamespace(valid runtime.Object) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (t *Tester) testCreateValidatesNames(valid runtime.Object) {
|
func (t *Tester) testCreateValidatesNames(valid runtime.Object) {
|
||||||
for _, invalidName := range validation.NameMayNotBe {
|
for _, invalidName := range path.NameMayNotBe {
|
||||||
objCopy := copyOrDie(valid)
|
objCopy := copyOrDie(valid)
|
||||||
objCopyMeta := t.getObjectMetaOrFail(objCopy)
|
objCopyMeta := t.getObjectMetaOrFail(objCopy)
|
||||||
objCopyMeta.Name = invalidName
|
objCopyMeta.Name = invalidName
|
||||||
@ -378,7 +378,7 @@ func (t *Tester) testCreateValidatesNames(valid runtime.Object) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, invalidSuffix := range validation.NameMayNotContain {
|
for _, invalidSuffix := range path.NameMayNotContain {
|
||||||
objCopy := copyOrDie(valid)
|
objCopy := copyOrDie(valid)
|
||||||
objCopyMeta := t.getObjectMetaOrFail(objCopy)
|
objCopyMeta := t.getObjectMetaOrFail(objCopy)
|
||||||
objCopyMeta.Name += invalidSuffix
|
objCopyMeta.Name += invalidSuffix
|
||||||
|
@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
|
|||||||
limitations under the License.
|
limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package validation
|
package path
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
|
|||||||
limitations under the License.
|
limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package validation
|
package path
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"strings"
|
"strings"
|
@ -20,6 +20,7 @@ import (
|
|||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
|
||||||
apivalidation "k8s.io/kubernetes/pkg/api/validation"
|
apivalidation "k8s.io/kubernetes/pkg/api/validation"
|
||||||
|
pathvalidation "k8s.io/kubernetes/pkg/api/validation/path"
|
||||||
"k8s.io/kubernetes/pkg/apis/autoscaling"
|
"k8s.io/kubernetes/pkg/apis/autoscaling"
|
||||||
"k8s.io/kubernetes/pkg/apis/extensions"
|
"k8s.io/kubernetes/pkg/apis/extensions"
|
||||||
"k8s.io/kubernetes/pkg/controller/podautoscaler"
|
"k8s.io/kubernetes/pkg/controller/podautoscaler"
|
||||||
@ -66,7 +67,7 @@ func ValidateCrossVersionObjectReference(ref autoscaling.CrossVersionObjectRefer
|
|||||||
if len(ref.Kind) == 0 {
|
if len(ref.Kind) == 0 {
|
||||||
allErrs = append(allErrs, field.Required(fldPath.Child("kind"), ""))
|
allErrs = append(allErrs, field.Required(fldPath.Child("kind"), ""))
|
||||||
} else {
|
} else {
|
||||||
for _, msg := range apivalidation.IsValidPathSegmentName(ref.Kind) {
|
for _, msg := range pathvalidation.IsValidPathSegmentName(ref.Kind) {
|
||||||
allErrs = append(allErrs, field.Invalid(fldPath.Child("kind"), ref.Kind, msg))
|
allErrs = append(allErrs, field.Invalid(fldPath.Child("kind"), ref.Kind, msg))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -74,7 +75,7 @@ func ValidateCrossVersionObjectReference(ref autoscaling.CrossVersionObjectRefer
|
|||||||
if len(ref.Name) == 0 {
|
if len(ref.Name) == 0 {
|
||||||
allErrs = append(allErrs, field.Required(fldPath.Child("name"), ""))
|
allErrs = append(allErrs, field.Required(fldPath.Child("name"), ""))
|
||||||
} else {
|
} else {
|
||||||
for _, msg := range apivalidation.IsValidPathSegmentName(ref.Name) {
|
for _, msg := range pathvalidation.IsValidPathSegmentName(ref.Name) {
|
||||||
allErrs = append(allErrs, field.Invalid(fldPath.Child("name"), ref.Name, msg))
|
allErrs = append(allErrs, field.Invalid(fldPath.Child("name"), ref.Name, msg))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -18,6 +18,7 @@ package validation
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"k8s.io/kubernetes/pkg/api/validation"
|
"k8s.io/kubernetes/pkg/api/validation"
|
||||||
|
"k8s.io/kubernetes/pkg/api/validation/path"
|
||||||
"k8s.io/kubernetes/pkg/apis/rbac"
|
"k8s.io/kubernetes/pkg/apis/rbac"
|
||||||
"k8s.io/kubernetes/pkg/util/validation/field"
|
"k8s.io/kubernetes/pkg/util/validation/field"
|
||||||
)
|
)
|
||||||
@ -26,7 +27,7 @@ import (
|
|||||||
// * https://github.com/kubernetes/kubernetes/blob/60db50/pkg/api/validation/name.go
|
// * https://github.com/kubernetes/kubernetes/blob/60db50/pkg/api/validation/name.go
|
||||||
// * https://github.com/openshift/origin/blob/388478/pkg/api/helpers.go
|
// * https://github.com/openshift/origin/blob/388478/pkg/api/helpers.go
|
||||||
func minimalNameRequirements(name string, prefix bool) []string {
|
func minimalNameRequirements(name string, prefix bool) []string {
|
||||||
return validation.IsValidPathSegmentName(name)
|
return path.IsValidPathSegmentName(name)
|
||||||
}
|
}
|
||||||
|
|
||||||
func ValidateRole(policy *rbac.Role) field.ErrorList {
|
func ValidateRole(policy *rbac.Role) field.ErrorList {
|
||||||
|
@ -35,7 +35,7 @@ import (
|
|||||||
"k8s.io/kubernetes/pkg/api/errors"
|
"k8s.io/kubernetes/pkg/api/errors"
|
||||||
"k8s.io/kubernetes/pkg/api/unversioned"
|
"k8s.io/kubernetes/pkg/api/unversioned"
|
||||||
"k8s.io/kubernetes/pkg/api/v1"
|
"k8s.io/kubernetes/pkg/api/v1"
|
||||||
"k8s.io/kubernetes/pkg/api/validation"
|
pathvalidation "k8s.io/kubernetes/pkg/api/validation/path"
|
||||||
"k8s.io/kubernetes/pkg/client/metrics"
|
"k8s.io/kubernetes/pkg/client/metrics"
|
||||||
"k8s.io/kubernetes/pkg/fields"
|
"k8s.io/kubernetes/pkg/fields"
|
||||||
"k8s.io/kubernetes/pkg/labels"
|
"k8s.io/kubernetes/pkg/labels"
|
||||||
@ -179,7 +179,7 @@ func (r *Request) Resource(resource string) *Request {
|
|||||||
r.err = fmt.Errorf("resource already set to %q, cannot change to %q", r.resource, resource)
|
r.err = fmt.Errorf("resource already set to %q, cannot change to %q", r.resource, resource)
|
||||||
return r
|
return r
|
||||||
}
|
}
|
||||||
if msgs := validation.IsValidPathSegmentName(resource); len(msgs) != 0 {
|
if msgs := pathvalidation.IsValidPathSegmentName(resource); len(msgs) != 0 {
|
||||||
r.err = fmt.Errorf("invalid resource %q: %v", resource, msgs)
|
r.err = fmt.Errorf("invalid resource %q: %v", resource, msgs)
|
||||||
return r
|
return r
|
||||||
}
|
}
|
||||||
@ -199,7 +199,7 @@ func (r *Request) SubResource(subresources ...string) *Request {
|
|||||||
return r
|
return r
|
||||||
}
|
}
|
||||||
for _, s := range subresources {
|
for _, s := range subresources {
|
||||||
if msgs := validation.IsValidPathSegmentName(s); len(msgs) != 0 {
|
if msgs := pathvalidation.IsValidPathSegmentName(s); len(msgs) != 0 {
|
||||||
r.err = fmt.Errorf("invalid subresource %q: %v", s, msgs)
|
r.err = fmt.Errorf("invalid subresource %q: %v", s, msgs)
|
||||||
return r
|
return r
|
||||||
}
|
}
|
||||||
@ -221,7 +221,7 @@ func (r *Request) Name(resourceName string) *Request {
|
|||||||
r.err = fmt.Errorf("resource name already set to %q, cannot change to %q", r.resourceName, resourceName)
|
r.err = fmt.Errorf("resource name already set to %q, cannot change to %q", r.resourceName, resourceName)
|
||||||
return r
|
return r
|
||||||
}
|
}
|
||||||
if msgs := validation.IsValidPathSegmentName(resourceName); len(msgs) != 0 {
|
if msgs := pathvalidation.IsValidPathSegmentName(resourceName); len(msgs) != 0 {
|
||||||
r.err = fmt.Errorf("invalid resource name %q: %v", resourceName, msgs)
|
r.err = fmt.Errorf("invalid resource name %q: %v", resourceName, msgs)
|
||||||
return r
|
return r
|
||||||
}
|
}
|
||||||
@ -238,7 +238,7 @@ func (r *Request) Namespace(namespace string) *Request {
|
|||||||
r.err = fmt.Errorf("namespace already set to %q, cannot change to %q", r.namespace, namespace)
|
r.err = fmt.Errorf("namespace already set to %q, cannot change to %q", r.namespace, namespace)
|
||||||
return r
|
return r
|
||||||
}
|
}
|
||||||
if msgs := validation.IsValidPathSegmentName(namespace); len(msgs) != 0 {
|
if msgs := pathvalidation.IsValidPathSegmentName(namespace); len(msgs) != 0 {
|
||||||
r.err = fmt.Errorf("invalid namespace %q: %v", namespace, msgs)
|
r.err = fmt.Errorf("invalid namespace %q: %v", namespace, msgs)
|
||||||
return r
|
return r
|
||||||
}
|
}
|
||||||
|
@ -29,7 +29,7 @@ import (
|
|||||||
"k8s.io/kubernetes/pkg/api/meta"
|
"k8s.io/kubernetes/pkg/api/meta"
|
||||||
"k8s.io/kubernetes/pkg/api/rest"
|
"k8s.io/kubernetes/pkg/api/rest"
|
||||||
"k8s.io/kubernetes/pkg/api/unversioned"
|
"k8s.io/kubernetes/pkg/api/unversioned"
|
||||||
"k8s.io/kubernetes/pkg/api/validation"
|
"k8s.io/kubernetes/pkg/api/validation/path"
|
||||||
"k8s.io/kubernetes/pkg/fields"
|
"k8s.io/kubernetes/pkg/fields"
|
||||||
"k8s.io/kubernetes/pkg/labels"
|
"k8s.io/kubernetes/pkg/labels"
|
||||||
"k8s.io/kubernetes/pkg/registry/generic"
|
"k8s.io/kubernetes/pkg/registry/generic"
|
||||||
@ -145,7 +145,7 @@ func NamespaceKeyFunc(ctx api.Context, prefix string, name string) (string, erro
|
|||||||
if len(name) == 0 {
|
if len(name) == 0 {
|
||||||
return "", kubeerr.NewBadRequest("Name parameter required.")
|
return "", kubeerr.NewBadRequest("Name parameter required.")
|
||||||
}
|
}
|
||||||
if msgs := validation.IsValidPathSegmentName(name); len(msgs) != 0 {
|
if msgs := path.IsValidPathSegmentName(name); len(msgs) != 0 {
|
||||||
return "", kubeerr.NewBadRequest(fmt.Sprintf("Name parameter invalid: %q: %s", name, strings.Join(msgs, ";")))
|
return "", kubeerr.NewBadRequest(fmt.Sprintf("Name parameter invalid: %q: %s", name, strings.Join(msgs, ";")))
|
||||||
}
|
}
|
||||||
key = key + "/" + name
|
key = key + "/" + name
|
||||||
@ -157,7 +157,7 @@ func NoNamespaceKeyFunc(ctx api.Context, prefix string, name string) (string, er
|
|||||||
if len(name) == 0 {
|
if len(name) == 0 {
|
||||||
return "", kubeerr.NewBadRequest("Name parameter required.")
|
return "", kubeerr.NewBadRequest("Name parameter required.")
|
||||||
}
|
}
|
||||||
if msgs := validation.IsValidPathSegmentName(name); len(msgs) != 0 {
|
if msgs := path.IsValidPathSegmentName(name); len(msgs) != 0 {
|
||||||
return "", kubeerr.NewBadRequest(fmt.Sprintf("Name parameter invalid: %q: %s", name, strings.Join(msgs, ";")))
|
return "", kubeerr.NewBadRequest(fmt.Sprintf("Name parameter invalid: %q: %s", name, strings.Join(msgs, ";")))
|
||||||
}
|
}
|
||||||
key := prefix + "/" + name
|
key := prefix + "/" + name
|
||||||
|
@ -22,7 +22,7 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"k8s.io/kubernetes/pkg/api/meta"
|
"k8s.io/kubernetes/pkg/api/meta"
|
||||||
"k8s.io/kubernetes/pkg/api/validation"
|
"k8s.io/kubernetes/pkg/api/validation/path"
|
||||||
"k8s.io/kubernetes/pkg/runtime"
|
"k8s.io/kubernetes/pkg/runtime"
|
||||||
"k8s.io/kubernetes/pkg/util/validation/field"
|
"k8s.io/kubernetes/pkg/util/validation/field"
|
||||||
)
|
)
|
||||||
@ -107,7 +107,7 @@ func NamespaceKeyFunc(prefix string, obj runtime.Object) (string, error) {
|
|||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
name := meta.GetName()
|
name := meta.GetName()
|
||||||
if msgs := validation.IsValidPathSegmentName(name); len(msgs) != 0 {
|
if msgs := path.IsValidPathSegmentName(name); len(msgs) != 0 {
|
||||||
return "", fmt.Errorf("invalid name: %v", msgs)
|
return "", fmt.Errorf("invalid name: %v", msgs)
|
||||||
}
|
}
|
||||||
return prefix + "/" + meta.GetNamespace() + "/" + name, nil
|
return prefix + "/" + meta.GetNamespace() + "/" + name, nil
|
||||||
@ -119,7 +119,7 @@ func NoNamespaceKeyFunc(prefix string, obj runtime.Object) (string, error) {
|
|||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
name := meta.GetName()
|
name := meta.GetName()
|
||||||
if msgs := validation.IsValidPathSegmentName(name); len(msgs) != 0 {
|
if msgs := path.IsValidPathSegmentName(name); len(msgs) != 0 {
|
||||||
return "", fmt.Errorf("invalid name: %v", msgs)
|
return "", fmt.Errorf("invalid name: %v", msgs)
|
||||||
}
|
}
|
||||||
return prefix + "/" + name, nil
|
return prefix + "/" + name, nil
|
||||||
|
Loading…
Reference in New Issue
Block a user