// Copyright 2017 The kubecfg 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 utils import ( "fmt" log "github.com/sirupsen/logrus" "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/client-go/discovery" "k8s.io/kube-openapi/pkg/util/proto" "k8s.io/kube-openapi/pkg/util/proto/validation" "k8s.io/kubectl/pkg/util/openapi" ) // OpenAPISchema represents an OpenAPI schema for a given GroupVersionKind. type OpenAPISchema struct { schema proto.Schema } // NewOpenAPISchemaFor returns the OpenAPISchema object ready to validate objects of given GroupVersion func NewOpenAPISchemaFor(delegate discovery.OpenAPISchemaInterface, gvk schema.GroupVersionKind) (*OpenAPISchema, error) { log.Debugf("Fetching schema for %v", gvk) doc, err := delegate.OpenAPISchema() if err != nil { return nil, err } res, err := openapi.NewOpenAPIData(doc) if err != nil { return nil, err } sc := res.LookupResource(gvk) if sc == nil { gvr := schema.GroupResource{ // TODO(mkm): figure out a meaningful group+resource for schemas. Group: "schema", Resource: "schema", } return nil, errors.NewNotFound(gvr, fmt.Sprintf("%s", gvk)) } return &OpenAPISchema{schema: sc}, nil } // Validate is the primary entrypoint into this class func (s *OpenAPISchema) Validate(obj *unstructured.Unstructured) []error { gvk := obj.GroupVersionKind() log.Infof("validate object %q", gvk) return validation.ValidateModel(obj.UnstructuredContent(), s.schema, fmt.Sprintf("%s.%s", gvk.Version, gvk.Kind)) }