conv.go 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. package crd
  2. import (
  3. "fmt"
  4. apiextinternal "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions"
  5. apiext "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
  6. apiextv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1"
  7. "k8s.io/apimachinery/pkg/runtime"
  8. "k8s.io/apimachinery/pkg/runtime/schema"
  9. )
  10. var (
  11. conversionScheme = runtime.NewScheme()
  12. )
  13. func init() {
  14. if err := apiextinternal.AddToScheme(conversionScheme); err != nil {
  15. panic("must be able to add internal apiextensions to the CRD conversion Scheme")
  16. }
  17. if err := apiext.AddToScheme(conversionScheme); err != nil {
  18. panic("must be able to add apiextensions/v1 to the CRD conversion Scheme")
  19. }
  20. }
  21. // AsVersion converts a CRD from the canonical internal form (currently v1) to some external form.
  22. func AsVersion(original apiext.CustomResourceDefinition, gv schema.GroupVersion) (runtime.Object, error) {
  23. // TODO: Do we need to keep maintaining this conversion function
  24. // post 1.22 when only CRDv1 is served by the apiserver?
  25. if gv == apiextv1beta1.SchemeGroupVersion {
  26. return nil, fmt.Errorf("apiVersion %q is not supported", gv.String())
  27. }
  28. // We can use the internal versions an existing conversions from kubernetes, since they're not in k/k itself.
  29. // This punts the problem of conversion down the road for a future maintainer (or future instance of @directxman12)
  30. // when we have to support older versions that get removed, or when API machinery decides to yell at us for this
  31. // questionable decision.
  32. intVer, err := conversionScheme.ConvertToVersion(&original, apiextinternal.SchemeGroupVersion)
  33. if err != nil {
  34. return nil, fmt.Errorf("unable to convert to internal CRD version: %w", err)
  35. }
  36. return conversionScheme.ConvertToVersion(intVer, gv)
  37. }