| 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));
});
} |
最终实现按网络分组显示的效果.