前言:
當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地址是根據數據庫中的地址池分配
