CDH 的python api的一些底层的探索
2018-12-20 本文已影响0人
钙世英雄转世
在做需求的时候发现似乎没有CM的python的重启api于是去看了下,他们自己做的CM的api的工作过程:
1.以cms为例
![](https://img.haomeiwen.com/i15413228/784c562ec96462e6.png)
他的inspect_hosts调用的其实就是一个_cmd,括号里的inspectHosts 看着似乎哪里见到过,翻出官方的api文档
![](https://img.haomeiwen.com/i15413228/94837e4bb3c01486.png)
发现在官方的输入命令的文档里有这行语句,所以这运行的底层机制其实就是一目了然了,其实调用python方法就是官方给你添加了cmd语句,那么是怎么运行的呢?
在cms.py里找不到_cmd这个内部方法,就可以想到,他是继承了父类的这个内部方法
![](https://img.haomeiwen.com/i15413228/bd20d07d5dbbd032.png)
我们查找BaseApiResource这个基类,在types.py里可以找到也可以用查找类的命令找到
我们可以看到BaseApiResource这个类里有这个方法
![](https://img.haomeiwen.com/i15413228/d7c983fd30464d33.png)
ApiCommand是什么呢?
![](https://img.haomeiwen.com/i15413228/efb40abd9e01da8c.png)
那么就可以很清晰的看到为什么会是/cm/commands/inspectHosts了,我们再往下追查
![](https://img.haomeiwen.com/i15413228/7735ca9bf3d390e5.png)
看到了这是更底层的调用
![](https://img.haomeiwen.com/i15413228/541e95076b24271c.png)
到这一步其实就是可以了,但是还可以往下看看这个getattr是干嘛的
![](https://img.haomeiwen.com/i15413228/dd75208f755cdc50.png)
说白了就是 资源.post的一个组合,这里已经写的很清楚了, is equivalent to x.y
而resource_root其实就是在初始化中@param resource_root: API resource object. 资源的一个基类
探索了这些,其实我们就可以对cms的命令进行随意的组合了
2.当然在cms中我们还发现了_put的请求也可以看下
![](https://img.haomeiwen.com/i15413228/f518ca9eb4dd5316.png)
对应的api就是
同样也是基类当中
![](https://img.haomeiwen.com/i15413228/09db7a15ffd76e4b.png)
我们看到调用的还是_call方法,这下更清楚底层的调用模式
相似的还有delete
![](https://img.haomeiwen.com/i15413228/058fae61ce024a69.png)
![](https://img.haomeiwen.com/i15413228/651c53fb1dc125fa.png)
和get
![](https://img.haomeiwen.com/i15413228/a20504bb6fe20112.png)
![](https://img.haomeiwen.com/i15413228/709aaf95a908b17c.png)
![](https://img.haomeiwen.com/i15413228/c4dfdb6c460f6396.png)
附录更新记录
后来发现还是有的,只不过clouderamanager的一些操作在service,这里记下