Commit 8f7262e8 authored by Antoine Pelisse's avatar Antoine Pelisse

Update kube-openapi to use validation

parent fcf9b1f7
...@@ -3052,31 +3052,35 @@ ...@@ -3052,31 +3052,35 @@
}, },
{ {
"ImportPath": "k8s.io/kube-openapi/pkg/aggregator", "ImportPath": "k8s.io/kube-openapi/pkg/aggregator",
"Rev": "61b46af70dfed79c6d24530cd23b41440a7f22a5" "Rev": "39a7bf85c140f972372c2a0d1ee40adbf0c8bfe1"
}, },
{ {
"ImportPath": "k8s.io/kube-openapi/pkg/builder", "ImportPath": "k8s.io/kube-openapi/pkg/builder",
"Rev": "61b46af70dfed79c6d24530cd23b41440a7f22a5" "Rev": "39a7bf85c140f972372c2a0d1ee40adbf0c8bfe1"
}, },
{ {
"ImportPath": "k8s.io/kube-openapi/pkg/common", "ImportPath": "k8s.io/kube-openapi/pkg/common",
"Rev": "61b46af70dfed79c6d24530cd23b41440a7f22a5" "Rev": "39a7bf85c140f972372c2a0d1ee40adbf0c8bfe1"
}, },
{ {
"ImportPath": "k8s.io/kube-openapi/pkg/generators", "ImportPath": "k8s.io/kube-openapi/pkg/generators",
"Rev": "61b46af70dfed79c6d24530cd23b41440a7f22a5" "Rev": "39a7bf85c140f972372c2a0d1ee40adbf0c8bfe1"
}, },
{ {
"ImportPath": "k8s.io/kube-openapi/pkg/handler", "ImportPath": "k8s.io/kube-openapi/pkg/handler",
"Rev": "61b46af70dfed79c6d24530cd23b41440a7f22a5" "Rev": "39a7bf85c140f972372c2a0d1ee40adbf0c8bfe1"
}, },
{ {
"ImportPath": "k8s.io/kube-openapi/pkg/util", "ImportPath": "k8s.io/kube-openapi/pkg/util",
"Rev": "61b46af70dfed79c6d24530cd23b41440a7f22a5" "Rev": "39a7bf85c140f972372c2a0d1ee40adbf0c8bfe1"
}, },
{ {
"ImportPath": "k8s.io/kube-openapi/pkg/util/proto", "ImportPath": "k8s.io/kube-openapi/pkg/util/proto",
"Rev": "61b46af70dfed79c6d24530cd23b41440a7f22a5" "Rev": "39a7bf85c140f972372c2a0d1ee40adbf0c8bfe1"
},
{
"ImportPath": "k8s.io/kube-openapi/pkg/util/proto/validation",
"Rev": "39a7bf85c140f972372c2a0d1ee40adbf0c8bfe1"
}, },
{ {
"ImportPath": "k8s.io/utils/exec", "ImportPath": "k8s.io/utils/exec",
......
...@@ -8,11 +8,7 @@ load( ...@@ -8,11 +8,7 @@ load(
go_library( go_library(
name = "go_default_library", name = "go_default_library",
srcs = [ srcs = ["validation.go"],
"errors.go",
"types.go",
"validation.go",
],
importpath = "k8s.io/kubernetes/pkg/kubectl/cmd/util/openapi/validation", importpath = "k8s.io/kubernetes/pkg/kubectl/cmd/util/openapi/validation",
deps = [ deps = [
"//pkg/kubectl/cmd/util/openapi:go_default_library", "//pkg/kubectl/cmd/util/openapi:go_default_library",
...@@ -20,20 +16,20 @@ go_library( ...@@ -20,20 +16,20 @@ go_library(
"//vendor/k8s.io/apimachinery/pkg/util/errors:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/errors:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/util/json:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/json:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/util/yaml:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/yaml:go_default_library",
"//vendor/k8s.io/kube-openapi/pkg/util/proto:go_default_library", "//vendor/k8s.io/kube-openapi/pkg/util/proto/validation:go_default_library",
], ],
) )
go_test( go_test(
name = "go_default_xtest", name = "go_default_test",
srcs = [ srcs = [
"validation_suite_test.go", "validation_suite_test.go",
"validation_test.go", "validation_test.go",
], ],
data = ["//api/openapi-spec:swagger-spec"], data = ["//api/openapi-spec:swagger-spec"],
importpath = "k8s.io/kubernetes/pkg/kubectl/cmd/util/openapi/validation_test", importpath = "k8s.io/kubernetes/pkg/kubectl/cmd/util/openapi/validation",
library = ":go_default_library",
deps = [ deps = [
":go_default_library",
"//pkg/api/testapi:go_default_library", "//pkg/api/testapi:go_default_library",
"//pkg/kubectl/cmd/util/openapi:go_default_library", "//pkg/kubectl/cmd/util/openapi:go_default_library",
"//pkg/kubectl/cmd/util/openapi/testing:go_default_library", "//pkg/kubectl/cmd/util/openapi/testing:go_default_library",
...@@ -42,6 +38,7 @@ go_test( ...@@ -42,6 +38,7 @@ go_test(
"//vendor/github.com/onsi/ginkgo/types:go_default_library", "//vendor/github.com/onsi/ginkgo/types:go_default_library",
"//vendor/github.com/onsi/gomega:go_default_library", "//vendor/github.com/onsi/gomega:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/util/errors:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/errors:go_default_library",
"//vendor/k8s.io/kube-openapi/pkg/util/proto/validation:go_default_library",
], ],
) )
......
...@@ -24,20 +24,25 @@ import ( ...@@ -24,20 +24,25 @@ import (
utilerrors "k8s.io/apimachinery/pkg/util/errors" utilerrors "k8s.io/apimachinery/pkg/util/errors"
"k8s.io/apimachinery/pkg/util/json" "k8s.io/apimachinery/pkg/util/json"
"k8s.io/apimachinery/pkg/util/yaml" "k8s.io/apimachinery/pkg/util/yaml"
"k8s.io/kube-openapi/pkg/util/proto" "k8s.io/kube-openapi/pkg/util/proto/validation"
"k8s.io/kubernetes/pkg/kubectl/cmd/util/openapi" "k8s.io/kubernetes/pkg/kubectl/cmd/util/openapi"
) )
// SchemaValidation validates the object against an OpenAPI schema.
type SchemaValidation struct { type SchemaValidation struct {
resources openapi.Resources resources openapi.Resources
} }
// NewSchemaValidation creates a new SchemaValidation that can be used
// to validate objects.
func NewSchemaValidation(resources openapi.Resources) *SchemaValidation { func NewSchemaValidation(resources openapi.Resources) *SchemaValidation {
return &SchemaValidation{ return &SchemaValidation{
resources: resources, resources: resources,
} }
} }
// ValidateBytes will validates the object against using the Resources
// object.
func (v *SchemaValidation) ValidateBytes(data []byte) error { func (v *SchemaValidation) ValidateBytes(data []byte) error {
obj, err := parse(data) obj, err := parse(data)
if err != nil { if err != nil {
...@@ -80,12 +85,7 @@ func (v *SchemaValidation) validateResource(obj interface{}, gvk schema.GroupVer ...@@ -80,12 +85,7 @@ func (v *SchemaValidation) validateResource(obj interface{}, gvk schema.GroupVer
return nil return nil
} }
rootValidation, err := itemFactory(proto.NewPath(gvk.Kind), obj) return validation.ValidateModel(obj, resource, gvk.Kind)
if err != nil {
return []error{err}
}
resource.Accept(rootValidation)
return rootValidation.Errors()
} }
func parse(data []byte) (interface{}, error) { func parse(data []byte) (interface{}, error) {
......
...@@ -14,7 +14,7 @@ See the License for the specific language governing permissions and ...@@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package validation_test package validation
import ( import (
. "github.com/onsi/ginkgo" . "github.com/onsi/ginkgo"
......
...@@ -14,7 +14,7 @@ See the License for the specific language governing permissions and ...@@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package validation_test package validation
import ( import (
"path/filepath" "path/filepath"
...@@ -23,23 +23,23 @@ import ( ...@@ -23,23 +23,23 @@ import (
. "github.com/onsi/gomega" . "github.com/onsi/gomega"
utilerrors "k8s.io/apimachinery/pkg/util/errors" utilerrors "k8s.io/apimachinery/pkg/util/errors"
"k8s.io/kube-openapi/pkg/util/proto/validation"
// This dependency is needed to register API types. // This dependency is needed to register API types.
_ "k8s.io/kubernetes/pkg/api/testapi" _ "k8s.io/kubernetes/pkg/api/testapi"
"k8s.io/kubernetes/pkg/kubectl/cmd/util/openapi" "k8s.io/kubernetes/pkg/kubectl/cmd/util/openapi"
tst "k8s.io/kubernetes/pkg/kubectl/cmd/util/openapi/testing" tst "k8s.io/kubernetes/pkg/kubectl/cmd/util/openapi/testing"
"k8s.io/kubernetes/pkg/kubectl/cmd/util/openapi/validation"
) )
var fakeSchema = tst.Fake{Path: filepath.Join("..", "..", "..", "..", "..", "..", "api", "openapi-spec", "swagger.json")} var fakeSchema = tst.Fake{Path: filepath.Join("..", "..", "..", "..", "..", "..", "api", "openapi-spec", "swagger.json")}
var _ = Describe("resource validation using OpenAPI Schema", func() { var _ = Describe("resource validation using OpenAPI Schema", func() {
var validator *validation.SchemaValidation var validator *SchemaValidation
BeforeEach(func() { BeforeEach(func() {
s, err := fakeSchema.OpenAPISchema() s, err := fakeSchema.OpenAPISchema()
Expect(err).To(BeNil()) Expect(err).To(BeNil())
resources, err := openapi.NewOpenAPIData(s) resources, err := openapi.NewOpenAPIData(s)
Expect(err).To(BeNil()) Expect(err).To(BeNil())
validator = validation.NewSchemaValidation(resources) validator = NewSchemaValidation(resources)
Expect(validator).ToNot(BeNil()) Expect(validator).ToNot(BeNil())
}) })
......
...@@ -216,7 +216,7 @@ ...@@ -216,7 +216,7 @@
}, },
{ {
"ImportPath": "k8s.io/kube-openapi/pkg/common", "ImportPath": "k8s.io/kube-openapi/pkg/common",
"Rev": "61b46af70dfed79c6d24530cd23b41440a7f22a5" "Rev": "39a7bf85c140f972372c2a0d1ee40adbf0c8bfe1"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/api/resource", "ImportPath": "k8s.io/apimachinery/pkg/api/resource",
......
...@@ -1556,19 +1556,19 @@ ...@@ -1556,19 +1556,19 @@
}, },
{ {
"ImportPath": "k8s.io/kube-openapi/pkg/builder", "ImportPath": "k8s.io/kube-openapi/pkg/builder",
"Rev": "61b46af70dfed79c6d24530cd23b41440a7f22a5" "Rev": "39a7bf85c140f972372c2a0d1ee40adbf0c8bfe1"
}, },
{ {
"ImportPath": "k8s.io/kube-openapi/pkg/common", "ImportPath": "k8s.io/kube-openapi/pkg/common",
"Rev": "61b46af70dfed79c6d24530cd23b41440a7f22a5" "Rev": "39a7bf85c140f972372c2a0d1ee40adbf0c8bfe1"
}, },
{ {
"ImportPath": "k8s.io/kube-openapi/pkg/handler", "ImportPath": "k8s.io/kube-openapi/pkg/handler",
"Rev": "61b46af70dfed79c6d24530cd23b41440a7f22a5" "Rev": "39a7bf85c140f972372c2a0d1ee40adbf0c8bfe1"
}, },
{ {
"ImportPath": "k8s.io/kube-openapi/pkg/util", "ImportPath": "k8s.io/kube-openapi/pkg/util",
"Rev": "61b46af70dfed79c6d24530cd23b41440a7f22a5" "Rev": "39a7bf85c140f972372c2a0d1ee40adbf0c8bfe1"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/api/equality", "ImportPath": "k8s.io/apimachinery/pkg/api/equality",
......
...@@ -216,7 +216,7 @@ ...@@ -216,7 +216,7 @@
}, },
{ {
"ImportPath": "k8s.io/kube-openapi/pkg/common", "ImportPath": "k8s.io/kube-openapi/pkg/common",
"Rev": "61b46af70dfed79c6d24530cd23b41440a7f22a5" "Rev": "39a7bf85c140f972372c2a0d1ee40adbf0c8bfe1"
} }
] ]
} }
...@@ -1612,19 +1612,19 @@ ...@@ -1612,19 +1612,19 @@
}, },
{ {
"ImportPath": "k8s.io/kube-openapi/pkg/builder", "ImportPath": "k8s.io/kube-openapi/pkg/builder",
"Rev": "61b46af70dfed79c6d24530cd23b41440a7f22a5" "Rev": "39a7bf85c140f972372c2a0d1ee40adbf0c8bfe1"
}, },
{ {
"ImportPath": "k8s.io/kube-openapi/pkg/common", "ImportPath": "k8s.io/kube-openapi/pkg/common",
"Rev": "61b46af70dfed79c6d24530cd23b41440a7f22a5" "Rev": "39a7bf85c140f972372c2a0d1ee40adbf0c8bfe1"
}, },
{ {
"ImportPath": "k8s.io/kube-openapi/pkg/handler", "ImportPath": "k8s.io/kube-openapi/pkg/handler",
"Rev": "61b46af70dfed79c6d24530cd23b41440a7f22a5" "Rev": "39a7bf85c140f972372c2a0d1ee40adbf0c8bfe1"
}, },
{ {
"ImportPath": "k8s.io/kube-openapi/pkg/util", "ImportPath": "k8s.io/kube-openapi/pkg/util",
"Rev": "61b46af70dfed79c6d24530cd23b41440a7f22a5" "Rev": "39a7bf85c140f972372c2a0d1ee40adbf0c8bfe1"
}, },
{ {
"ImportPath": "k8s.io/client-go/discovery", "ImportPath": "k8s.io/client-go/discovery",
......
...@@ -692,7 +692,7 @@ ...@@ -692,7 +692,7 @@
}, },
{ {
"ImportPath": "k8s.io/kube-openapi/pkg/common", "ImportPath": "k8s.io/kube-openapi/pkg/common",
"Rev": "61b46af70dfed79c6d24530cd23b41440a7f22a5" "Rev": "39a7bf85c140f972372c2a0d1ee40adbf0c8bfe1"
} }
] ]
} }
...@@ -252,11 +252,11 @@ ...@@ -252,11 +252,11 @@
}, },
{ {
"ImportPath": "k8s.io/kube-openapi/pkg/common", "ImportPath": "k8s.io/kube-openapi/pkg/common",
"Rev": "61b46af70dfed79c6d24530cd23b41440a7f22a5" "Rev": "39a7bf85c140f972372c2a0d1ee40adbf0c8bfe1"
}, },
{ {
"ImportPath": "k8s.io/kube-openapi/pkg/generators", "ImportPath": "k8s.io/kube-openapi/pkg/generators",
"Rev": "61b46af70dfed79c6d24530cd23b41440a7f22a5" "Rev": "39a7bf85c140f972372c2a0d1ee40adbf0c8bfe1"
} }
] ]
} }
...@@ -1544,23 +1544,23 @@ ...@@ -1544,23 +1544,23 @@
}, },
{ {
"ImportPath": "k8s.io/kube-openapi/pkg/aggregator", "ImportPath": "k8s.io/kube-openapi/pkg/aggregator",
"Rev": "61b46af70dfed79c6d24530cd23b41440a7f22a5" "Rev": "39a7bf85c140f972372c2a0d1ee40adbf0c8bfe1"
}, },
{ {
"ImportPath": "k8s.io/kube-openapi/pkg/builder", "ImportPath": "k8s.io/kube-openapi/pkg/builder",
"Rev": "61b46af70dfed79c6d24530cd23b41440a7f22a5" "Rev": "39a7bf85c140f972372c2a0d1ee40adbf0c8bfe1"
}, },
{ {
"ImportPath": "k8s.io/kube-openapi/pkg/common", "ImportPath": "k8s.io/kube-openapi/pkg/common",
"Rev": "61b46af70dfed79c6d24530cd23b41440a7f22a5" "Rev": "39a7bf85c140f972372c2a0d1ee40adbf0c8bfe1"
}, },
{ {
"ImportPath": "k8s.io/kube-openapi/pkg/handler", "ImportPath": "k8s.io/kube-openapi/pkg/handler",
"Rev": "61b46af70dfed79c6d24530cd23b41440a7f22a5" "Rev": "39a7bf85c140f972372c2a0d1ee40adbf0c8bfe1"
}, },
{ {
"ImportPath": "k8s.io/kube-openapi/pkg/util", "ImportPath": "k8s.io/kube-openapi/pkg/util",
"Rev": "61b46af70dfed79c6d24530cd23b41440a7f22a5" "Rev": "39a7bf85c140f972372c2a0d1ee40adbf0c8bfe1"
} }
] ]
} }
...@@ -520,7 +520,7 @@ ...@@ -520,7 +520,7 @@
}, },
{ {
"ImportPath": "k8s.io/kube-openapi/pkg/common", "ImportPath": "k8s.io/kube-openapi/pkg/common",
"Rev": "61b46af70dfed79c6d24530cd23b41440a7f22a5" "Rev": "39a7bf85c140f972372c2a0d1ee40adbf0c8bfe1"
} }
] ]
} }
...@@ -1532,19 +1532,19 @@ ...@@ -1532,19 +1532,19 @@
}, },
{ {
"ImportPath": "k8s.io/kube-openapi/pkg/builder", "ImportPath": "k8s.io/kube-openapi/pkg/builder",
"Rev": "61b46af70dfed79c6d24530cd23b41440a7f22a5" "Rev": "39a7bf85c140f972372c2a0d1ee40adbf0c8bfe1"
}, },
{ {
"ImportPath": "k8s.io/kube-openapi/pkg/common", "ImportPath": "k8s.io/kube-openapi/pkg/common",
"Rev": "61b46af70dfed79c6d24530cd23b41440a7f22a5" "Rev": "39a7bf85c140f972372c2a0d1ee40adbf0c8bfe1"
}, },
{ {
"ImportPath": "k8s.io/kube-openapi/pkg/handler", "ImportPath": "k8s.io/kube-openapi/pkg/handler",
"Rev": "61b46af70dfed79c6d24530cd23b41440a7f22a5" "Rev": "39a7bf85c140f972372c2a0d1ee40adbf0c8bfe1"
}, },
{ {
"ImportPath": "k8s.io/kube-openapi/pkg/util", "ImportPath": "k8s.io/kube-openapi/pkg/util",
"Rev": "61b46af70dfed79c6d24530cd23b41440a7f22a5" "Rev": "39a7bf85c140f972372c2a0d1ee40adbf0c8bfe1"
} }
] ]
} }
...@@ -940,7 +940,7 @@ ...@@ -940,7 +940,7 @@
}, },
{ {
"ImportPath": "k8s.io/kube-openapi/pkg/common", "ImportPath": "k8s.io/kube-openapi/pkg/common",
"Rev": "61b46af70dfed79c6d24530cd23b41440a7f22a5" "Rev": "39a7bf85c140f972372c2a0d1ee40adbf0c8bfe1"
} }
] ]
} }
...@@ -41,8 +41,6 @@ filegroup( ...@@ -41,8 +41,6 @@ filegroup(
"//vendor/github.com/aws/aws-sdk-go/service/elb:all-srcs", "//vendor/github.com/aws/aws-sdk-go/service/elb:all-srcs",
"//vendor/github.com/aws/aws-sdk-go/service/kms:all-srcs", "//vendor/github.com/aws/aws-sdk-go/service/kms:all-srcs",
"//vendor/github.com/aws/aws-sdk-go/service/sts:all-srcs", "//vendor/github.com/aws/aws-sdk-go/service/sts:all-srcs",
"//vendor/github.com/aws/aws-sdk-go/vendor/github.com/go-ini/ini:all-srcs",
"//vendor/github.com/aws/aws-sdk-go/vendor/github.com/jmespath/go-jmespath:all-srcs",
"//vendor/github.com/beorn7/perks/quantile:all-srcs", "//vendor/github.com/beorn7/perks/quantile:all-srcs",
"//vendor/github.com/blang/semver:all-srcs", "//vendor/github.com/blang/semver:all-srcs",
"//vendor/github.com/boltdb/bolt:all-srcs", "//vendor/github.com/boltdb/bolt:all-srcs",
......
load("@io_bazel_rules_go//go:def.bzl", "go_library")
go_library(
name = "go_default_library",
srcs = ["waiter.go"],
importpath = "github.com/aws/aws-sdk-go/private/waiter",
visibility = ["//visibility:public"],
deps = [
"//vendor/github.com/aws/aws-sdk-go/aws:go_default_library",
"//vendor/github.com/aws/aws-sdk-go/aws/awserr:go_default_library",
"//vendor/github.com/aws/aws-sdk-go/aws/awsutil:go_default_library",
"//vendor/github.com/aws/aws-sdk-go/aws/request:go_default_library",
],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)
...@@ -2,7 +2,10 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library") ...@@ -2,7 +2,10 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library")
go_library( go_library(
name = "go_default_library", name = "go_default_library",
srcs = ["trie.go"], srcs = [
"trie.go",
"util.go",
],
importpath = "k8s.io/kube-openapi/pkg/util", importpath = "k8s.io/kube-openapi/pkg/util",
visibility = ["//visibility:public"], visibility = ["//visibility:public"],
) )
......
...@@ -24,7 +24,10 @@ filegroup( ...@@ -24,7 +24,10 @@ filegroup(
filegroup( filegroup(
name = "all-srcs", name = "all-srcs",
srcs = [":package-srcs"], srcs = [
":package-srcs",
"//vendor/k8s.io/kube-openapi/pkg/util/proto/validation:all-srcs",
],
tags = ["automanaged"], tags = ["automanaged"],
visibility = ["//visibility:public"], visibility = ["//visibility:public"],
) )
...@@ -3,16 +3,13 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library") ...@@ -3,16 +3,13 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library")
go_library( go_library(
name = "go_default_library", name = "go_default_library",
srcs = [ srcs = [
"api.go", "errors.go",
"astnodetype_string.go", "types.go",
"functions.go", "validation.go",
"interpreter.go",
"lexer.go",
"parser.go",
"toktype_string.go",
"util.go",
], ],
importpath = "k8s.io/kube-openapi/pkg/util/proto/validation",
visibility = ["//visibility:public"], visibility = ["//visibility:public"],
deps = ["//vendor/k8s.io/kube-openapi/pkg/util/proto:go_default_library"],
) )
filegroup( filegroup(
......
...@@ -20,15 +20,15 @@ import ( ...@@ -20,15 +20,15 @@ import (
"fmt" "fmt"
) )
type Errors struct { type errors struct {
errors []error errors []error
} }
func (e *Errors) Errors() []error { func (e *errors) Errors() []error {
return e.errors return e.errors
} }
func (e *Errors) AppendErrors(err ...error) { func (e *errors) AppendErrors(err ...error) {
e.errors = append(e.errors, err...) e.errors = append(e.errors, err...)
} }
......
...@@ -23,7 +23,7 @@ import ( ...@@ -23,7 +23,7 @@ import (
"k8s.io/kube-openapi/pkg/util/proto" "k8s.io/kube-openapi/pkg/util/proto"
) )
type ValidationItem interface { type validationItem interface {
proto.SchemaVisitor proto.SchemaVisitor
Errors() []error Errors() []error
...@@ -31,7 +31,7 @@ type ValidationItem interface { ...@@ -31,7 +31,7 @@ type ValidationItem interface {
} }
type baseItem struct { type baseItem struct {
errors Errors errors errors
path proto.Path path proto.Path
} }
...@@ -78,7 +78,7 @@ func (item *mapItem) sortedKeys() []string { ...@@ -78,7 +78,7 @@ func (item *mapItem) sortedKeys() []string {
return sortedKeys return sortedKeys
} }
var _ ValidationItem = &mapItem{} var _ validationItem = &mapItem{}
func (item *mapItem) VisitPrimitive(schema *proto.Primitive) { func (item *mapItem) VisitPrimitive(schema *proto.Primitive) {
item.AddValidationError(InvalidTypeError{Path: schema.GetPath().String(), Expected: schema.Type, Actual: "map"}) item.AddValidationError(InvalidTypeError{Path: schema.GetPath().String(), Expected: schema.Type, Actual: "map"})
...@@ -139,7 +139,7 @@ type arrayItem struct { ...@@ -139,7 +139,7 @@ type arrayItem struct {
Array []interface{} Array []interface{}
} }
var _ ValidationItem = &arrayItem{} var _ validationItem = &arrayItem{}
func (item *arrayItem) VisitPrimitive(schema *proto.Primitive) { func (item *arrayItem) VisitPrimitive(schema *proto.Primitive) {
item.AddValidationError(InvalidTypeError{Path: schema.GetPath().String(), Expected: schema.Type, Actual: "array"}) item.AddValidationError(InvalidTypeError{Path: schema.GetPath().String(), Expected: schema.Type, Actual: "array"})
...@@ -183,7 +183,7 @@ type primitiveItem struct { ...@@ -183,7 +183,7 @@ type primitiveItem struct {
Kind string Kind string
} }
var _ ValidationItem = &primitiveItem{} var _ validationItem = &primitiveItem{}
func (item *primitiveItem) VisitPrimitive(schema *proto.Primitive) { func (item *primitiveItem) VisitPrimitive(schema *proto.Primitive) {
// Some types of primitives can match more than one (a number // Some types of primitives can match more than one (a number
...@@ -232,7 +232,7 @@ func (item *primitiveItem) VisitReference(schema proto.Reference) { ...@@ -232,7 +232,7 @@ func (item *primitiveItem) VisitReference(schema proto.Reference) {
} }
// itemFactory creates the relevant item type/visitor based on the current yaml type. // itemFactory creates the relevant item type/visitor based on the current yaml type.
func itemFactory(path proto.Path, v interface{}) (ValidationItem, error) { func itemFactory(path proto.Path, v interface{}) (validationItem, error) {
// We need to special case for no-type fields in yaml (e.g. empty item in list) // We need to special case for no-type fields in yaml (e.g. empty item in list)
if v == nil { if v == nil {
return nil, InvalidObjectTypeError{Type: "nil", Path: path.String()} return nil, InvalidObjectTypeError{Type: "nil", Path: path.String()}
......
/*
Copyright 2017 The Kubernetes Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package validation
import (
"k8s.io/kube-openapi/pkg/util/proto"
)
func ValidateModel(obj interface{}, schema proto.Schema, name string) []error {
rootValidation, err := itemFactory(proto.NewPath(name), obj)
if err != nil {
return []error{err}
}
schema.Accept(rootValidation)
return rootValidation.Errors()
}
/*
Copyright 2017 The Kubernetes Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package util
import "strings"
// ToCanonicalName converts Golang package/type name into canonical OpenAPI name.
// Examples:
// Input: k8s.io/api/core/v1.Pod
// Output: io.k8s.api.core.v1.Pod
//
// Input: k8s.io/api/core/v1
// Output: io.k8s.api.core.v1
func ToCanonicalName(name string) string {
nameParts := strings.Split(name, "/")
// Reverse first part. e.g., io.k8s... instead of k8s.io...
if len(nameParts) > 0 && strings.Contains(nameParts[0], ".") {
parts := strings.Split(nameParts[0], ".")
for i, j := 0, len(parts)-1; i < j; i, j = i+1, j-1 {
parts[i], parts[j] = parts[j], parts[i]
}
nameParts[0] = strings.Join(parts, ".")
}
return strings.Join(nameParts, ".")
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment