虚拟机创建流程中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指针.但是不论是普通类型的指针还是函数指针,都可以让我们这 ...
随机推荐
- 安卓自定义控件(五)触控基础MotionEvent
之前去面试,人家说,我这个事件拦截机制写得太少了,还有一个MotionEvent没写,这个确实也很重要,后来我考虑了一下,决定将这篇文章放到自己定义控件里. 先简单再提一下事件分发,事件分发和拦截主要 ...
- 【JDK1.8】JDK1.8集合源码阅读——TreeMap(二)
一.前言 在前一篇博客中,我们对TreeMap的继承关系进行了分析,在这一篇里,我们将分析TreeMap的数据结构,深入理解它的排序能力是如何实现的.这一节要有一定的数据结构基础,在阅读下面的之前,推 ...
- ideal中如何添加几个不同的项目在同一个idea页面显示(同一个窗口显示多个工程)
今天,我遇到了一个问题,就是同事给了我一些项目,我下载了之后,项目有点多,然后想把这些项目都放到一个里面,所以我就采取了添加module的方式进行添加,首先先看一下我们的四个项目, 我们就想实现在一个 ...
- Foundation框架中日期的操作
#import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { NSDate *date1=[NSD ...
- jquery 循环数组输出显示在html页面
jquery 没有双向数据绑定,但是很多需求确实需要我们从后台接收到数组或者对象循环显示在前台页面上,这时我们可以用字符串拼接,元素添加的方法去实现 js部分如下: $(function(){ var ...
- webMagic+RabbitMQ+ES爬取京东建材数据
本次爬虫所要爬取的数据为京东建材数据,在爬取京东的过程中,发现京东并没有做反爬虫动作,所以爬取的过程还是比较顺利的. 为什么要用WebMagic: WebMagic作为一款轻量级的Java爬虫框架,可 ...
- c# textbox的滚动条总是指向最底端
当我第一次添加滚动条时候,我发现滚动条总是跑向上方,经过研究 解决方案如下: this.textBox1.Focus(); 获取焦点 this.textBox1.Select(this.textBox ...
- mvc/mvvm小小的总结
mvc/mvvm 阮大神博客 mvc 分为三层,其实M层是数据模型层,它是真正的后端数据在前端js中的一个映射模型,他们的关系是:数据模型层和视图层有映射关系,model改变,view展示也会更改,当 ...
- 免费靠谱的 Let’s Encrypt 免费 https 证书申请全过程
申请 Let’s Encrypt证书的原因: 现在阿里云等都有免费的 https 证书,为什么还要申请这个呢(估计也是因为阿里云这些有免费证书的原因,所以 Let’s Encrypt 知道的人其实并不 ...
- vue-cli 安装失败Failed to download repo vuejs-templates/webapck-simple: Response code 404 (Not Found)
新学习vue的萌新们经常会遇到各种各样的坑.例如上面这个报错.这个一般是命令行面板写错单词导致. 正确:vue init webpack-simple .(注意"."点,指当前目录 ...