通过上一篇我们知道了keystone的调试入口,现在我们就跟踪下去,看看在服务启动起来的时候,openstack到底做了一些什么事。首先说明,因为我采用手动apt安装的方式,所以openstack代码均在/usr/lib/python2.7/dist-packages/下,没有特殊说明,我所说的目录都是在这个相对目录下。
进入/keystone/server/wsgi.py,可以找到两个initialize函数:
def initialize_admin_application():
return initialize_application(name='admin',
config_files=_get_config_files())
def initialize_public_application():
return initialize_application(name='main',
config_files=_get_config_files())
可以看到,两个函数最终都会调用initialize_application函数,只是name参数传进去的名字不同。那么在相同脚本中找到initialize_application函数
def initialize_application(name,
post_log_configured_function=lambda: None,
config_files=None):
#possible_topdir指向/usr/lib/python2.7/dist-packages
possible_topdir = os.path.normpath(os.path.join(
os.path.abspath(__file__),
os.pardir,
os.pardir,
os.pardir))
#dev_conf='/usr/lib/python2.7/dist-packages/etc/keystone.conf'
dev_conf = os.path.join(possible_topdir,
'etc',
'keystone.conf')
if not config_files:
config_files = None
if os.path.exists(dev_conf):
config_files = [dev_conf]
common.configure(config_files=config_files)
# Log the options used when starting if we're in debug mode...
if CONF.debug:
CONF.log_opt_values(log.getLogger(CONF.prog), log.DEBUG)
post_log_configured_function()
def loadapp():
return keystone_service.loadapp(
'config:%s' % find_paste_config(), name)
_unused, application = common.setup_backends(
startup_application_fn=loadapp)
# setup OSprofiler notifier and enable the profiling if that is configured
# in Keystone configuration file.
profiler.setup(name)
return application
我们先根据其各个调用的名字判断,这个模块应该大致做了四件事,首先获取一些目录,这里很简单,我就直接说了possible_topdir就是我上面所说的安装目录/usr/lib/python2.7/dist-packages/,然后dev_conf目录下不存在keystone.conf文件,所以config_files是None。然后剩下的三件事应该是配置文件,设置后端(即加载application),根据配置文件启动profile。
以一张图来说明initialize_application函数的主要工作:
总的来说,initialize_application就做了四件事,下篇,我们将追踪conf,看看它做了一些什么。