OpenStack源码阅读-创建虚拟机(三)

本文深入探讨了OpenStack创建虚拟机的源码流程,从nova API接收到请求开始,详细解析了参数检查、调度、实例创建及启动过程,涉及compute_api、schedule_and_build_instances、rpc通信等关键步骤,最终在libvirt驱动中调用spawn方法启动虚拟机。
摘要由CSDN通过智能技术生成
本文为扶艾原创文章,版权所有,禁止转载!

请大家静下心来看源码分析的文章,看完后相信你会有收获的!

本文来自于微信公众号“扶艾”,欢迎大家关注获取更多精彩内容!

上一篇文章我们分析了nova api是如何接收请求的,这篇文章我们将分析接收到请求之后创建虚拟机的流程。

nova api请求接收到请求之后,是执行的路径1的create方法。这个整合了创建虚拟机的用到的参数,并作了简单的合法性检测。之后调用了self.compute_api.create()方法。这里省略了很多异常处理,也就是说在后面调用中也会有很多的合法性检测,包括镜像不可用、虚拟机模版未找到、模版配置与镜像不符合等等这些都会抛出异常。

路径1. /usr/lib/python2.7/site-packages/nova/api/openstack/compute/servers.py

部分源码:

from nova import compute

class ServerController():

    def __init__(self):
        self.compute_api = comptute.API()

    def create(self, req, body):
        ...
        #获取创建虚拟机的参数
        server_dict = body['server']
        #获取参数中的虚拟机管理员密码,如果没有则生成一个随机密码
        password = self._get_server_admin_password(server_dict)
        #获取参数中的虚拟机名称,去除名称中的前后空格
        name = common.normalize_name(server_dict['name'])
        ...
        #初始化一个字典用于存放创建虚拟机需要到参数
        create_kwargs = {}
        #将server_dict中的部分参数做合法性检测后赋值给create_kwargs
        self._create_by_func_list(server_dict, create_kwargs, body)
        ...
        try:
            (instances, resv_id) = self.compute_api.create(context,
                            inst_type,
                            image_uuid,
                            display_name=name,
                            display_description=description,
                            availability_zone=availability_zone,
                            forced_host=host, forced_node=node,
                            metadata=server_dict.get('metadata', {}),
                            admin_password=password,
                            requested_networks=requested_networks,
                            check_server_group_quota=True,
                            supports_multiattach=supports_multiattach,
                            **create_kwargs)
        except ...

            raise
        ...省略各种except

路径1中最后调用的是self.compute_api.create()方法,self.compute_api是在ServerController的init方法中赋值的compute.API()。根据下面路径2的源码可以发现,这里的compute.API()为nova.compute.api.API类,所以self.comput_api.create()方法即是nova.compute.api.API.create()

路径2. /usr/lib/python2.7/site-packages/nova/compute/__init__.py

部分源码:
def API():
    #这里根据配置文件的设置来确定是否导入cell_api,默认导入nova.compute.api.API
    class_name = _get_compute_api_class_name()
    return importutils.import_object(class_name, *args, **kwargs) 

在路径3的create方法中检测可用域是否可用,构建了一个筛选计算节点需要满足的基本条件组成的字典,然后调用了self._create_instance()方法

路径3. /usr/lib/python2.7/site-packages/nova/compute/api.py

部分源码
from nova import conductor
class API():

    def __init__():
        self.compute_task_api = conductor.ComputeTaskAPI()

    def create(self, context, instance_type,
               image_h
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值