openstack api服务分析

来源:互联网 发布:网络准入软件 编辑:程序博客网 时间:2024/05/22 04:59

先粗略了解几个名词:

  • RESTful API:表征状态迁移,也就是说客户端使用http的基本操作(主要四种:get,post,put,delete对应增删改查)使服务端的资源状态转化。
  • WSGI:web server gateway interface,直译过来web服务网关接口,可以看作一个桥梁,一端连着服务端(wsgi server),一端连接应用程序(wsgi app),桥体(wsgi middleware),也就是说wsgi server 直接处理客户端的http请求,将请求内容转译为应用app能够处理的对象。

api服务是入口,主要把客户端发送http请求映射到具体处理函数上,主要涉及三个模块

  • paste.deploy:构建openstack的wsgi服务,etc下面都会有对应项目的paste的文件,nova为例子,位于/etc/nova/api-paste.ini,paste.deploy构建wsgi服务就是基于这个配置文件
  • webob:对wsgi的请求和响应进行封装(将wsgi与应用app的信息进行处理,使应用端更方便去进行处理,可以放入wsgi模块内理解)
  • routes:定义url到内部函数的映射。

creare.png

解析api-paste.ini(参考资料)

############## OpenStack ############### composite 类型表示把url请求发到对应的application,use表示使用的方式[composite:osapi_compute]use = call:nova.api.openstack.urlmap:urlmap_factory/: oscomputeversions/v1.1: openstack_compute_api_v21_legacy_v2_compatible/v2: openstack_compute_api_v21_legacy_v2_compatible/v2.1: openstack_compute_api_v21......# 使用paste.filter_factory方法过滤[filter:request_id]paste.filter_factory = oslo_middleware:RequestId.factory......# app代表具体的application应用[app:osapi_compute_app_legacy_v2]paste.app_factory = nova.api.openstack.compute:APIRouter.factory......# pipeline由一系列filter组成,末尾是app(多个filter可采用这种方式)[pipeline:oscomputeversions]pipeline = faultwrap oscomputeversionapp
  deploy将以“/v2.1”开始的url将交给名为openstack_compute_api_v2.1处理。但openstack_compute_api_v2.1怎么将/v2.1/project_id/servers/的GET请求交给nova.api.openstack.compute.servers.Controller.index()处理,并且将POST请求交给create()处理呢;怎么将/v2.1/project_id/servers/id的GET请求交给show()处理呢?

       这个就是routes.mappers所提供的功能,它根据path和请求方法,将请求映射到具体的函数上。如在nova中,添加/v2.1/project_id/servers/{list_vm_state, os_vmsum}两个GET请求来分别获取指定VM的状态和VM的总数。可在nova.api.openstack.compute.APIRouter21中添加如下两行,将请求分别交给list_vm_state和os_vmsum两个函数处理并返回结果:

    self.resources['servers'] = servers.create_resource(ext_mgr)        mapper.resource("server", "servers",                        controller=self.resources['servers'],                        collection={'list_vm_state': 'GET',                                    'os_vmsum': 'GET'})

另外一个繁琐的方法,一个一个加:

       mapper.connect("server",                       "/{project_id}/servers/list_vm_state",                       controller=self.resources['servers'],                       action='list_vm_state',                       conditions={'list_vm_state': 'GET'})        mapper.connect("server",                       "/{project_id}/servers/os_vmsum",                       controller=self.resources['servers'],                       action='os_vmsum',                       conditions={'os_vmsum': 'GET'})

现在来捋一下路径。

/v2.1  ->  /v2.1/project_id/servers/list_vm_state

creare(2).png

0 0
原创粉丝点击