Преглед изворни кода

实现计算节点汇总,及 vlan 同步功能

James Iter пре 7 година
родитељ
комит
07563b4c08

+ 40 - 1
jimvc/api/host.py

@@ -8,9 +8,10 @@ import requests
 from flask import Blueprint, request, url_for
 import jimit as ji
 
-from jimvc.models import app_config
+from jimvc.models import app_config, Guest
 from jimvc.models import Database as db
 from jimvc.models import Utils, Rules, Host
+from jimvc.models import GuestState
 
 
 __author__ = 'James Iter'
@@ -220,6 +221,44 @@ def r_show():
     hosts_ret = requests.get(url=hosts_url, cookies=request.cookies)
     hosts_ret = json.loads(hosts_ret.content)
 
+    node_id_amd_state_with_guests_count = dict()
+    rows, _ = Guest.get_all()
+
+    for i, host in enumerate(hosts_ret['data']):
+        hosts_ret['data'][i]['analysis'] = {
+            'all_instance': 0,
+            'running_instance': 0,
+            'all_vcpu': 0,
+            'using_vcpu': 0,
+            'all_memory': 0,
+            'using_memory': 0
+        }
+
+    for row in rows:
+        node_id = row['node_id'].__str__()
+        if node_id not in node_id_amd_state_with_guests_count:
+            node_id_amd_state_with_guests_count[node_id] = {
+                'all_instance': 0,
+                'running_instance': 0,
+                'all_vcpu': 0,
+                'using_vcpu': 0,
+                'all_memory': 0,
+                'using_memory': 0
+            }
+
+        node_id_amd_state_with_guests_count[node_id]['all_instance'] += 1
+        node_id_amd_state_with_guests_count[node_id]['all_vcpu'] += row['cpu']
+        node_id_amd_state_with_guests_count[node_id]['all_memory'] += row['memory']
+
+        if row['status'] in [GuestState.running.value, GuestState.booting.value, GuestState.migrating.value]:
+            node_id_amd_state_with_guests_count[node_id]['running_instance'] += 1
+            node_id_amd_state_with_guests_count[node_id]['using_vcpu'] += row['cpu']
+            node_id_amd_state_with_guests_count[node_id]['using_memory'] += row['memory']
+
+    for i, host in enumerate(hosts_ret['data']):
+        if host['node_id'] in node_id_amd_state_with_guests_count:
+            hosts_ret['data'][i]['analysis'] = node_id_amd_state_with_guests_count[host['node_id']]
+
     ret = dict()
     ret['state'] = ji.Common.exchange_state(20000)
 

+ 28 - 0
jimvc/api/vlan.py

@@ -410,3 +410,31 @@ def r_force_delete(ids):
     return vlan_base.delete(ids=ids, ids_rule=Rules.IDS.value, by_field='id')
 
 
+@Utils.dumps2response
+def r_sync():
+    try:
+        ret = dict()
+        ret['state'] = ji.Common.exchange_state(20000)
+
+        vlans, _ = VLAN.get_all()
+
+        # 取全部活着的 hosts
+        available_hosts = Host.get_available_hosts(nonrandom=None)
+
+        for vlan in vlans:
+            for host in available_hosts:
+                message = {
+                    '_object': 'vlan',
+                    'action': 'create',
+                    'uuid': None,
+                    'node_id': host['node_id'],
+                    'vlan_id': vlan['vlan_id'],
+                    'passback_parameters': {'vlan_id': vlan['vlan_id']}
+                }
+
+                Utils.emit_instruction(message=json.dumps(message, ensure_ascii=False))
+
+        return ret
+    except ji.PreviewingError, e:
+        return json.loads(e.message)
+

+ 1 - 0
jimvc/api_route_table.py

@@ -242,6 +242,7 @@ add_rule_api(vlan.blueprints, '/_force/<ids>', api_func='vlan.r_force_delete', m
 add_rule_api(vlan.blueprints, '/<ids>', api_func='vlan.r_get', methods=['GET'])
 add_rule_api(vlan.blueprints, '', api_func='vlan.r_get_by_filter', methods=['GET'])
 add_rule_api(vlan.blueprints, '/_search', api_func='vlan.r_content_search', methods=['GET'])
+add_rule_api(vlan.blueprints, '/_sync', api_func='vlan.r_sync', methods=['PUT'])
 
 # Guest 性能查询
 add_rule_api(guest_performance.blueprint, '/cpu_memory',

+ 19 - 0
jimvc/themes/default/templates/config_show.html

@@ -382,6 +382,22 @@
             });
         }
 
+        function sync_vlans() {
+            $.ajax({
+                url : '/api/vlans/_sync',
+                type : 'PUT',
+                error : function() {
+                    alter_danger('同步 VLAN 状态失败!');
+                },
+                success : function() {
+                    alter_success('同步 VLAN 状态成功!');
+                    setTimeout(function() {
+                        refresh();
+                    }, 1000);
+                }
+            });
+        }
+
         function exchange_ip_pool_for_panel(ip_pool) {
             var activity_checked = '';
             if (ip_pool.activity > 0) {
@@ -1170,6 +1186,9 @@
                         <div class="col-sm-3">
                             <button type="button" class="btn btn-primary" onclick="refresh_guest_state();">刷新虚拟机状态</button>
                         </div>
+                        <div class="col-sm-3">
+                            <button type="button" class="btn btn-primary" onclick="sync_vlans();">同步计算节点 VLAN</button>
+                        </div>
                     </div>
                 </form>
             </div>

+ 3 - 3
jimvc/themes/default/templates/hosts_show.html

@@ -134,15 +134,15 @@
                             <div class="bg-green host-specs">
                                 <div class="row">
                                     <div class="col-md-4">
-                                        <span style="font-size: x-large; color: #97e6b7;">20 </span><span style="font-size: x-large">13</span>
+                                        <span style="font-size: x-large; color: #C9DD22;">{{ item.analysis.all_instance }} </span><span style="font-size: x-large">{{ item.analysis.running_instance }}</span>
                                         <i>虚拟机实例</i>
                                     </div>
                                     <div class="col-md-4">
-                                        <span style="font-size: x-large; color: #97e6b7;">200 </span><span style="font-size: x-large">88</span>
+                                        <span style="font-size: x-large; color: #C9DD22;">{{ item.analysis.all_vcpu }} </span><span style="font-size: x-large">{{ item.analysis.using_vcpu }}</span>
                                         <i>vCPU</i>
                                     </div>
                                     <div class="col-md-4">
-                                        <span style="font-size: x-large; color: #97e6b7;">230 </span><span style="font-size: x-large">196</span>
+                                        <span style="font-size: x-large; color: #C9DD22;">{{ item.analysis.all_memory }} </span><span style="font-size: x-large">{{ item.analysis.using_memory }}</span>
                                         <i>内存</i>
                                     </div>
                                 </div>