代码位置:k8s.io/apimachinery/pkg/runtime

Object

Overview

Schema - 图1

Encoder/Decoder

Schema - 图2

Scheme

Overview

Schema - 图3

关键方法

New

  1. func (s *Scheme) New(kind schema.GroupVersionKind) (Object, error) {
  2. if t, exists := s.gvkToType[kind]; exists {
  3. return reflect.New(t).Interface().(Object), nil
  4. }
  5. if t, exists := s.unversionedKinds[kind.Kind]; exists {
  6. return reflect.New(t).Interface().(Object), nil
  7. }
  8. return nil, NewNotRegisteredErrForKind(s.schemeName, kind)
  9. }

ObjectKinds

  1. func (s *Scheme) ObjectKinds(obj Object) ([]schema.GroupVersionKind, bool, error) {
  2. // Unstructured objects are always considered to have their declared GVK
  3. if _, ok := obj.(Unstructured); ok {
  4. // we require that the GVK be populated in order to recognize the object
  5. gvk := obj.GetObjectKind().GroupVersionKind()
  6. if len(gvk.Kind) == 0 {
  7. return nil, false, NewMissingKindErr("unstructured object has no kind")
  8. }
  9. if len(gvk.Version) == 0 {
  10. return nil, false, NewMissingVersionErr("unstructured object has no version")
  11. }
  12. return []schema.GroupVersionKind{gvk}, false, nil
  13. }
  14. v, err := conversion.EnforcePtr(obj)
  15. if err != nil {
  16. return nil, false, err
  17. }
  18. t := v.Type()
  19. gvks, ok := s.typeToGVK[t]
  20. if !ok {
  21. return nil, false, NewNotRegisteredErrForType(s.schemeName, t)
  22. }
  23. _, unversionedType := s.unversionedTypes[t]
  24. return gvks, unversionedType, nil
  25. }

Converter

Overview

Schema - 图4

ConversionFuncs

结构定义

  1. type ConversionFuncs struct {
  2. fns map[typePair]reflect.Value
  3. untyped map[typePair]ConversionFunc
  4. }

Add

  1. func (c ConversionFuncs) Add(fns ...interface{}) error {
  2. for _, fn := range fns {
  3. fv := reflect.ValueOf(fn)
  4. ft := fv.Type()
  5. if err := verifyConversionFunctionSignature(ft); err != nil {
  6. return err
  7. }
  8. c.fns[typePair{ft.In(0).Elem(), ft.In(1).Elem()}] = fv
  9. }
  10. return nil
  11. }

AddUntyped

  1. func (c ConversionFuncs) AddUntyped(a, b interface{}, fn ConversionFunc) error {
  2. tA, tB := reflect.TypeOf(a), reflect.TypeOf(b)
  3. if tA.Kind() != reflect.Ptr {
  4. return fmt.Errorf("the type %T must be a pointer to register as an untyped conversion", a)
  5. }
  6. if tB.Kind() != reflect.Ptr {
  7. return fmt.Errorf("the type %T must be a pointer to register as an untyped conversion", b)
  8. }
  9. c.untyped[typePair{tA, tB}] = fn
  10. return nil
  11. }