Contents [hide] |
---|
需求
獲取主機列表的時候,希望能夠對主機列表能分組顯示,比如網路,一組網路段希望在一起顯示
調研
openstack的nova list介面提供如:
1
|
nova list --fields networks |
但是,這個是novaclient提供的,而不是在nova server提供的。所以,我們在實現的時候,需要對nova list返回的資料進行自解析排序
排序的辦法
由於nova list返回的資料結構及其複雜,而該資料也會因為我們建立虛擬機器選擇不同而變化,所以我們的原則是儘量不從新定義該介面的資料結構,因為如果重新定義結構,可能有我們未知的key和value。 所以我們這裡採用python的map的update方式,增加一條。增加一個ip_addr,然後在形如[{"ip_addr":"172.17.39.3"},{},{}]的資料結構中對ip_addr進行json排序。
解決程式碼
python 端
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
def handler(self): httpclient = HTTPClient() #獲取所有的計算節點 headers = { "X-Auth-Project-Id" :self.tenant_name, "User-Agent" : "python-novaclient" , "Accept" : "application/json" , "X-Auth-Token" :self.token_id, } method = "GET" url = setting.hyper_vm_url + "/" + self.tenant_id + "/servers/detail?all_tenants=1" try: response = httpclient.fetch(url,method=method, headers = headers) except Exception, e: return { "code" :e.code} #{"hypervisors": [{"id": 1, "hypervisor_hostname": "node-7.domain.tld"}]} body = eval (response.body.replace( "null" , "None" )).get( "servers" ) servers = {} for b in body: print "*" *50 ip_keys = b[ "addresses" ].keys() try: for ip_key in ip_keys: for address_ip in b[ "addresses" ][ip_key]: if address_ip[ "OS-EXT-IPS:type" ] == "fixed" : print address_ip[ "addr" ] b.update({ "ip_addr" :address_ip[ "addr" ]}) raise ValueError except: continue all_servers = { "servers" :body} return all_servers |
json 前端:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
function groupby_network(){ $.ajax({ url: "/api" , type : "POST" , data: "type=instance_list_with_network" , success: function (t){ debugger; var json_list = sortByKey(t.servers, "ip_addr" ); instance_list_handler({ "servers" :json_list}); } }) } function sortByKey(array, key) { return array. sort ( function (a, b) { var x = a[key]; var y = b[key]; return ((x < y) ? -1 : ((x > y) ? 1 : 0)); }); } |
最終實現按網路分組顯示的效果.