RESTMapper解读(二)-管理DefaultRESTMapper-v1.5.2
生成DefaultRESTMapper入口
上次介绍了DefaultRESTMapper的具体实现,本次将简要分析代码何处生成了DefaultRESTMapper。生成DefaultRESTMapper的入口定义在/pkg/api/mapper.go:
|
|
NewDefaultRESTMapperFromScheme()函数依据传入的defaultGroupVersions和interfacesFunc参数生成mapper,然后把在Scheme中defaultGroupVersions下的资源注册到mapper中。这里的Scheme即api.Scheme,全部的类都会注册到api.Scheme中。所以可以依据defaultGroupVersions来区别DefaultRESTMapper。
v1的DefaultRESTMapper
现在来看下v1的DefaultRESTMapper。在所有的/install/install.go文件中,都会生成groupMeta,并向registered.DefaultAPIRegistrationManager注册。这个groupMeta中包含一个DefaultRESTMapper。
来看/pkg/api/install/install.go中enableVersions()函数。其中传入的参数externalVersions就是var availableVersions = []unversioned.GroupVersion{v1.SchemeGroupVersion}
,即v1。
|
|
所以,groupMeta中的RESTMapper是通过newRESTMapper()生成的。newRESTMapper()定义在/pkg/api/install/install.go中:
|
|
可以看到newRESTMapper()调用了api.NewDefaultRESTMapper()来生成mapper。api.NewDefaultRESTMapper()定义在/pkg/api/mapper.go中:
|
|
这下明了了,NewDefaultRESTMapper()调用了入口函数NewDefaultRESTMapperFromScheme()。
/apis下的DefaultRESTMapper
这里是指放在/pkg/apis下面的GroupVersion。在apis下面的GroupVersion,采用了apimachinery机制来管理包和版本的信息。感觉v1也可以用apimachinery机制来管理,毕竟都要注册到registered.DefaultAPIRegistrationManager中。
先来看/pkg/apis/apps/install/install.go中的init()函数:
|
|
再来看/pkg/apimachinery/announced/group_factory.go中的RegisterAndEnable()函数:
|
|
接着看Enable()函数:
|
|
生成Mapper的语句为:groupMeta.RESTMapper = gmf.newRESTMapper(scheme, externalVersions, groupMeta)
,所以来看gmf的newRESTMapper()方法:
|
|
可以发现,DefaultRESTMapper的生成入口函数出现了。当然,这里仅以RESTMapper作为主线进行分析,详细的apimachinery机制以后会介绍。
总结
在总结中,梳理下DefaultRESTMapper在系统中的位置。在系统中,有一个DefaultAPIRegistrationManager管理着系统中所有GroupVersion的信息,这些信息由groupMeta承载,而groupMeta中就有DefaultRESTMapper。所以v1和/apis中的GroupVersion都会生成自己DefaultRESTMapper,不同的是/apis中的GroupVersion把一切交由apimachinery机制来。
当然,现在只需知道有这些概念即可。