1.
要?jiǎng)?chuàng)建share专肪,可以直接在命令行執(zhí)行這個(gè)manila create nfs 10 --name $share1 --share-network-id $share-network-id
2.
接受請求的是manila-api進(jìn)程,它的入口在/bin/manila-api.py幻枉,啟動(dòng)一個(gè)api-paste應(yīng)用,并且指定的配置是osapi_share
3.
看api-paste.ini的osapi_share按价,正常邏輯走v1接口折晦,會(huì)直接起manila.api.v1.router:APIRouter.factory
4.
這就是標(biāo)準(zhǔn)的OpenStack wsgi應(yīng)用了,可以直接看/manila/v1/router.py看一下具體的路由
5.
share和shares的API都會(huì)用/manila/shares.py的ShareController述召,如果是POST請求就調(diào)action函數(shù)朱转,最終會(huì)調(diào)create(代碼沒有找到原因蟹地?)
6.
/manila/shares.py的ShareController.create()實(shí)現(xiàn)了創(chuàng)建的邏輯,從body中獲取size藤为、proto(協(xié)議)等怪与,如果有snapshot_id就檢查一下保證share_network一致
7.
然后調(diào)用share_api.create(),這個(gè)share_api是通過配置文件的配置項(xiàng)share_api_class指定的缅疟,一般就只有一個(gè)manila.share.api.API
8.
API的create()先檢查如果使用snapshot時(shí)的限制分别,還檢查和預(yù)分配quota,然后直接把manila instance寫到數(shù)據(jù)庫
9.
然后是通過scheduler_rpcapi.create_share()異步創(chuàng)建share的nova instance和cinder instance
10.
scheduler的代碼在/manila/scheduler/rpcapi.py存淫,然后給mq發(fā)創(chuàng)建share的消息耘斩,注意這里是scheduler的客戶端也就是還在manila-api進(jìn)程內(nèi)調(diào)用
11.
scheduler也是標(biāo)準(zhǔn)的OpenStack service應(yīng)用,監(jiān)聽mq發(fā)送了函數(shù)名為create_share的請求桅咆,然后調(diào)用driver的函數(shù)括授,這個(gè)driver是通過配置項(xiàng)scheduler_driver指定的,一般就是manila.scheduler.filter_scheduler.FilterScheduler
12.
這個(gè)scheduler就是執(zhí)行下filter操作岩饼,返回符合條件的host列表荚虚,把host等參數(shù)傳進(jìn)去又調(diào)share的rpc請求,這時(shí)候可以指定那臺(tái)host來接受消息
13.
往mq發(fā)函數(shù)名create_share后籍茧,應(yīng)該由manila-share來除了版述,這也是標(biāo)準(zhǔn)的OpenStack service,只監(jiān)聽mq寞冯,不對(duì)外提供API
14.
首先是/manila/share/manager.py的create_share響應(yīng)這個(gè)消息渴析,它在初始化是會(huì)讀配置項(xiàng)share_driver,我們使用的是nova加cinder的generic driver
15.
這里判斷如果給了snapshot_id就查他的parent_share_server_id吮龄,否這就調(diào)一下_provide_share_server_for_share()來創(chuàng)建或復(fù)用share server
16.
選擇driver后在/manila/share/drivers/generic.py俭茧,會(huì)直接創(chuàng)建volume、attach上去螟蝙、格式化恢恼、mount上去
17.
在attach的時(shí)候會(huì)調(diào)compute_api,這個(gè)是從配置項(xiàng)compute_api_class讀出來的胰默,一般都是manila.compute.nova.API场斑,這里是外面?zhèn)魅雗ova instance直接attach的
18.
具體在那一臺(tái)nova instance掛volumn是在傳入?yún)?shù)share_server['backend_details']['instance_id']指定的漓踢,原來generic有個(gè)變量service_instance_manager可以管理nova instance和網(wǎng)絡(luò),