Monthly Archives: 五月 2014

You are browsing the site archives by month.

之前一直没有好好看过 Neutron API 服务的实现,这几天好好看了一下,对 WSGI、paste.deploy、Webob、routes 熟悉的人估计很快就能看完,可惜我对上面的概念/库没有个熟悉的,所以看了好久才看明白…… 下面是记录,这一部分主要是从 main 开始逐句分析 server 启动的大概过程,主要针对 API,对 RPC 的介绍等下次在看。

安装 Neutron-server 后,其将作为一个服务,启动,和别的服务一样,启动文件在 /etc/init.d,这里挑选部分:

. /etc/rc.d/init.d/functions  
# 执行 /etc/rc.d/init.d/functions,主要是引用里面的函数

prog=neutron
exec="/usr/bin/$prog-server"  # 目标执行文件是/usr/bin/neutron-server
configs=(
   "/usr/share/$prog/$prog-dist.conf" \
   "/etc/$prog/$prog.conf" \
   "/etc/$prog/plugin.ini" \
)  # 配置文件位置
pidfile="/var/run/$prog/$prog.pid"
logfile="/var/log/$prog/server.log"

[ -e /etc/sysconfig/$prog ] && . /etc/sysconfig/$prog
#如果存在 /etc/sysconfig/neutron 则执行

lockfile=/var/lock/subsys/$prog-server

start() {
   [ -x $exec ] || exit 5  # 若 /usr/bin/neutron-server 存在且可执行则运行
   for config in ${configs[@]}; do
       [ -f $config ] || exit 6  # 检验文件是否存在且为普通文件
   done
   echo -n $"Starting $prog: "
   daemon --user neutron --pidfile $pidfile "$exec ${configs[@]/#/--config-file } --log-file $logfile &>/dev/null & echo \$! > $pidfile"
   # 引号部分比较复杂,其实是执行这么一句话:
   # "/usr/bin/neutron-server --config-file /usr/share/neutron/neutron-dist.conf
   # --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/plugin.ini --log-file
   # /var/log/neutron/server.log",并丢弃其输出,然后获得其 pid,把 pid 输出到
   # /var/run/neutron/neutron.pid,去掉执行 /usr/bin/neutron-server 时加的乱七八糟一大堆参数
   # 其实简化相当与这样:
   # daemon --user neutron --pidfile /var/run/neutron/neutron.pid /usr/bin/neutron-server
   # damon 是来自 /etc/rc.d/init.d/functions 用于产生 service 的函数
   retval=$? # 获取 damon 执行后的状态值
   echo
   [ $retval -eq 0 ] && touch $lockfile
   # 执行成功(状态值为0)则更新 /var/lock/subsys/neutron-server 的使用/更新时间为当前
   return $retval
}

ok,这个启动脚本主要还是执行 /usr/bin/neutron-server,我们看下这个脚本的内容:

#!/usr/bin/python
# PBR Generated from 'console_scripts'

import sys

from neutron.server import main

if __name__ == "__main__":
   sys.exit(main())

就是执行了一下 neutron.server.main(),下面我们来看下这个函数(server/__init__.py文件): Read More →