| 阅读 | 共 517 字,阅读约
Scheme原理分析
Scheme
Scheme的作用:
- 定义了资源序列化和反序列化方法
- 资源类型和版本的对应关系
源码位置:k8s.io/apimachinery/pkg/runtime/scheme.go
核心的字段有:
- gvkToType
- typeToGVK
- defaulterFuncs
1type Scheme struct {
2 // versionMap allows one to figure out the go type of an object with
3 // the given version and name.
4 gvkToType map[schema.GroupVersionKind]reflect.Type
5
6 // typeToGroupVersion allows one to find metadata for a given go object.
7 // The reflect.Type we index by should *not* be a pointer.
8 typeToGVK map[reflect.Type][]schema.GroupVersionKind
9
10 // unversionedTypes are transformed without conversion in ConvertToVersion.
11 unversionedTypes map[reflect.Type]schema.GroupVersionKind
12
13 // unversionedKinds are the names of kinds that can be created in the context of any group
14 // or version
15 // TODO: resolve the status of unversioned types.
16 unversionedKinds map[string]reflect.Type
17
18 // Map from version and resource to the corresponding func to convert
19 // resource field labels in that version to internal version.
20 fieldLabelConversionFuncs map[schema.GroupVersionKind]FieldLabelConversionFunc
21
22 // defaulterFuncs is an array of interfaces to be called with an object to provide defaulting
23 // the provided object must be a pointer.
24 defaulterFuncs map[reflect.Type]func(interface{})
25
26 // converter stores all registered conversion functions. It also has
27 // default converting behavior.
28 converter *conversion.Converter
29
30 // versionPriority is a map of groups to ordered lists of versions for those groups indicating the
31 // default priorities of these versions as registered in the scheme
32 versionPriority map[string][]string
33
34 // observedVersions keeps track of the order we've seen versions during type registration
35 observedVersions []schema.GroupVersion
36
37 // schemeName is the name of this scheme. If you don't specify a name, the stack of the NewScheme caller will be used.
38 // This is useful for error reporting to indicate the origin of the scheme.
39 schemeName string
40}
Scheme的初始化
1runtime.NewScheme()
2
3func NewScheme() *Scheme {
4 s := &Scheme{
5 gvkToType: map[schema.GroupVersionKind]reflect.Type{},
6 typeToGVK: map[reflect.Type][]schema.GroupVersionKind{},
7 unversionedTypes: map[reflect.Type]schema.GroupVersionKind{},
8 unversionedKinds: map[string]reflect.Type{},
9 fieldLabelConversionFuncs: map[schema.GroupVersionKind]FieldLabelConversionFunc{},
10 defaulterFuncs: map[reflect.Type]func(interface{}){},
11 versionPriority: map[string][]string{},
12 schemeName: naming.GetNameFromCallsite(internalPackages...),
13 }
14 s.converter = conversion.NewConverter(s.nameFunc)
15
16 // Enable couple default conversions by default.
17 utilruntime.Must(RegisterEmbeddedConversions(s))
18 utilruntime.Must(RegisterStringConversions(s))
19
20 utilruntime.Must(s.RegisterInputDefaults(&map[string][]string{}, JSONKeyMapper, conversion.AllowDifferentFieldTypeNames|conversion.IgnoreMissingFields))
21 utilruntime.Must(s.RegisterInputDefaults(&url.Values{}, JSONKeyMapper, conversion.AllowDifferentFieldTypeNames|conversion.IgnoreMissingFields))
22 return s
23}
SchemeBuilder
资源向Scheme注册的接口函数
1type SchemeBuilder []func(*Scheme) error
2
3func (sb *SchemeBuilder) AddToScheme(s *Scheme) error {
4 for _, f := range *sb {
5 if err := f(s); err != nil {
6 return err
7 }
8 }
9 return nil
10}