基于keystone 项目的Openstack API 学习笔记

时间:2022-02-22 02:57:27

Openstack既然作为一个IaaS层项目,对外是需要提供服务的,那么目前对外提供服务基本基于以下三种方式:

 

1 通过web方式提供服务。

         通过openstack 中的horizon 项目对外提供web图形化操作界面。既可以通过调用API来其他各个组件进行交互,也可以接受用户的操作命令,调用API完成对各个组件的调用。Horizon是python中Django的一个实现。

         扩展:Djongo是一个优秀的开源的由python编写的web应用框架。采用MVC软件设计模式。

 

2 通过命令行提供服务。例如 keystonenova nurtron等命令。

         Openstack中各个组件对外通过类似于python-projectclinet的一系列项目来对外提供命令行界面的服务。例如,python-keystoneclient、 python-novaclint等。

 

3 通过openstack 提供的开发API提供服务。

         Openstack对外通过采用HTTP协议的符合REST规范的API 来对外提供服务。比如Nova对外提供关于计算相关的API。

         扩展:REST规范是一种软件架构风格,中文翻译为:表征性状态转移。这种软件架构非常适合HTTP协议来实现,openstack也采用了这种风格的架构来实现,OpenStack基于HTTP协议和JSON来实现自己的RESTful API。不错的REST设计风格学习了解链接:

         http://www.ruanyifeng.com/blog/2011/09/restful.html

         http://www.ruanyifeng.com/blog/2014/05/restful_api.html

 

Openstack实现RESTful API部署设计思想

         Python目前有两种web应用开发部署方案:基于WSGI和不基于WSGI.Openstack基本是采用WSGI 来进行部署的。Openstack官方推荐是用apache +mod_wsgi 来进行安装部署。

在应用程序开发框架中,openstack早期通过组合 paste + PasteDeploy +routers + webOb来实现WSGI 化、URL路由好请求处理等功能,所以这个开发快将还是需要学习的。

         扩展:WSGI (web服务器网关接口),是一个规范,是web服务器与python应用程序进行交互的桥梁。类似于python专用的WSGI规范有java专用的servlet规范以及CGI 与fastCGI 。

WSGI 就是为了解决 :

1 .     web服务器如何调用python应用程序,并将用户请求传递给应用程序

2      让python应用程序理解用户的具体请求,以及如何将处理结果返回给web服务器端。

WSGI扩展学习链接:

         http://segmentfault.com/a/1190000003069785

 

 Paste + PasteDeploy + routers + WebOb

以下是基于Juno版的keystone项目来展开学习开发流程。

1. WSGI入口文件:

keystone.httpd:keysthone.py文件是基于apache方式部署的WSGI应用程序入口文件。文件中创建了入口需要使用的application对象实例。

2.在keystone.py 入口文件中,通过调用initialize_application方法来载入整个WSGI应用,并且用到了Paste和PasteDeploy库。其中,通过config.find_paste_config()来查找WSGI所需要的配置文件。在loadapp()函数内部通过调用paste.deploy.loadapp()来加载keystone-paste.ini配置文件。

3. 解析paste.ini  配置文件

         Paste.ini是实现WSGI所必须的,文件中包含很多格式为[type:name],如下列出比较核心的section:

         composite:将指定的http请求分发到指定的app

         app:对应具体的application

         filter:过滤器- middleware(基本是WSGI提供的一些中间件)进行验证限速等操作

         pipeline:过滤器集合串

一般流程是:composite àpipelineàfilterà app 处理。

4. 通过[app:xxxx]找到这个函数并获得相应的app去处理。例如通过[app:service_v3]会找到keystone.service:v3_app_factory去获得一个application。

5.Routers模块

当请求交给具体的application来处理的时候,它会根据请求中剩下的具体url,来实现路由。路由模块一般会创建一个Mapper对象,然后调用这个Mapper对象中的Connect()方法来讲具体的path映射到一个自定义类controller的实例上的某个action。


基于keystone 项目的Openstack API 学习笔记