OpenStack 介面開發中的排序問題

CL.TANG發表於2016-10-18
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));
                });    
}

最終實現按網路分組顯示的效果.

相關文章