博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
OpenStack 界面开发中的排序问题
阅读量:6969 次
发布时间:2019-06-27

本文共 1954 字,大约阅读时间需要 6 分钟。

Contents []

需求

获取主机列表的时候,希望能够对主机列表能分组显示,比如网络,一组网络段希望在一起显示

调研

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));
                
});    
}

最终实现按网络分组显示的效果.

转载于:https://www.cnblogs.com/CLTANG/p/4332657.html

你可能感兴趣的文章
26、ASP.NET MVC入门到精通——后台管理区域及分离、Js压缩、css、jquery扩展
查看>>
Python标准库:内置函数repr(object)
查看>>
【SpringMVC】SpringMVC系列14之SpringMVC国际化
查看>>
Codeforces Beta Round #1 B. Spreadsheets 模拟
查看>>
辛星深入分析vim的自己主动补全功能以及vim的映射
查看>>
ADCD 1.9 ZOS 配置 CTCI-W32 TCPIP 网络
查看>>
ASP.NET MVC之如何看待内置配置来提高性能优化(四)
查看>>
IOS-NSRunLoop
查看>>
Centos6.5更新e1000网卡驱动
查看>>
jz2440: linux/arch/arm/下面的plat-和mach-
查看>>
Linux中文件描述符fd和文件指针flip的理解
查看>>
Btrace是一个实时监控工具
查看>>
Download file using libcurl in C/C++
查看>>
电Call记录统计查询sql
查看>>
JS面试题-算法台阶问题
查看>>
[转] c# 的传递参数值传递与传递引用的区别,ref与out区别
查看>>
iOS开发UI篇—在UItableview中实现加载更多功能
查看>>
Java计算文件的SHA码和MD5码
查看>>
Tomcat7基于Redis的Session共享实战一
查看>>
Linux下使用ps命令来查看Oracle相关的进程
查看>>