虛擬機創建流程中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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM