您的位置:首页 > 运维架构

openstack nova 源码分析2之nova-api,nova-compute

2012-08-15 15:35 459 查看
1,这是nova-api的脚本。目录是在/bin下

#!/usr/bin/env python
#同时开始EC2和OpenStack api在不同的greenthreads。
#它为所有API查询(OpenStack API 或 EC2 API)提供端点,初始化绝大多数部署活动(比如运行实例),

import eventlet
eventlet.monkey_patch()

import os
import sys

possible_topdir = os.path.normpath(os.path.join(os.path.abspath(
sys.argv[0]), os.pardir, os.pardir))
if os.path.exists(os.path.join(possible_topdir, "nova", "__init__.py")):
sys.path.insert(0, possible_topdir)

from nova import flags
from nova import log as logging
from nova import service
from nova import utils

if __name__ == '__main__':
utils.default_flagfile()  #设置flag文件路径.
flags.FLAGS(sys.argv)   #把flag文件中的参数放到args中。
logging.setup()           #设置日志

utils.monkey_patch()
servers = []
for api in flags.FLAGS.enabled_apis:
servers.append(service.WSGIService(api)) #对外提供api服务
service.serve(*servers)#创建并开始服务
service.wait() #等待请求

2,这是nova-compute,主要是对内提供rpc调用

"""Starter script for Nova Compute."""

import eventlet
eventlet.monkey_patch()

import os
import sys

# If ../nova/__init__.py exists, add ../ to Python search path, so that
# it will override what happens to be installed in /usr/(local/)lib/python...
POSSIBLE_TOPDIR = os.path.normpath(os.path.join(os.path.abspath(sys.argv[0]),
os.pardir,
os.pardir))
if os.path.exists(os.path.join(POSSIBLE_TOPDIR, 'nova', '__init__.py')):
sys.path.insert(0, POSSIBLE_TOPDIR)

from nova import flags
from nova import log as logging
from nova import service
from nova import utils
"""
Service.create()

通过查看service.py前面关于类的定义。发现Service是一个类。
那么这种调用应该是属于类然调用。create就是一个类方法。相当于C++中的静态方法。
可以直接通过类名来进行调用。在python里面。与一般的类的方法的区别在于是使用cls做为第一个参数。
而一般的函数是使用self做为第一个参数。
值得注意的时,一般而言,在python里面,调用一个类的实例的函数时。
如果没有初始化过,一般会去自动执行其初始化函数。而对于类函数则没有这个要求。

"""

if __name__ == '__main__':
utils.default_flagfile()  #设置flag文件路径.
flags.FLAGS(sys.argv)   #把flag文件中的参数放到args中。
logging.setup()           #设置日志
utils.monkey_patch()
server = service.Service.create(binary='nova-compute')#对内提供rpc的调用
#设置binary名字。
#binary = os.path.basename(inspect.stack()[-1][1])
#这是因为python可以查看动栈的内容。所以可以得到压入栈中的脚本的名字。
#这时,binary="nova-compute"

service.serve(server)
service.wait()

3,其实我们可以打开nova/service.py看到Service的Create函数,代码如下

def create(cls, host=None, binary=None, topic=None, manager=None,
report_interval=None, periodic_interval=None):
"""Instantiates class and passes back application object.

:param host: defaults to FLAGS.host
:param binary: defaults to basename of executable
:param topic: defaults to bin_name - 'nova-' part
:param manager: defaults to FLAGS.<topic>_manager
:param report_interval: defaults to FLAGS.report_interval
:param periodic_interval: defaults to FLAGS.periodic_interval

"""
if not host:
host = FLAGS.host
if not binary:
binary = os.path.basename(inspect.stack()[-1][1])
if not topic:
topic = binary.rpartition('nova-')[2]
if not manager:
manager = FLAGS.get('%s_manager' % topic, None)
if not report_interval:
report_interval = FLAGS.report_interval
if not periodic_interval:
periodic_interval = FLAGS.periodic_interval
service_obj = cls(host, binary, topic, manager,
report_interval, periodic_interval)

return service_obj

Service.create()

通过查看service.py前面关于类的定义。发现Service是一个类。那么这种调用应该是属于类然调用。create就是一个类方法!值得注意的时,一般而言,在python里面,调用一个类的实例的函数时。如果没有初始化过,一般会去自动执行其初始化函数。而对于类函数则没有这个要求。

1、设置host名字。

host = FLAGS.host

2、设置binary名字。

binary = os.path.basename(inspect.stack()[-1][1])

这是因为python可以查看动栈的内容。所以可以得到压入栈中的脚本的名字。

这时,binary="nova-compute"

3、设置topic的名字:也就是把 binary的nova-去掉。

topic = binary.rpartition('nova-')[2]

topic="compute"

4、设置manager

manager = FLAGS.get('%s_manager' % topic, None)

很明显这里得到的是compute_manager.

由于FLAGS是在flag.py中定义。所以可以在flag.py中得到如下定义;

DEFINE_string('compute_manager', 'nova.compute.manager.ComputeManager',

'Manager for compute')

由此可知compute_manager指的就是nova.compute.manager.ComputeManager.

5、利用构造函数生成一个对象。

service_obj = cls(host, binary, topic, manager,

report_interval, periodic_interval)
本文出自 “LuoZhengWu” 博客,请务必保留此出处http://brucemars.blog.51cto.com/5288106/964201
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: