本文为扶艾原创文章,版权所有,禁止转载!
请大家静下心来看源码分析的文章,看完后相信你会有收获的!
本文来自于微信公众号“扶艾”,欢迎大家关注获取更多精彩内容!
我们分析就分析全套的,创建虚拟机的源码分析总共分为三篇文章,我们将会用通俗易懂的语言来描述整个流程。第一篇文章将分析客户端部分的源码,也就是从点击创建虚拟机按钮后到发送http请求这部分的源码;第二篇文章将分析nova api如何接收到http请求的源码;第三篇文章将分析从筛选计算节点到创建虚拟机成功部分的源码。
本篇文章将分析虚拟机从点击创建按钮到发送http请求到nova api的源码分析。
从点击界面的创建虚拟机按钮后,在输入虚拟机的名称选择镜像和网络后那实际上做了什么工作呢?跟着我的思路来走一走!
客户端
这部分主要分析下客户端的源码,这部分源码分在两个地方:
- 界面部分源码:/usr/share/openstack-dashboard/openstack_dashboard/
- nova客户端源码:/usr/lib/python2.7/site-packages/novaclient/
点击创建按钮之后,实际执行了路径1这个文件中class LaunchInstance的handle方法。至于为什么界面点击创建按钮后执行这个,大家可以去看下我们的关于界面二次开发的文章,看完你会对前端界面的源码架构有个清晰的理解。
路径1. /usr/share/openstack-dashboard/openstack_dashboard/dashboards/project/instances/workflows/create_instance.py
部分源码:
from openstack_dashboard import api
...
class LaunchInstance(workflows.Workflow):
...
def handle(self, request, context):
...
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.get('disk_config'),
config_drive=context.get('config_drive'),
scheduler_hints=scheduler_hints)
这里可以看到handle方法在收集了界面输入的相关参数后调用了api.nova.server_create()函数。那么我们继续看下api.nova.server_create()函数。
路径2. /usr/share/openstack-dashboard/openstack_dashboard/api/nova.py
部分源码
from novaclient import client as nova_client
...
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, config_drive=None, meta=None,
scheduler_hints=None, description=None):
...
return Server(get_novaclient_with_instance_desc(request).servers.create(
name.strip(), 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