前言:

在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代码分析(一)的更多相关文章

  1. 虚拟机创建流程中neutron代码分析(三)

    前言: 当neutron-server创建了port信息,将port信息写入数据库中.流程返回到nova服务端,接着nova创建的流程继续走.在计算节点中neutron-agent同样要完成很多的工作 ...

  2. 虚拟机创建流程中neutron代码分析(二)

    前言: 当nova服务发送了创建port的restful调用信息之后,在neutron服务中有相应的处理函数来处理调用.根据restful的工作原理,是按照 paste.ini文件中配置好的流程去处理 ...

  3. 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 ...

  4. 8 云计算系列之Horizon的安装与虚拟机创建流程

    preface 在上一章节中,我们可以在无web管理界面上创建并启动虚拟机,虽然可以这么做,但是敲命令太繁琐,所以此时我们可以安装openstack web管理界面,通过web界面的图形化操作open ...

  5. linux内核中链表代码分析---list.h头文件分析(二)【转】

    转自:http://blog.chinaunix.net/uid-30254565-id-5637598.html linux内核中链表代码分析---list.h头文件分析(二) 16年2月28日16 ...

  6. git 一般的开发流程中的代码管理

    一般的开发流程中的代码管理 1. 从版本库中下载代码 git clone ssh://wenbin@192.168.1.3:29418/mustang-web 2. 针对某个feature(比如ins ...

  7. linux内核中链表代码分析---list.h头文件分析(一)【转】

    转自:http://blog.chinaunix.net/uid-30254565-id-5637596.html linux内核中链表代码分析---list.h头文件分析(一) 16年2月27日17 ...

  8. openstack之虚拟机创建流程分析

    这篇博文静静的呆在草稿箱大半年了.假设不是由于某些原因被问到,以及由于忽略它而导致的损失,否则我也不知道什么时候会将它完毕.感谢这段时间经历的挫折,让我知道不足.希望你能给我更大的决心! 本文试图具体 ...

  9. twemproxy接收流程探索——twemproxy代码分析正编

    在这篇文章开始前,大家要做好一个小小的心理准备,由于twemproxy代码是一份优秀的c语言,为此,在twemproxy的代码中会大篇幅使用c指针.但是不论是普通类型的指针还是函数指针,都可以让我们这 ...

随机推荐

  1. Redis 高可用集群

    Redis 高可用集群 Redis 的集群主从模型是一种高可用的集群架构.本章主要内容有:高可用集群的搭建,Jedis连接集群,新增集群节点,删除集群节点,其他配置补充说明. 高可用集群搭建 集群(c ...

  2. [LeetCode] N皇后问题

    LeetCode上面关于N皇后有两道题目:51 N-Queens:https://leetcode.com/problems/n-queens/description/ 52 N-Queens II: ...

  3. poj 3070 && nyoj 148 矩阵快速幂

    poj 3070 && nyoj 148 矩阵快速幂 题目链接 poj: http://poj.org/problem?id=3070 nyoj: http://acm.nyist.n ...

  4. Nginx负载均衡使用ip

    upstream test1{ server 192.168.1.213; server 192.168.1.37; } server { listen 80; # default backlog=2 ...

  5. mysql读写分离的操作动作依据(读写分离基本依据)

    读的操作: 1.select 2.show 3.explain explain显示了MySQL如何使用索引来处理select语句以及连接表.可以帮助选择更好的索引和写出更优化的查询语句. 4.desc ...

  6. 网页设计——4.html基本标签链接,图片,表格

    今天主要认识一个有趣的html标签 1.超链接标签a 基本结构:<a href="url" >内容 </a> url就是网页地址. 但直接用这种超链接,会自 ...

  7. mac ox下android 通过battery-historian进行电量分析

    简单介绍下如何用battery-historian进行电量分析,因为battery-hostorian是基于go语言的框架,所以需要安装go 1.安装go 2.配置go环境变量到.bash_profi ...

  8. QWT与QT Designer

    QWT是一套非常不错的开发库,它能结合QT开发,做出非常好的曲线,刻度,表盘等效果来.  qwt的下载以及动态链接库的编译等这里就不做介绍了.在源码目录下可以找到designer目录,其中有插件的源码 ...

  9. SQL-Oracle游标

    游标提供了一种从集合性质的结果集中提供出单条记录的手段.初始时指向首记录. 游标的种类 静态游标.REF游标 静态游标:能够理解为一个数据快照,打开游标后的结果集是数据库表中数据的备份,数据不会对表的 ...

  10. The literal of int xxxxx is out of range

    有时候我们定义了long型的变量,当我们给该变量赋值过长的整数时,系统依旧会提示长度超过范围,解决的方法例如以下: long timeShow = 1437565243495L; 我们须要在整形变量的 ...