crdvalidation.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. package crdvalidation
  2. import (
  3. spec "github.com/go-openapi/spec"
  4. extensionsobj "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1"
  5. metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
  6. common "k8s.io/kube-openapi/pkg/common"
  7. )
  8. // CustomResourceDefinitionTypeMeta set the default kind/apiversion of CRD
  9. var CustomResourceDefinitionTypeMeta = metav1.TypeMeta{
  10. Kind: "CustomResourceDefinition",
  11. APIVersion: "apiextensions.k8s.io/v1beta1",
  12. }
  13. // OpenAPIRefCallBack returns a jsonref using the input string without modification
  14. func OpenAPIRefCallBack(name string) spec.Ref {
  15. return spec.MustCreateRef(name)
  16. }
  17. // GetAPIDefinition is a function returning a map with all Definition
  18. type GetAPIDefinitions func(ref common.ReferenceCallback) map[string]common.OpenAPIDefinition
  19. // GetCustomResourceValidations returns a CRD validation spec map. It took the openapi generated definition from kube-openapi as argument
  20. func GetCustomResourceValidations(fn GetAPIDefinitions) map[string]*extensionsobj.CustomResourceValidation {
  21. openapiSpec := fn(OpenAPIRefCallBack)
  22. var definitions map[string]*extensionsobj.CustomResourceValidation
  23. definitions = make(map[string]*extensionsobj.CustomResourceValidation)
  24. for key, definition := range openapiSpec {
  25. schema := definition.Schema
  26. definitions[key] = &extensionsobj.CustomResourceValidation{
  27. OpenAPIV3Schema: SchemaPropsToJSONProps(&schema, openapiSpec, true),
  28. }
  29. }
  30. return definitions
  31. }
  32. // GetCustomResourceValidation returns the validation definition for a CRD name
  33. func GetCustomResourceValidation(name string, fn func(ref common.ReferenceCallback) map[string]common.OpenAPIDefinition) *extensionsobj.CustomResourceValidation {
  34. openapiSpec := fn(OpenAPIRefCallBack)
  35. fixKnownTypes(openapiSpec)
  36. schema := openapiSpec[name].Schema
  37. crv := &extensionsobj.CustomResourceValidation{
  38. OpenAPIV3Schema: SchemaPropsToJSONProps(&schema, openapiSpec, true),
  39. }
  40. crv.OpenAPIV3Schema.Description = ""
  41. crv.OpenAPIV3Schema.Required = nil
  42. return crv
  43. }
  44. // ref: https://github.com/kubernetes/kubernetes/issues/62329
  45. func fixKnownTypes(openapiSpec map[string]common.OpenAPIDefinition) {
  46. openapiSpec["k8s.io/apimachinery/pkg/util/intstr.IntOrString"] = common.OpenAPIDefinition{
  47. Schema: spec.Schema{
  48. SchemaProps: spec.SchemaProps{
  49. AnyOf: []spec.Schema{
  50. {
  51. SchemaProps: spec.SchemaProps{
  52. Type: []string{"string"},
  53. },
  54. },
  55. {
  56. SchemaProps: spec.SchemaProps{
  57. Type: []string{"integer"},
  58. },
  59. },
  60. },
  61. },
  62. },
  63. }
  64. }