OpenStack 启动云主机代码执行过程

本文是作者作为OpenStack新手学习过程中,对OpenStack云主机启动代码执行流程的梳理。从web端的`create_instance.py`开始,经过novaclient、API调用、conductor、scheduler等多个组件,最终在计算节点上通过`ComputeManager.run_instance()`启动虚拟机。作者希望能与读者共同进步,并寻求更好的OpenStack源码学习方法。
摘要由CSDN通过智能技术生成

先说下哈,本人是OpenStack小白一枚,才开始学习,有太多东西都不懂,源码更是刚开始看,并且到现在为止没找到好的学习源码的方法,如有路过的,麻烦评论里指点下有什么好的方法学习OpenStack源码的方法,比如文档啊、官方的也行,我连官方文档都没怎么看过,目前看代码还停留在死磕的层面哭,求指点啊,先行跪谢啊。

环境:OpenStack-Icehouse, 一台控制节点(nova, glance, keystone, neutron(rabbitmq)),一台计算节点

      在控制节点上,按照http://docs.openstack.org/developer/horizon/quickstart.html 搭了个horizon developer

      基本上可以说是最基本的配置,能启个虚拟机神马的,还是求指点啊。。

然后就开始了苦逼的看代码“旅程”,下面的过程可能有不完整的,因为我也只是顺了一遍代码流程,还有各种不懂,求海涵&指点啊。。

正式开始:

我是从 openstack_dashboard/dashboards/project/instances/workflows/create_instance.py开始看的,先说明下这个文件时负责web端启动云主机的,还有另外一个openstack_dashboard/dashboards/project/databases/workflows/create_instance.py貌似是管命令行启动的

注意:1-16步是在控制节点,17-18步是在计算节点

1. openstack_dashboard/dashboards/project/instances/workflows/create_instance.py

class LaunchInstance(workflows.Workflow):
    slug = "launch_instance"
    name = _("Launch Instance")
    finalize_button_name = _("Launch")
    success_message = _('Launched %(count)s named "%(name)s".')
    failure_message = _('Unable to launch %(count)s named "%(name)s".')
    success_url = "horizon:project:instances:index"
    default_steps = (SelectProjectUser,
                     SetInstanceDetails,
                     SetAccessControls, #第一项详情,对应的action(SetInstanceDetailsAction) 
                     SetNetwork,
                     PostCreationStep,
                     SetAdvanced) #点击启动云主机后,跳出的初始化步骤

-> 执行LaunchInstance的handle函数

    @sensitive_variables('context')
    def handle(self, request, context):
        # 中间的代码省略了
        try:
            api.nova.server_create(request,
                                   context['name'],
                                   image_id,
                                   context['flavor'],
                                   context['keypair_id'],
                                   normalize_newlines(custom_script),
                                   context['security_group_ids'],
                                   block_device_mapping=dev_mapping_1,
                                   block_device_mapping_v2=dev_mapping_2,
                                   nics=nics,
                                   availability_zone=avail_zone,
                                   instance_count=int(context['count']),
                                   admin_pass=context['admin_pass'],
                                   disk_config=context['disk_config'],
                                   product_line=context['product_line']) #调用API,新建开始了
            return True
        except Exception:
            exceptions.handle(request)
            return False

2.  api.nova.server_create()函数将走向->openstack_dashboard/api/nova.py

def server_create(request, name, image, flavor, key_name, user_data,
                  security_groups, block_device_mapping=None,
                  block_device_mapping_v2=None, nics=None,
                  availability_zone=None, instance_count=1, admin_pass=None,
                  disk_config=None, product_line=None):
     # novaclient(request)会返回一个Client(novaclient/v1_1/client.py)对象
     # novaclient(request).servers是ServerManager
     # novaclient(request).servers.create() 就是ServerManager.create
     return Server(novaclient(request).servers.create(
        name, image, flavor, userdata=user_data,
        security_groups=security_groups,
        key_name=key_name, block_device_mapping=block_device_mapping,
        block_device_mapping_v2=block_device_mapping_v2,
        nics=nics, availability_zone=availability_zone,
        min_count=instance_count, admin_pass=admin_pass,
        disk_config=disk_config, product_line=product_line), request) #跳转

3. 调转至->  novaclient/v1_1/servers.py -> ServerManager.create函数

    def create(self, name, image, flavor, meta=None, files=None,
               reservation_id=None, min_count=None,
               max_count=None, security_groups=None, userdata=None,
               key_name=None, availability_zone=None,
               block_device_mapping=None, block_device_mapping_v2=None,
               nics=None, scheduler_hints=None,
               config_drive=None, disk_config=None, **kwargs):
       
        if not min_count:
            min_count = 1
        if not max_count:
            max_count = min_count
        if min_count > max_count:
            min_count = max_count

        boot_args = [name, image, flavor]

        boot_kwargs = dict(
            meta=meta, files=files, userdata=userdata,
            reservation_id=reservation_id, min_count=min_count,
            max_count=max_count, security_groups=security_groups,
            key_name=key_name, availability_zone=availability_zone,
            scheduler_hints=scheduler_hints, config_drive=config_drive,
            disk_config=disk_config, **kwargs)

        if block_device_mapping:
            resource_url = "/os-volumes_boot"
            boot_kwargs['block_device_mapping'] = block_device_mapping
        elif block_device_mapping_v2:
            resource_url = "/os-volumes_boot"
            boot_kwargs['block_device_mapping_v2'] = block_device_mapping_v2
        else:
            resource_url = "/servers"
        if nics:
            boot_kwargs['nics'] = nics

        response_key = "server"
        return self._boot(resource_url, response_key, *boot_args,
                **boot_kwargs) # 调转至ServerManager._boot函数
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值