设为首页 收藏本站
查看: 1757|回复: 0

[经验分享] openstack nova 源码分析2之nova

[复制链接]

尚未签到

发表于 2018-6-2 14:41:30 | 显示全部楼层 |阅读模式
  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  

  •         &quot;&quot;&quot;
  •         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=&quot;nova-compute&quot;
  3、设置topic的名字:也就是把 binary的nova-去掉。
  topic = binary.rpartition('nova-')[2]
  topic=&quot;compute&quot;
  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)

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-508178-1-1.html 上篇帖子: openstack nova 源码下载 下篇帖子: openstack nova 源码分析3
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表