Keystone的程序结构也是采用openstack通常所用的manager,driver方式,这中方式的一个好处是driver可以被灵活的替换,通过配置的方式动态替换。Keystone 的实现方式同其他openstack项目不太一样的是,他使用了了一个python语言的特性
def__getattr__(self, name):
"""Forward calls to theunderlying driver."""
# NOTE(termie): context is the firstargument, we're going to strip
# that for now, in the futurewe'll probably do some
# logging and whatnot in thisclass
f = getattr(self.driver, name)
@functools.wraps(f)
def _wrapper(context, *args, **kw):
return f(*args, **kw)
setattr(self, name, _wrapper)
return _wrapper
让driver中的方法直接融入进manager类。在keystone中,验证数据的存储方式都有很多种,有sql数据库形式,kvs形式(Dict在内存中存储)等,一种driver就是对应一种存储形式。
简单介绍一下各个模块的功能,auth实现通过插件的方式实现验证功能,Keystone/auth/plugins目录下password.py,token.py实现了密码和token两个验证方法,你也可以通过继承AuthMethodHandler类实现自己的验证方法,作为插件插入验证链中。Catalog主要实现如构造Catalog等相关功能,实现endpoints的注册,提供endpoints的发现机制。对应于每个服务(如:identity,volume,image,compute等)都会有一个对应的endpoints,如对应compute服务的endpoints为如下格式
{"adminurl":"http://192.168.128.8:8774/v2/$(tenant_id)s","internalurl":"http://192.168.128.8:8774/v2/$(tenant_id)s", "publicurl":"http://192.168.128.8:8774/v2/$(tenant_id)s"}
。policy提供了基于规则的验证引擎和验证管理接口。Token提供对于Token的生成删除等相关功能。Trust提供级联授权的相关功能,感兴趣的朋友可以看下这个文档https://github.com/openstack/identity-api/blob/master/openstack-identity-api/src/markdown/identity-api-v3-os-trust-ext.md。
实际的openstack的项目,对于keystone的应用是通过WSGImiddleware 这种可插拔的方式来实现的,具体就是通过paste 配置实现keystone验证功能的filter或app。以nova对于keystone的使用为例,nova实际是加了authtoken这个filter,authtoken的实际是在keystone的client api (python-keystoneclient-master)keystoneclient/middleware/auth_token.py文件中实现的,其中filter_factory,app_factory调用AuthProtocol类来具体实现相关功能。(注:这里对于WSGI,和paste,以及openstack对其的实现的方式不作具体讲解了)。
Keystone V3 版本的api改动比较大,v3 api现在还没有完全实现,这里有一个v3api的文档https://github.com/openstack/identity-api/blob/master/openstack-identity-api/src/markdown/identity-api-v3.md。