作为一个服务,Keystone 跟其他模块一样向外提供了 Rest API,以供其他 HTTP 客户端(如 Keystoneclient、POSTMan、Curl)调用。这些 Rest API 调用并不是直接调用底层的 API 来来实现,而是通过路由,转发到底层的 API 去执行并返回结果。只要理解了一个 Rest API 的路由过程,就可以以此类推知道其他 Rest API 是如何路由的。下文我们以用户创建(超级管理员权限)为例说明该过程。
1. 从 PasteDeploy 配置文件确定 API 入口
1 | # etc/keystone-paste.ini |
我们会发现超级管理员 API 的入口在 egg:keystone#admin_service。但这个入口并没有具体指向哪个函数,所以我们需要进一步确定该入口的具体指向。
2. 从 setup.cfg 确定具体服务入口
1 | # setup.cfg |
3. 确定具体的 Controller 类
一旦确定了服务入口,要确定具体的资源 Controller 类是很简单的:
1 | # keystone/version/service.py |
到这一步大家是不是就很熟悉了?关于 Routes 模块如何工作可以参考之前博文 Routes。
4. 定位到 Controller 具体的 API
1 | # keystone/identity/controllers.py |
5. 定位到数据库操作
最终的创建操作要反映到数据库:
1 | # keystone/identity/core.py |
至此,一个完整的 API 调用就算完成了!