zoukankan      html  css  js  c++  java
  • OpenStack 界面开发中的排序问题

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

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

  • 相关阅读:
    storyboard文件的认识
    设置程序启动时加载的storyboard
    IBAction和IBOutlet
    listview
    JDK下载地址
    [置顶] Docker学习总结(2)——Docker实战之入门以及Dockerfile(二)
    [置顶] Docker学习总结(1)——Docker实战之入门以及Dockerfile(一)
    [置顶] Docker学习总结(1)——Docker实战之入门以及Dockerfile(一)
    XML学习总结(2)——XML简单介绍
    XML学习总结(2)——XML简单介绍
  • 原文地址:https://www.cnblogs.com/CLTANG/p/4332657.html
Copyright © 2011-2022 走看看