如何进行openstack核心路由和扩展路由及路由对应的api函数调用流程的分析

14次阅读
没有评论

行业资讯    
服务器    
云计算    
如何进行 openstack 核心路由和扩展路由及路由对应的 api 函数调用流程的分析

本篇文章为大家展示了如何进行 openstack 核心路由和扩展路由及路由对应的 api 函数调用流程的分析,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

文中要讲解的重点是:从 novaclient 层拼接 url 发送,如何映射找到底层 route,以及根据底层的 route 入口,又如何找到要执行代码 api 入口:

1、首先从 novaclient 层开始(创建实例为例):

vim /usr/lib/python2.6/site-packages/novaclient/v1_1/servers.py

如何进行 openstack 核心路由和扩展路由及路由对应的 api 函数调用流程的分析

如何进行 openstack 核心路由和扩展路由及路由对应的 api 函数调用流程的分析

跟踪_boot 方法:

如何进行 openstack 核心路由和扩展路由及路由对应的 api 函数调用流程的分析

继续往下跟踪_create() 方法:

如何进行 openstack 核心路由和扩展路由及路由对应的 api 函数调用流程的分析

根据代码:

_resp, body = self.api.client.post(url, body=body)

可以知道创建实例的 url 为:/server 其中 body 为传给下层的参数,例如虚拟机内存大小,数量等。

其中发送 url 的方式为 POST。接下来第二步就是在已发布的 route 中找到对应此 post 的 url 的路由映射。

2、将 nova 层的 route 全部打印出来:

 vim /usr/lib/python2.6/site-packages/nova/api/openstack/__init__.py

如何进行 openstack 核心路由和扩展路由及路由对应的 api 函数调用流程的分析

找到对应的 url 为 server 的 routes:
 

如何进行 openstack 核心路由和扩展路由及路由对应的 api 函数调用流程的分析
 


 

由之前文章对 wsgi 的 route 映射关系分析可以,对应代码为该 controller 的 create() 方法:详情请自行参考文章:
  wsgi-restful-routes 详解
 

如何进行 openstack 核心路由和扩展路由及路由对应的 api 函数调用流程的分析
 

至此则到达了 nova 模块的底层 create()api 调用。
 


 


 

3、鉴于 openstack 发布路由的有多个种类:核心路由发布,扩展路由发布,接下来对此进行补充详解:

首先对上述步骤中的 routes 与 controller 的关系进行一个总结:

第一步假若找到了对应的路由例如:

如何进行 openstack 核心路由和扩展路由及路由对应的 api 函数调用流程的分析
 

那么接下来该如何找到该路由的发布文件代码呢?

在 openstack 框架中发布 route 的代码有两种:

第一种核心路由发布:(
  其中 Eclipse 截图的上边框显示了对应的文件路径)

如何进行 openstack 核心路由和扩展路由及路由对应的 api 函数调用流程的分析
 

核心路由发布,则自动对应了给路由的 CURD(增删查改)核心操作,即 create、delete、index、show,update。(这些由 route 框架自动生成对应)

注:以本处的 servers 发布为例:create、delete、index、show,update 这五个方法有 routes 框架自动生成映射关系。detail 方法则是自定义方法。因此

假若需要自定义方法时,可参考本处的 detail 方法进行添加。


 

第二种扩展路由发布:

如何进行 openstack 核心路由和扩展路由及路由对应的 api 函数调用流程的分析
 

其中如何在此添加自定义路由请参考文章:
  openstack-wsgi 的 route 中增加 api 流程详解(os-networks)增加
 


 


 

4、当 novaclient 发送的 url 找到对应的 route,接下来 route 会根据 url 的字段,以及 url 发送方式(eg:POST、GET、PUT 等),在对应的

controller 找到对应的方法执行:

以创建虚拟机路由举例说明:
 

POST     /{project_id}/servers
 

根据下图对应关系,此处应该调用 controller 里面的 create() 方法。
 

 
 

假若路由是: GET     /{project_id}/servers/1/my_edit
 

则会调用 controller 里面的 my_edit() 方法。
 

如何进行 openstack 核心路由和扩展路由及路由对应的 api 函数调用流程的分析
 


 

5、接下来的问题就是根据 route 如何找到对应的 controller 类:

第一种核心路由发布的 controller 类对应位置:

如何进行 openstack 核心路由和扩展路由及路由对应的 api 函数调用流程的分析
 

寻找对应的 controller=self.resources[servers], 的 controller 类:

如何进行 openstack 核心路由和扩展路由及路由对应的 api 函数调用流程的分析
 


 


 

第二种扩展路由发布的 controller 类对应位置:

其他 /usr/lib/python2.6/site-packages/nova/api/openstack/compute/contrib/ 目录下的扩展路由 controller 就在自身文件夹。

以 os-networks 为例:

如何进行 openstack 核心路由和扩展路由及路由对应的 api 函数调用流程的分析
 

寻找对应的 NetworkController() 类:

如何进行 openstack 核心路由和扩展路由及路由对应的 api 函数调用流程的分析
 


 


 


 

只要确定了 controller 位置,即可以知道 route 映射过来的 url 将会调用 controller 类里面的哪一个函数。到此路由对应的 api 函数调用流程分析结束。

上述内容就是如何进行 openstack 核心路由和扩展路由及路由对应的 api 函数调用流程的分析,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注丸趣 TV 行业资讯频道。