zoukankan      html  css  js  c++  java
  • nova-compute源码分析

    源码版本:H版

    首先看启动脚本如下:

    /usr/bin/nova-compute

    import sys
    from nova.cmd.compute import main
    if __name__ == "__main__":
      sys.exit(main())

    nova/cmd/compute.py

    def main():
        objects.register_all()
        config.parse_args(sys.argv)
        logging.setup('nova')
        utils.monkey_patch()
    
        """强制使用nova-conductor访问数据库"""
        if not CONF.conductor.use_local:
            block_db_access()
            objects_base.NovaObject.indirection_api = 
                conductor_rpcapi.ConductorAPI()
        """下面的服务启动过程和nova-conductor类似,可以参见:http://www.cnblogs.com/littlebugfish/p/4058054.html"""
        server = service.Service.create(binary='nova-compute',
                                        topic=CONF.compute_topic,
                                        db_allowed=False)
        service.serve(server)
        service.wait()

      由于nova-compute是一个rpc service,所以具体的请求最终将由Manager类来处理。(具体原由可以参考http://www.cnblogs.com/littlebugfish/p/4058054.html所以接下来具体查看ComputeManager,代码如下:

    nova/compute/manager.py

    ComputeManager类:

    def __init__(self, compute_driver=None, *args, **kwargs):
        ...
        self.driver = driver.load_compute_driver(self.virtapi, compute_driver)
        self.use_legacy_block_device_info = 
                         self.driver.need_legacy_block_device_info

      其中最为关键的是加载ComputeDriver对象用于操作管理虚拟机,接着分析如下:

    nova/virt/driver.py

    LibvirtDriver类:

    def load_compute_driver(virtapi, compute_driver=None):
        if not compute_driver:
            compute_driver = CONF.compute_driver
    
        if not compute_driver:
            LOG.error(_("Compute driver option required, but not specified"))
            sys.exit(1)
    
        LOG.info(_("Loading compute driver '%s'") % compute_driver)
        try:
            driver = importutils.import_object_ns('nova.virt',
                                                  compute_driver,
                                                  virtapi)
            return utils.check_isinstance(driver, ComputeDriver)
        except ImportError:
            LOG.exception(_("Unable to load the virtualization driver"))
            sys.exit(1)

      这里在配置文件中已经指明如下信息:

    #compute_driver=libvirt.LibvirtDriver
    compute_driver=libvirt.LibvirtDriver

      所以会创建底层虚拟化管理器LibvirtDriver对象,实际上ComputeManager最终都会将处理请求转交给LibvirtDriver去执行!

    参考文档:

    http://bingotree.cn/?p=289#more-289

  • 相关阅读:
    java ,js获取web工程路径
    js 无刷新分页代码
    js 获取时间对象代码
    jquery 文本框失去焦点显示提示信息&&单击置空文本框
    CodeForces
    nth_element() O(n)复杂度求第k+1小元素
    CodeForces
    HDU
    杜教BM
    J
  • 原文地址:https://www.cnblogs.com/littlebugfish/p/4065868.html
Copyright © 2011-2022 走看看