虚拟机创建流程中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指针.但是不论是普通类型的指针还是函数指针,都可以让我们这 ...
随机推荐
- SQL---存储过程---存储过程编写案例
存储过程的创建和调用演示 1.不带参数的存储过程的创建 create procedure PRO_With_No_Param as Begin --begin可省略 select * from sc ...
- Unity3D寻路导航烘焙
在初次进行3D(三维)游戏体验中,避免不了对游戏有生疏的情况,因此在游戏中一般会插入新手指导.自动寻路.导航地图等AI人工智能技术到游戏中,方便玩家更快体验,为了玩家的体验更好,Unity3D寻路导航 ...
- nomad的简易集群
启动服务器 第一步是为服务器创建配置文件.无论是从下载的文件github,或粘贴到一个名为server.hcl: vim server.hcl # Increase log verbosity log ...
- vue2.x利用脚手架快速构建项目并引入bootstrap、jquery
要使用vue-cli脚手架搭建项目,首先需要安装node.js Node.js官网:https://nodejs.org/en/download/ 选择你对应的系统即可下载,下载完成后傻瓜式安装即可. ...
- 深入理解php内核 编写扩展 I:介绍PHP和Zend
内容: 编写扩展I - PHP和Zend起步 原文:http://devzone.zend.com/public/view/tag/Extension Part I: Introduction to ...
- session与cookie的区别与联系
session与cookie是在做项目中很常用的会话技术,session与cookie也是面试中被问到频率最高的问题,有一次我去面试,面试官就怼着我session与cookie一直问(头都大了),下面 ...
- 移动 云MAS 发短信 .net HTTP 请求
本人开发移动云MAS .net Http 请求 代码如下 using Newtonsoft.Json.Linq; using System; using System.Collections.Gen ...
- POJ-1250
#include<iostream> #include<string> #include<list> #include<algorithm> using ...
- Proactor 学习1
Proactor An Object Behavioral Pattern for Demultiplexingand Dispatching Handlers for Asynchronous ...
- 解决 ASP.NET Core MySql varchar 字符串截取(长度 255)
ASP.NET Core 中使用 MySql,如果字段类型为varchar,不管设置多少长度,插入或更新数据的时候,会自动截断(截取 255 长度的字符). 出现问题的原因,就是使用了MySql.Da ...