刚开始debug ambari-server的时候,不少逻辑都是第一次接触。其中有不少知识点仍是记录一下的好,作个备忘。这些知识点对于自定义api的开发仍是颇有做用的。
解答:java
ambari 2.6
编辑key_properties.json,将当前资源类型与含有id的value相映射。apache
举例:json
<!--more-->segmentfault
ambari 2.7
路径:org/apache/ambari/server/controller/internal/RackResourceProvider.javaapi
public static final String RACK_ID_PROPERTY_ID = PropertyHelper.getPropertyId("rack", "rack_id"); public static final String RACK_NAME_PROPERTY_ID = PropertyHelper.getPropertyId("rack", "rack_name"); public static final String RACK_HEIGHT_PROPERTY_ID = PropertyHelper.getPropertyId("rack", "rack_height"); public static final String RACK_TYPE_PROPERTY_ID = PropertyHelper.getPropertyId("rack", "rack_type"); public static final String RACK_LOCATION_PROPERTY_ID = PropertyHelper.getPropertyId("rack", "rack_location"); public static final String RACK_DESCRIPTION_PROPERTY_ID = PropertyHelper.getPropertyId("rack", "rack_description"); private static Map<Resource.Type, String> keyPropertyIds = ImmutableMap.<Resource.Type, String>builder() .put(Resource.Type.RepositoryVersion, RACK_NAME_PROPERTY_ID) .put(Resource.Type.Rack, RACK_ID_PROPERTY_ID) .put(Resource.Type.User, RACK_HEIGHT_PROPERTY_ID) .put(Resource.Type.Member, RACK_TYPE_PROPERTY_ID) .put(Resource.Type.Task, RACK_LOCATION_PROPERTY_ID) .put(Resource.Type.Auditlog, RACK_DESCRIPTION_PROPERTY_ID) .build();
QueryImpl.createRequest()方法内的requestedProperties属性与XXXResourceProvider()的keyPropertyIds有关ide
和rack/rack_name=rack1
这样赋值有关。ui
QueryImpl.createPredicate() ==> QueryImpl.createInternalPredicate() ==> ClusterControllerImpl.getSchema() ==> QueryImpl.createInternalPredicate() ==> spa
907~914行,setPredicates() 做用就是keyPropertyIds的type与RackHostResourceProvider相比较,相同的就是predicate。debug
entry.getValue() 这个值会和Rackhost的value值相比较,并返回boolean值。若是为true,则合并。3d
Predicate 可能会有多条匹配,这样多条的entry.getValue()会与对应的Rackhost的value值比较,返回true或false。若是有一个不对应,则两个Resource.Type的数据不合并,这里被坑过,特此记录。
注:RackResourceProvider和RackHostResourceProvider的keyPropertyIds只能保证rack_name字段的key一致。
pridicate会在子数据的判断上(是否合并数据)起做用。
获取的是资源类型=>value 、、 好比: Rack ==> null
这时候就应该考虑一下 将target文件删掉,或直接mvn clean
,从新生成这个文件了,多是编译后的一些class文件没有被替换。
在RackResourceDefinition.getSubResourceDefinitions()里面注册要展现其余resource的类型,调用xxxResourceDefinition.getPluralName(),最后就可使用fields=rack_hosts来调取数据。
org/apache/ambari/server/api/resources/RackResourceDefinition.java
org/apache/ambari/server/api/resources/RackHostResourceDefinition.java
xxxService.java是api的入口,通过一系列流程操做,进入到xxxResourceProvider.java,里面有getResources()
、createResources()
、deleteResources()
、updateResources()
方法,这些方法具体实现是在AmbariManagementController.java里面定义
,在AmbariManagementControllerImpl.java
实现具体的操做。
持续更新中,敬请关注...
好了各位,以上就是这篇文章的所有内容了,能看到这里的人呀,都是 人才。
白嫖很差,创做不易。 各位的支持和承认,就是我创做的最大动力,咱们下篇文章见!
若是本篇博客有任何错误,请批评指教,不胜感激 !