虚拟机创建流程中neutron代码分析(二)
前言:
当nova服务发送了创建port的restful调用信息之后,在neutron服务中有相应的处理函数来处理调用。根据restful的工作原理,是按照
paste.ini文件中配置好的流程去处理该条调用。本节从neutron代码中的create_port()函数开始说起。
简要流程:
下面是调用的流程图。


详细代码:
以上是简要流程图,下面是具体的代码分析。
create_port()
功能:
- 调用create_port_db()函数产生port数据。
 - 更新安全组
 - 绑定port
 

_create_port_db()
功能:
- 获取dhcp配置
 - 调用create_port_db()函数
 - 转化port_db为字典数据形式
 

create_port_db()
功能:
- nova传入的port信息
 - 生成port的uuid
 - 获取租户并判断是否合法
 - 构造port数据字典
 - 判断是否制定mac地址,指定了mac则用该mac创建port,没有则先生成再创建port
 - 创建port数据结构
 - create_db_port_obj函数中生成mac地址
 - allocate_ips_for_port_and_store函数中生成ip地址填充port
 


----------------------------------------------------------------------mac地址创建分析开始---------------------------------------------------------------
create_db_port_obj()
功能:
- 判断mac地址是否为空
 - mac地址不为空,判断mac地址是否在使用当中
 - mac地址为空则调用generate_mac()函数生成mac
 

generate_mac()
功能:
- 返回get_random_mac()函数
 - get_random_mac()函数生成mac地址。
 
mac地址生成分析:
首先读取配置文件中的mac地址,前六位都是固定的。然后生成后六位,使用python的random函数生成随机数。最后将数据组装起来。
形成一个完成mac地址。

----------------------------------------------------------------------mac地址创建分析结束---------------------------------------------------------------
----------------------------------------------------------------------ip地址创建分析开始------------------------------------------------------------------
allocate_ips_for_port()
功能:
- 调用函数allocate_ips_for_port函数分配ip
 - 将所有分配的ip地址写入到neutron数据ipallocations表中。
 

allocate_ips_for_port()
功能:
- 判断用户是否指定了ip地址
 - 如果指定ip地址,调用-test_fixed_ips_for_port()函数验证其合法性
 - 如果没有指定,则调用ip地址管理驱动ipam_allocate_ips()函数分配ip地址
 

关于ipam地址管理,里面有一些有意思的知识,看以查看这篇博文。
http://blog.csdn.net/u013553406/article/details/51700198
ipam_allocate_ips()
功能:
- 加载ipam框架,工厂方法等。
 - 调用ipam_driver的allocate()函数产生ip地址
 

allocate()
功能:
调用generate_ip()函数生成ip地址。

generate_ip()
功能:
该函数是真正生成ip地址的函数。原理是从neutron数据库中的ip可用表中选择出多个ip地址,将ip地址添加到变量ip_allocations中,
然后经过一些列的数据转化,从所有候选的ip地址中选择第一个ip地址做为最总生成的ip。,然后将ip地址返回。

----------------------------------------------------------------------ip地址创建分析结束------------------------------------------------------------------
如下图是neutron数据库中有关ip地址的数据表,其中分为neutron-server管理的ipallocaion*和ipam插件管理的ipamallocation*。

每创建一个网络,都会在neutron-server中生成一条相关ip数据表。如下的子网在数据库中分别记录。VM虚机是选择了哪一个子网,在生成ip时就从该子网的数据库中分配ip地址。



总结:
以上是分析了在neutron-server中创建port里生成mac和ip地址的过程,简单总结
- mac地址是根据配置文件和随机数函数生成
 - ip地址是根据数据库中的地址池分配
 
虚拟机创建流程中neutron代码分析(二)的更多相关文章
- 虚拟机创建流程中neutron代码分析(三)
		
前言: 当neutron-server创建了port信息,将port信息写入数据库中.流程返回到nova服务端,接着nova创建的流程继续走.在计算节点中neutron-agent同样要完成很多的工作 ...
 - 虚拟机创建流程中neutron代码分析(一)
		
前言: 在openstack的学习当中有一说法就是网络占学习时间的百分之七十.这个说法或许有夸大的成分,但不可否认的是openstack中的 网络是及其重要的部分,并且难度也是相当大.试图通过nova ...
 - linux内核中链表代码分析---list.h头文件分析(二)【转】
		
转自:http://blog.chinaunix.net/uid-30254565-id-5637598.html linux内核中链表代码分析---list.h头文件分析(二) 16年2月28日16 ...
 - 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 ...
 - Linux内核启动代码分析二之开发板相关驱动程序加载分析
		
Linux内核启动代码分析二之开发板相关驱动程序加载分析 1 从linux开始启动的函数start_kernel开始分析,该函数位于linux-2.6.22/init/main.c start_ke ...
 - Android4.0图库Gallery2代码分析(二) 数据管理和数据加载
		
Android4.0图库Gallery2代码分析(二) 数据管理和数据加载 2012-09-07 11:19 8152人阅读 评论(12) 收藏 举报 代码分析android相册优化工作 Androi ...
 - 8  云计算系列之Horizon的安装与虚拟机创建流程
		
preface 在上一章节中,我们可以在无web管理界面上创建并启动虚拟机,虽然可以这么做,但是敲命令太繁琐,所以此时我们可以安装openstack web管理界面,通过web界面的图形化操作open ...
 - linux内核中链表代码分析---list.h头文件分析(一)【转】
		
转自:http://blog.chinaunix.net/uid-30254565-id-5637596.html linux内核中链表代码分析---list.h头文件分析(一) 16年2月27日17 ...
 - git 一般的开发流程中的代码管理
		
一般的开发流程中的代码管理 1. 从版本库中下载代码 git clone ssh://wenbin@192.168.1.3:29418/mustang-web 2. 针对某个feature(比如ins ...
 
随机推荐
- 异步任务--celery发送邮件
			
安装两个python包: pip install celery==3.1.25 pip install django-celery==3.1.17 在配置文件settings.py中做如下配置: a) ...
 - cas单点登录如何获取更多信息
			
现在有个新的系统(SpringMVC+Spring+Mybatis),我为它添加了一个单点登录功能.只是在本地客户端的web.xml文件里,添加了以下配置 <!-- 用于单点退出,该过滤器用于实 ...
 - Java基础-数组(06)
			
数组是存储多个变量(元素)的东西(容器),这多个变量的数据类型要一致 数组概念 数组是存储同一种数据类型多个元素的容器.数组既可以存储基本数据类型,也可以存储引用数据类型. 数组的定义格式 格式1:数 ...
 - LeetCode 566. Reshape the Matrix (重塑矩阵)
			
In MATLAB, there is a very useful function called 'reshape', which can reshape a matrix into a new o ...
 - MYSQL 子查询返回多列显示
			
因工作需要,目前研究出一种mysql 技能,与大家分享一下. 需求:关联查询另一个大表数据的某些(一个以上)字段 方案:因关联查询的表数据太大.多表查询影响效率,单个子查询又有些多余.所以采用多列拼接 ...
 - 一个fork短码的扩展版本
			
原本代码: 链接 int skip = !!fork() + 2*(!!fork()); for (uint32_t i=skip;i!=INT_MAX;i+=4) { } 这个是多进程加速循环的代码 ...
 - 电脑键盘上的F键有什么用 电脑F键功能讲解
			
接触电脑这么多年了,F1到F12这几个键你真的会用吗?电脑键盘上的F键有什么用?你了解过吗?这里带来电脑F键功能讲解,一起来看看. F1:帮助 在程序里或者资源管理器界面,按F1会弹出帮助按钮. F2 ...
 - 动态加载js,css(项目中需要的)
			
最近做的一个项目需要加入百度统计,大家都知道百度统计在页面引用就是一坨js,实现方法很简单引用到页面就ok了. 那么问题来了,虽然我不知道百度统计的原理是啥,我的测试服引用了百度统计,百度统计账号里面 ...
 - C++ primer第五版随笔--2015年1月6日
			
记录自己看这本书时的一些内容. 一.引用(reference) 引用为对象起了另外一个名字.例如: int ival=1024: int &relVal1=ival;//对,注意尽量不要用这方 ...
 - Intellij导入子项目时,maven列表子项目灰色不可用---解决方法
			
导入子项目的module时,左侧project目录中有一个module图标右下角没有小蓝点,maven管理列表该module为灰色(表明未被管理),尝试几次后终于找到解决方案. 贴一张调好过后的图 第 ...