虚拟机创建流程中neutron代码分析(一)
前言:
在openstack的学习当中有一说法就是网络占学习时间的百分之七十。这个说法或许有夸大的成分,但不可否认的是openstack中的
网络是及其重要的部分,并且难度也是相当大。试图通过nova创建虚拟机过程中nova和neutron服务交互的过程来学习openstack网络。
写个学习笔记,整理思路。
版本信息:
openstack版本:Newton
linux系统:ubuntu1604-server
简要流程:
nova在创建虚拟机时会向neutron请求ip和mac地址等port信息。 大概的代码流程如下图所示。


详细分析:
_build_and_run_instance():
作用:
nova创建虚拟机与底层libvirt交互的函数。在该函数中请求了各种资源,如镜像,网络,磁盘等。
通过调用_build_resources()函数整体来获得资源的请求。

_build_resources()
作用:
调用_build_networks_for_instance()函数获取port信息。
调用_default_block_device_names()函数获取块设备信息。
获取网络是重点分析的对象。

_build_networks_for_instance()
作用:
判断传入主机信息是否已经分配过ip和mac,如果已经分配过ip和mac就调用get_instance_new_info()函数更新网卡信息。
如果port还没有被分配ip,mac等,则调用_allocate_network()函数获取信息。

_allocate_network()
作用:
1 修改vm的状态为创建中,修改任务状态为网络中
2 采用异步的方式起一个线程去执行_allocate_network_async()函数

_allocate_network_async()
作用:
在一个循环中多次尝试调用_allocate_for_instance()函数去获取网络。

allocate_for_instance()
作用:
初始化一个http连接的对象:neutron = get_client(),通过该对象能够从nova服务端发送restful请求到neutron服务端。
调用_create_ports_for_instance()函数去创建port信息。
补充:
port信息是指一些列网络元素的集合,实际指的是数据库中的一张表。
其中可以看到有项目id,uuid,名称,网络id等其中我们最关心的是 mac_address 和ip_allocation,不用讲太多,这肯定是mac地址和ip地址。

_create_ports_for_instance()
作用:
判断了安全组是否启用,并判断安全组是否配置,如果没有则配置默认的安全组。
调用_create_port_minimal()函数

_create_port_minimal()
作用:
判断主机启动时是否制定了ip地址,如果制定了ip地址则将该ip地址填充进变量port_req_body中,调用port.client的方法
以restful的请求方式去neutron请求port中各变量信息。
到这里为止,nova端的网络请求就到一段落,请求会发送到neutron-server中,neutron会处理接下来的过程。

关于neutron-server中网络部分的处理,见下一篇笔记。
参考:http://blog.csdn.net/gj19890923/article/details/51284296
虚拟机创建流程中neutron代码分析(一)的更多相关文章
- 虚拟机创建流程中neutron代码分析(三)
前言: 当neutron-server创建了port信息,将port信息写入数据库中.流程返回到nova服务端,接着nova创建的流程继续走.在计算节点中neutron-agent同样要完成很多的工作 ...
- 虚拟机创建流程中neutron代码分析(二)
前言: 当nova服务发送了创建port的restful调用信息之后,在neutron服务中有相应的处理函数来处理调用.根据restful的工作原理,是按照 paste.ini文件中配置好的流程去处理 ...
- OpenStack Nova虚拟机创建流程解析
https://yikun.github.io/2017/09/27/OpenStack-Nova%E8%99%9A%E6%8B%9F%E6%9C%BA%E5%88%9B%E5%BB%BA%E6%B5 ...
- 8 云计算系列之Horizon的安装与虚拟机创建流程
preface 在上一章节中,我们可以在无web管理界面上创建并启动虚拟机,虽然可以这么做,但是敲命令太繁琐,所以此时我们可以安装openstack web管理界面,通过web界面的图形化操作open ...
- linux内核中链表代码分析---list.h头文件分析(二)【转】
转自:http://blog.chinaunix.net/uid-30254565-id-5637598.html linux内核中链表代码分析---list.h头文件分析(二) 16年2月28日16 ...
- git 一般的开发流程中的代码管理
一般的开发流程中的代码管理 1. 从版本库中下载代码 git clone ssh://wenbin@192.168.1.3:29418/mustang-web 2. 针对某个feature(比如ins ...
- linux内核中链表代码分析---list.h头文件分析(一)【转】
转自:http://blog.chinaunix.net/uid-30254565-id-5637596.html linux内核中链表代码分析---list.h头文件分析(一) 16年2月27日17 ...
- openstack之虚拟机创建流程分析
这篇博文静静的呆在草稿箱大半年了.假设不是由于某些原因被问到,以及由于忽略它而导致的损失,否则我也不知道什么时候会将它完毕.感谢这段时间经历的挫折,让我知道不足.希望你能给我更大的决心! 本文试图具体 ...
- twemproxy接收流程探索——twemproxy代码分析正编
在这篇文章开始前,大家要做好一个小小的心理准备,由于twemproxy代码是一份优秀的c语言,为此,在twemproxy的代码中会大篇幅使用c指针.但是不论是普通类型的指针还是函数指针,都可以让我们这 ...
随机推荐
- 关于String中的不变模式
不变模式 不变模式就是为了尽可能的去除并行中的同步操作,提高并行程序的性能,可以使用一种不可改变的对象,依靠对象的不变性,可以确保其在没有同步操作的多线程环境中依然始终保持内部状态的一致性和正确性.并 ...
- Ceph编译安装教程
Ceph官方版本目前支持的纠删码很有限,实验室这块希望能够整合我们自主开发的纠删码BRS(Binary Reed–Solomon encoding),所以需要编译Ceph环境.Ceph官方目前推荐的安 ...
- 模块化编程node
众所周知,Node.js 的出现造就了全栈工程师,因为它让 JavaScript 的舞台从浏览器扩大到了服务端 而 Node.js 的强大也得益于它庞大的模块库,所以学习 Node.js 第一步还得从 ...
- Emrips 反质数枚举 javascript实现
今天看到一个kata,提出一个"emirps"的概念:一个质数倒转后得到的是一个不同的质数,这个数叫做"emirps". 例如:13,17是质数,31,71也是 ...
- 51Nod 1289 大鱼吃小鱼 栈模拟 思路
1289 大鱼吃小鱼 栈模拟 思路 题目链接 https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1289 思路: 用栈来模拟 ...
- PHP防XSS 防SQL注入的代码
作为开发人员时刻要记住一句话,永远不要相信任何用户的输入!很多时候我们的网站会因为我们开发人员写的代码不够严谨,而使网站受到攻击,造成不必要的损失!下面介绍一下如何防止SQL注入! 这里提供了一个函数 ...
- ibv_get_device_guid()函数
uint64_t ibv_get_device_guid(struct ibv_device *device); 描述 函数返回RDMA 设备的 GUID(The Global Unique IDen ...
- js内置构造函数属性修改问题
在学习js原型时遇到一个问题,Array,Object等内置构造函数部分属性无法修改,我猜测可能是因为浏览器实现的原因造成的. 1.修改name属性无效. <script type=" ...
- DirectX:在graph自己主动连线中增加自己定义filter(graph中遍历filter)
为客户提供的视频播放的filter的測试程序中,採用正向手动连接的方式(http://blog.csdn.net/mao0514/article/details/40535791).因为不同的视频压缩 ...
- Android-Volley网络通信框架(ImageRequest,ImageLoader,NetWorkImageView)
1.回想 上篇已经学习了,RequestQueue , StringRequest ,JsonObjectRequest 的使用 2.重点 (1)Volley请求图片的三种方式 (2)ImageRe ...