| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 |
- package crdvalidation
- import (
- spec "github.com/go-openapi/spec"
- extensionsobj "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1"
- metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
- common "k8s.io/kube-openapi/pkg/common"
- )
- // CustomResourceDefinitionTypeMeta set the default kind/apiversion of CRD
- var CustomResourceDefinitionTypeMeta = metav1.TypeMeta{
- Kind: "CustomResourceDefinition",
- APIVersion: "apiextensions.k8s.io/v1beta1",
- }
- // OpenAPIRefCallBack returns a jsonref using the input string without modification
- func OpenAPIRefCallBack(name string) spec.Ref {
- return spec.MustCreateRef(name)
- }
- // GetAPIDefinition is a function returning a map with all Definition
- type GetAPIDefinitions func(ref common.ReferenceCallback) map[string]common.OpenAPIDefinition
- // GetCustomResourceValidations returns a CRD validation spec map. It took the openapi generated definition from kube-openapi as argument
- func GetCustomResourceValidations(fn GetAPIDefinitions) map[string]*extensionsobj.CustomResourceValidation {
- openapiSpec := fn(OpenAPIRefCallBack)
- var definitions map[string]*extensionsobj.CustomResourceValidation
- definitions = make(map[string]*extensionsobj.CustomResourceValidation)
- for key, definition := range openapiSpec {
- schema := definition.Schema
- definitions[key] = &extensionsobj.CustomResourceValidation{
- OpenAPIV3Schema: SchemaPropsToJSONProps(&schema, openapiSpec, true),
- }
- }
- return definitions
- }
- // GetCustomResourceValidation returns the validation definition for a CRD name
- func GetCustomResourceValidation(name string, fn func(ref common.ReferenceCallback) map[string]common.OpenAPIDefinition) *extensionsobj.CustomResourceValidation {
- openapiSpec := fn(OpenAPIRefCallBack)
- fixKnownTypes(openapiSpec)
- schema := openapiSpec[name].Schema
- crv := &extensionsobj.CustomResourceValidation{
- OpenAPIV3Schema: SchemaPropsToJSONProps(&schema, openapiSpec, true),
- }
- crv.OpenAPIV3Schema.Description = ""
- crv.OpenAPIV3Schema.Required = nil
- return crv
- }
- // ref: https://github.com/kubernetes/kubernetes/issues/62329
- func fixKnownTypes(openapiSpec map[string]common.OpenAPIDefinition) {
- openapiSpec["k8s.io/apimachinery/pkg/util/intstr.IntOrString"] = common.OpenAPIDefinition{
- Schema: spec.Schema{
- SchemaProps: spec.SchemaProps{
- AnyOf: []spec.Schema{
- {
- SchemaProps: spec.SchemaProps{
- Type: []string{"string"},
- },
- },
- {
- SchemaProps: spec.SchemaProps{
- Type: []string{"integer"},
- },
- },
- },
- },
- },
- }
- }
|